<?xml version="1.0" encoding="UTF-8"?>
<!--

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

-->
<ivy-module version="2.0">
  <info organization="${ivy.organization}"
        module="compress-antlib"
        revision="${artifact.version}"
        publication="${publication.datetime}">
    <license name="Apache Software License 2.0"
             url="http://www.apache.org/licenses/LICENSE-2.0"/>
    <ivy-author name="Apache Ant Development Team"
                url="http://ant.apache.org/"/>
    <description homepage="http://ant.apache.org/antlibs/compress/">
      Provides tasks and types that deal with AR, CPIO, TAR
      and ZIP archives as well as BZIP2 and GZIP compressed files based on
      Apache Commons Compress.
    </description>
  </info>
  <dependencies>
    <dependency org="org.apache.ant" name="ant" revision="[1.8.0,)"/>
    <dependency org="org.apache.commons" name="commons-compress"
                revision="[1.1,)"/>
  </dependencies>
</ivy-module>
