<!--
 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.

-->
<assembly>
	<id>bin</id>
	<formats>
		<format>zip</format>
		<format>tar.gz</format>
	</formats>
	<baseDirectory>apache-log4j-${project.version}</baseDirectory>
	<includeSiteDirectory>true</includeSiteDirectory>
	<fileSets>
		<fileSet>
			<includes>
				<include>*.txt</include>
				<include>*.sample</include>
				<include>*.xml</include>
				<include>INSTALL</include>
				<include>KEYS</include>
				<include>LICENSE</include>
				<include>NOTICE</include>
				<include>contribs/**</include>
				<include>examples/**</include>
				<include>src/assembly/**</include>
				<include>src/changes/**</include>
				<include>src/main/**</include>
				<include>src/ntdll/**</include>
				<include>src/performance/**</include>
				<include>src/site/**</include>
				<include>tests/README</include>
				<include>tests/*.xml</include>
				<include>tests/*.sample</include>
				<include>tests/*.bat</include>
				<include>tests/input/**</include>
				<include>tests/resources/**</include>
				<include>tests/src/**</include>
				<include>tests/witness/**</include>
			</includes>
		</fileSet>
	</fileSets>
        <files>
        	<file>
		   <source>target/log4j-${project.version}.jar</source>
                </file>
                <file>
                   <source>target/NTEventLogAppender.dll</source>
                   <fileMode>0755</fileMode>
                </file>
        </files>
</assembly>
