<?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 organisation="org.apache.ant"
        module="${artifact.name}"
        revision="${artifact.version}"
        publication="${artifact.publication.datetime}">
    <license name="Apache Software License 2.0"
             url="http://www.apache.org/licenses/LICENSE-2.0"/>
    <ivyauthor 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, ARJ, CPIO, TAR,
      DUMP, 7Z and ZIP archives as well as BZIP2, PACK200, GZIP, LZMA,
      Snappy, LZ4, Brotli, DEFLATE, DEFLATE64 and XZ compressed files
      based on Apache Commons Compress.
    </description>
  </info>
  <configurations>
    <conf name="default" description="full antlib with all dependencies"/>
    <conf name="test" description="dependencies used for junit testing the antlib" visibility="private" />
  </configurations>
  <publications xmlns:e="urn:ant.apache.org:ivy-extras">
    <artifact name="${artifact.name}" type="pom" ext="pom"/>
    <artifact name="${artifact.name}" type="pom.asc" ext="pom.asc"/>
    <artifact name="${artifact.name}" type="jar" ext="jar"/>
    <artifact name="${artifact.name}" type="jar.asc" ext="jar.asc"/>
    <artifact name="${artifact.name}" type="source" ext="jar"
              e:classifier="sources"/>
    <artifact name="${artifact.name}" type="source.asc" ext="jar.asc"
              e:classifier="sources"/>
    <artifact name="${artifact.name}" type="javadoc" ext="jar"
              e:classifier="javadoc"/>
    <artifact name="${artifact.name}" type="javadoc.asc" ext="jar.asc"
              e:classifier="javadoc"/>
    <artifact name="${artifact.name}" type="ivy" ext="xml"
              e:classifier="ivy"/>
    <artifact name="${artifact.name}" type="ivy.asc" ext="xml.asc"
              e:classifier="ivy"/>
  </publications>
  <dependencies>
    <dependency org="org.apache.commons" name="commons-compress" rev="1.16" conf="default"/>
    <dependency org="org.tukaani" name="xz" rev="1.8" conf="default"/>
    <dependency org="org.brotli" name="dec" rev="0.1.2" conf="default"/>
    <dependency org="junit" name="junit" rev="4.12" conf="test->default"/>
    <dependency org="org.apache.ant" name="ant-antunit" rev="1.3"
                conf="test->default" transitive="false"  />
  </dependencies>
</ivy-module>
