Index: /release-kits/wirk3/ant-scripts/build.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/build.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/build.xml	(revision 15023)
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-build" default="wirk3">
+
+	<import file="init.xml"/>
+	
+	<import file="compile.xml"/>
+	<import file="create-distribution.xml"/>
+	<import file="create-installer.xml"/>
+	<import file="create-launcher.xml"/>
+	<import file="wrap.xml"/>
+
+	<target name="wirk3" depends="init">
+		<echo>Local Basedir: ${basedir.local}</echo>
+		
+		<addressedcall target="compile"/>
+		<addressedcall target="create-distribution"/>
+		<addressedcall target="create-installer"/>
+		<addressedcall target="create-launcher"/>
+		<addressedcall target="wrap"/>
+	</target>
+
+</project>
Index: /release-kits/wirk3/ant-scripts/compile.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/compile.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/compile.xml	(revision 15023)
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-compile" default="compile">
+
+
+	<target name="compile">
+
+		<addressedcall target="checkout-greenstone3" />
+		<addressedcall target="set-version-number-property" />
+		<addressedcall target="dist-prepare-windows" />
+		<addressedcall target="dist-build-windows" />
+		<addressedcall target="prepare-documentation" />
+
+	</target>
+
+
+	<!--
+
+		second level targets
+
+	-->
+
+	<target name="checkout-greenstone3">
+		<if><bool><istrue value="${execute}"/></bool>
+			<svn>
+				<checkout url="${svn.root}/greenstone3/${branch.path}" destPath="greenstone3"/>
+			</svn>
+		</if>
+	</target>
+
+	<target name="set-version-number-property">
+		<if><bool><istrue value="${execute}"/></bool>
+			<rsr file="greenstone3/resources/java/global.properties.in" pattern="(.*)@gsdl3version@(.*)" replacement="$1${version}$2" />
+		</if>
+	</target>
+
+	<target name="dist-prepare-windows">
+		<if><bool><istrue value="${execute}"/></bool>
+			<ant dir="greenstone3" antfile="${wirk3.home}/ant-scripts/operations-on-gs3home.xml" target="prepare-windows"  inheritAll="false"/>
+		</if>	
+	</target>
+	<target name="tweak-configure-scripts">
+		<addressedcall target="mgpp-add-static" />
+		<addressedcall target="mg-add-static" />
+		<addressedcall target="gs2buildextra-add-static" />
+	</target>
+
+	<target name="dist-build-windows">
+		<if><bool><istrue value="${execute}"/></bool>
+			<ant dir="greenstone3" antfile="${wirk3.home}/ant-scripts/operations-on-gs3home.xml" target="build-windows" inheritAll="false"/>
+		</if>
+	</target>
+	
+	<target name="prepare-documentation">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<mkdir dir="greenstone3/gsdl-manuals"/>
+			<svn>
+				<checkout url="${svn.root}/documentation/${branch.path}/manuals" destPath="greenstone3/gsdl-manuals/manuals"/>
+				<checkout url="${svn.root}/documentation/${branch.path}/shared" destPath="greenstone3/gsdl-manuals/shared"/>
+			</svn>
+			<javac srcdir="greenstone3/gsdl-manuals/shared" destdir="greenstone3/gsdl-manuals/shared" debug="on"><include name="*.java"/></javac>
+			<unzip src="greenstone3/gsdl-manuals/shared/fop.zip" dest="greenstone3/gsdl-manuals/shared"/>
+
+			<echo>Define Classpath</echo>
+			<path id="documentation.compile.classpath">
+				<fileset dir="greenstone3/gsdl-manuals">
+					<include name="**/*.jar"/>
+				</fileset>
+				<pathelement path="greenstone3/gsdl-manuals/shared"/>
+				<pathelement path="greenstone3/gsdl-manuals/manuals"/>
+				<pathelement path="greenstone3/gli/classes"/>
+			</path>
+						
+			<echo>Apply XSLT</echo>
+			<java classname="org.apache.xalan.xslt.Process" classpathref="documentation.compile.classpath" fork="true">
+				<jvmarg value="-DGSDLHOME=${basedir}/greenstone" />
+				<arg value="-IN"/><arg file="greenstone3/gli/help/en/help.xml" />
+				<arg value="-XSL"/><arg file="greenstone3/gsdl-manuals/manuals/processing/gen-gli-help-to-manual-chapter.xsl" />
+				<arg value="-OUT"/><arg file="greenstone3/gsdl-manuals/manuals/xml-source/en/help-en.xml" />
+				
+			</java>
+						
+			<echo>Run generate-pdf.bat</echo>
+			<exec dir="${basedir}\greenstone3/gsdl-manuals/manuals" executable="cmd">
+				<arg value="/C" />
+				<arg file="${basedir}/greenstone3/gsdl-manuals/manuals/generate-pdf.bat" />
+				<arg value="u" />
+				<arg value="en" />
+			</exec>
+			
+
+		</if>
+	</target>
+
+	
+
+</project>
Index: /release-kits/wirk3/ant-scripts/create-distribution.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/create-distribution.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/create-distribution.xml	(revision 15023)
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-create-distribution" default="create-distribution">
+
+
+	<target name="create-distribution">
+		<!-- create distribution -->
+		<addressedcall target="export-greenstone3" />
+		<addressedcall target="dist-set-version-number-property" />
+		<addressedcall target="create-distributions-1" />
+		<addressedcall target="create-distributions-2" />
+		<addressedcall target="create-distributions-3" />
+		<addressedcall target="copy-over-build-xml" />
+		<addressedcall target="insert-user-manual"/>
+		<addressedcall target="insert-compiled-binaries"/>
+	</target>
+
+
+
+	<!--
+
+		second level targets
+
+	-->
+	
+	<target name="export-greenstone3">
+		<if><bool><istrue value="${execute}"/></bool>
+			<mkdir dir="distribution"/>
+			<delete dir="distribution/greenstone3"/>
+			<svn>
+				<export srcurl="${svn.root}/greenstone3/${branch.path}" destPath="distribution/greenstone3"/>
+			</svn>
+		</if>
+	</target>
+
+	<target name="dist-set-version-number-property">
+		<if><bool><istrue value="${execute}"/></bool>
+			<rsr file="distribution/greenstone3/resources/java/global.properties.in" pattern="(.*)@gsdl3version@(.*)" replacement="$1${version}$2" />
+		</if>
+	</target>
+
+	<target name="create-distributions-1">
+		<if><bool><istrue value="${execute}"/></bool>
+			<ant antfile="${wirk3.home}/ant-scripts/operations-on-gs3home.xml" dir="distribution/greenstone3" target="create-distribution-1" inheritAll="false">
+				<property name="app.version" value="${version}"/>
+				<property name="branch.path" value="${branch.path}"/>
+			</ant>
+		</if>
+	</target>
+
+	<target name="create-distributions-2">
+		<if><bool><istrue value="${execute}"/></bool>
+			<ant antfile="${wirk3.home}/ant-scripts/operations-on-gs3home.xml" dir="distribution/greenstone3" target="create-distribution-2"  inheritAll="false">
+				<property name="app.version" value="${version}"/>
+				<property name="branch.path" value="${branch.path}"/>
+			</ant>
+		</if>
+	</target>
+
+	<target name="create-distributions-3">
+		<if><bool><istrue value="${execute}"/></bool>
+			<ant antfile="${wirk3.home}/ant-scripts/operations-on-gs3home.xml" dir="distribution/greenstone3" target="create-distribution-3"  inheritall="false">
+				<property name="app.version" value="${version}"/>
+				<property name="branch.path" value="${branch.path}"/>
+			</ant>
+		</if>
+	</target>
+
+	<target name="copy-over-build-xml">
+		<if><bool><istrue value="${execute}"/></bool>
+			<move file="distribution/greenstone3/modified-build.xml" tofile="distribution/greenstone3/build.xml"/>
+		</if>
+	</target>
+
+	<target name="insert-user-manual">
+		<if><bool><istrue value="${execute}"/></bool>
+			<copy file="greenstone3/gsdl-manuals/manuals/build/en/pdf/User_en.pdf" tofile="distribution/greenstone3/docs/manual/gs2_user_en.pdf"/>
+		</if>
+	</target>
+
+	<target name="insert-compiled-binaries">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<delete dir="distribution/greenstone3/lib/jni"/>
+			<copy todir="distribution/greenstone3/lib"><fileset dir="greenstone3/lib/jni"/></copy>
+			
+			<delete dir="distribution/greenstone3/gs2build/bin/windows"/>
+			<copy todir="distribution/greenstone3/gs2build/bin"><fileset dir="greenstone3/gs2build/bin/windows"/></copy>
+						
+			<delete dir="distribution/greenstone3/gs2build/bin/java"/>
+			<copy todir="distribution/greenstone3/gs2build/bin"><fileset dir="greenstone3/gs2build/bin/java"/></copy>
+
+		</if>
+	</target>
+
+
+
+
+</project>
Index: /release-kits/wirk3/ant-scripts/create-installer.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/create-installer.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/create-installer.xml	(revision 15023)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-create-installer" default="create-installer">
+
+	<target name="create-installer">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<echo>Project Path: ${project.path}</echo>
+			<mkdir dir="${basedir}/installer"/>
+			<copy todir="${basedir}/installer" file="${wirk3.home}/installer/antinstall-config.xml"/>
+			<rsr file="${basedir}/installer/antinstall-config.xml" pattern="@version@" replacement="${version}"/>
+
+			<installer file="${basedir}/installer/greenstone-${version}-win32.jar"
+					compress="true"
+					extractType="NonExtractor"
+					installConfig="${basedir}/installer/antinstall-config.xml"
+					buildFile="${project.installer.path}/build.xml"
+					antInstallLib="${ant.installer.home}/lib"
+					antLib="${ant.installer.home}/antlib"
+					validateConfig="true"
+					icons="bluecurve">
+
+				<zipfileset dir="${project.installer.path}/cp" includes="resources/*"/>
+				<zipfileset dir="${wirk3.home}/ant-scripts/tasks/orans"><include name="RegexSearchReplace.class"/></zipfileset>
+
+				<zipfileset dir="${project.path}" includes="*"/>
+				<zipfileset dir="${project.path}/bin" prefix="bin"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/docs" prefix="docs"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/gli" prefix="gli"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/gs2build" prefix="gs2build"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/lib" prefix="lib"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/web" prefix="web"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/packages" prefix="packages"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/resources" prefix="resources"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/winutil" prefix="winutil"><include name="**/*"/></zipfileset>
+				<zipfileset dir="${project.path}/src" prefix="src"><include name="**/*"/></zipfileset>
+			</installer>
+			
+		</if>
+	</target>
+
+</project>
Index: /release-kits/wirk3/ant-scripts/create-launcher.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/create-launcher.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/create-launcher.xml	(revision 15023)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-create-launcher" default="wrap">
+
+	<target name="create-launcher">
+		<addressedcall target="setup-for-launcher-creation"/>
+		<addressedcall target="compile-launcher"/>
+		<addressedcall target="clean-up-after-launcher-creation"/>
+	</target>
+
+
+	<target name="setup-for-launcher-creation">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<mkdir dir="${basedir}/launcher"/>
+			<copy todir="${basedir}/launcher" file="${wirk3.home}/launcher/launcher.xml"/>
+			<!--<rsr pattern="(.*)@version@(.*)" replacement="$1${version}$2" file="${basedir}/launcher/launcher.xml" />-->
+			<rsr pattern="(.*)@basedir@(.*)" replacement="$1${basedir}$2" file="${basedir}/launcher/launcher.xml" />
+			
+		</if>
+	</target>
+
+	<target name="compile-launcher">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<echo>compile the launcher</echo>
+			<!--<exec executable="cmd " dir="${basedir}/launcher/launcher.xml">
+				<arg line="/C ${wirk3.home}/bin/launch4j/launch4j.exe launcher.xml"/>
+			</exec>-->
+
+			<launch4j configFile="${basedir}/launcher/launcher.xml" />
+
+		</if>
+	</target>
+	<target name="clean-up-after-launcher-creation">
+		<if><bool><istrue value="${execute}"/></bool>
+			<delete file="${basedir}/launcher/launcher.xml"/>
+		</if>
+	</target>
+
+
+</project>
Index: /release-kits/wirk3/ant-scripts/init.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/init.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/init.xml	(revision 15023)
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-init">
+
+	<!-- classpath -->
+	<path id="project.classpath">
+		<fileset dir="${wirk3.home}/ant-scripts/tasks">
+			<include name="**/*.jar"/>
+		</fileset>
+		<fileset dir="${wirk3.home}/lib">
+			<include name="*.jar"/>
+		</fileset>
+		
+		<pathelement path="${wirk3.home}/ant-scripts/tasks/orans"/>
+
+		<!-- antinstaller -->
+		<pathelement path="${wirk3.home}/bin/ant-installer/lib/ant-installer-ext.jar"/>
+		
+		<!-- launch4j -->
+		<pathelement path="${wirk3.home}/bin/launch4j/launch4j.jar"/>
+		<pathelement path="${wirk3.home}/bin/launch4j/lib/xstream.jar"/>
+			
+	</path>
+	
+	<!-- create a localised basedir property -->
+	<path id="basedir.path">
+		<pathelement location="${basedir}"/>
+	</path>
+	<property name="basedir.local" refid="basedir.path"/>
+
+	<!-- svn root -->
+	<property name="svn.root" value="http://svn.greenstone.org"/>
+
+	<!-- self defined tasks -->
+	<taskdef name="if" classname="ise.antelope.tasks.IfTask" classpathref="project.classpath"/>
+	<taskdef name="try" classname="ise.antelope.tasks.TryTask" classpathref="project.classpath"/>
+	<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" classpathref="project.classpath"/>
+	<taskdef name="setloglevel" classname="SetLogLevel" classpathref="project.classpath"/>
+	<typedef name="addressedcall" classname="TreeCallTarget" classpathref="project.classpath"/>
+	<typedef name="rsr" classname="RegexSearchReplace" classpathref="project.classpath"/>
+	<taskdef name="installer" classname="org.tp23.antinstaller.taskdefs.Installer" classpathref="project.classpath"/>
+	<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpathref="project.classpath"/>
+	
+	<!-- load in static properties from build.properties -->
+	<property file="build.properties" />
+
+	<!-- project details (for ant-installer) -->
+	<property name="project.name"					value="Greenstone3"/>
+	<property name="project.short.name"			value="greenstone3"/>
+	<property name="project.path"					value="${basedir}/distribution/greenstone3"/>
+	<property name="project.installer.path"	value="${wirk3.home}/installer"/>
+	<property name="project.version"				value="${version}"/>
+	<property name="ant.installer.home"			value="${wirk3.home}/bin/ant-installer"/>
+
+	<!-- somewhere to store temporary text -->
+	<tempfile property="temp.file" destdir="${java.io.tmpdir}" prefix="delete" suffix=".tmp"/>
+
+	<!-- stuff to do before all tasks -->
+	<target name="init">
+
+		<echo level="info">CHECKING PRE-CONDITIONS</echo>
+		<echo level="info"/>
+
+		<!-- version number -->
+		<echo level="info">Version number...</echo>
+		<if>
+			<bool>
+				<not><isset property="version"/></not>
+			</bool>
+
+			<!-- version not set in build.properties, try get from repository -->
+			<setloglevel level="error"/>
+			<try>
+				<get src="${svn.root}/greenstone3/${branch.path}/version.properties" dest="${temp.file}"/>
+				<catch>
+					<echo level="error">Not set in build.properties or repository version.properties</echo>
+					<fail>Version number not set</fail>
+				</catch>
+			</try>
+			<setloglevel level="info"/>
+
+			<property file="${temp.file}"/>
+
+			<if>
+				<bool>
+					<not><isset property="version"/></not>
+				</bool>
+				<echo level="error">version.properties exists, but doesn't set version string</echo>
+				<fail>Version number not set</fail>
+			</if>
+
+			<echo level="info">Taken from repository version.properties</echo>
+
+			<else>
+				<echo level="info">Taken from build.properties</echo>
+			</else>
+
+		</if>
+
+		<echo level="info">Version number: ${version}</echo>
+		<property name="app.version" value="${version}"/>
+		<echo level="info"/>
+
+
+		<!-- check resume from -->
+		<echo level="info">Checking if we are resuming from a given target...</echo>
+		<if>
+			<bool><not><isset property="resume.from"/></not></bool>
+			<echo level="info">No, start from the beginning</echo>
+			<else>
+				<echo level="info">Yes, resuming from ${resume.from}</echo>
+			</else>
+		</if>
+		<echo level="info"/>
+
+		<!-- check resume to -->
+		<echo level="info">Checking if we are resuming up to a given target...</echo>
+		<if>
+			<bool><not><isset property="resume.to"/></not></bool>
+			<echo level="info">No, stop at the end</echo>
+			<else>
+				<echo level="info">Yes, resuming from ${resume.to}</echo>
+			</else>
+		</if>
+		<echo level="info"/>
+
+
+		<!-- check resume mode-->
+		<echo level="info">Determining resume mode...</echo>
+		<if>
+			<bool>
+				<not><isset property="resume.mode"/></not>
+			</bool>
+			<echo level="info">Mode not set, just fall through</echo>
+			<else>
+				<echo level="info">Mode set to ${resume.mode}</echo>
+				<if>
+					<bool>
+						<not><equals arg1="${resume.mode}" arg2="descend"/></not>
+					</bool>
+					<echo level="error">You have not specified a valid resume mode.</echo>
+					<echo level="error">Valid modes are 'descend' and null.</echo>
+					<fail>You have not specified a valid resume mode.</fail>
+				</if>
+			</else>
+		</if>
+		<echo level="info"/>
+
+		<!-- execute target code or just traverse tree -->
+		<echo level="info">Determining execute mode...</echo>
+		<if>
+			<bool>
+				<not><isset property="execute"/></not>
+			</bool>
+			<echo level="info">Execute not set, defaulting to 'true'</echo>
+			<property name="execute" value="true"/>
+			<else>
+				<echo level="info">Execute set to ${execute}</echo>
+				<if>
+					<bool>
+						<and>
+							<not><equals arg1="${execute}" arg2="true"/></not>
+							<not><equals arg1="${execute}" arg2="false"/></not>
+						</and>
+					</bool>
+					<echo level="error">You have not specified a valid value for execute.</echo>
+					<echo level="error">Valid values are 'true' and 'false'.</echo>
+					<fail>You have not specified a valid value for execute.</fail>
+				</if>
+			</else>
+		</if>
+
+		<echo level="info"/>
+
+
+		<!-- check branch.path -->
+		<echo level="info">Determining the branch path...</echo>
+		<if>
+			<bool><equals arg1="trunk" arg2="${version}"/></bool>
+			<property name="branch.path" value="trunk"/>
+		</if>
+
+		<if>
+			<bool><not><isset property="branch.path"/></not></bool>
+			<fail>You have not specified a branch path where code will come from in the repository</fail>
+		</if>
+
+		<echo level="info">Branch Path: ${branch.path}</echo>
+		<echo level="info"/>
+
+		<!-- check branches exist -->
+		<property name="svn.greenstone3" value="${svn.root}/greenstone3/${branch.path}"/>
+		<property name="svn.gsdl" value="${svn.root}/gsdl/${branch.path}"/>
+		<property name="svn.gli" value="${svn.root}/gli/${branch.path}"/>
+		<property name="svn.indexers" value="${svn.root}/indexers/${branch.path}"/>
+		<property name="svn.documentation" value="${svn.root}/documentation/${branch.path}"/>
+
+		<!-- greenstone3 branch -->
+		<echo level="info">Checking that ${svn.greenstone3} exists...</echo>
+
+		<!-- try to put the html index of the location into the temp file -->
+		<setloglevel level="error"/>
+		<try>
+			<get src="${svn.greenstone3}" dest="${temp.file}"/>
+			<catch>
+				<echo level="error">No, it does not exist</echo>
+				<property name="svn.greenstone3.unavailable" value="true"/>
+			</catch>
+		</try>
+		<setloglevel level="info"/>
+		<if>
+			<bool><not><istrue value="${svn.greenstone3.unavailable}"/></not></bool>
+			<echo level="info">Yes, it exists</echo>
+		</if>
+
+		<!-- gsdl branch -->
+		<echo level="info">Checking that ${svn.gsdl} exists...</echo>
+		<setloglevel level="error"/>
+		<try>
+			<get src="${svn.gsdl}" dest="${temp.file}"/>
+			<catch>
+				<echo level="error">No, it does not exist</echo>
+				<property name="svn.gsdl.unavailable" value="true"/>
+			</catch>
+		</try>
+		<setloglevel level="info"/>
+		<if>
+			<bool><not><istrue value="${svn.gsdl.unavailable}"/></not></bool>
+			<echo level="info">Yes, it exists</echo>
+		</if>
+
+
+		<!-- gli branch -->
+		<echo level="info">Checking that ${svn.gli} exists...</echo>
+		<!-- try to put the  html index of the location into the temp file -->
+		<setloglevel level="error"/>
+		<try>
+			<get src="${svn.gli}" dest="${temp.file}"/>
+			<catch>
+				<echo level="error">No, does not exist</echo>
+				<property name="svn.gli.unavailable" value="true"/>
+			</catch>
+		</try>
+		<setloglevel level="info"/>
+		<if>
+			<bool><not><istrue value="${svn.gli.unavailable}"/></not></bool>
+			<echo level="info">Yes, it exists</echo>
+		</if>
+
+
+		<!-- indexers branch -->
+		<echo level="info">Checking that ${svn.indexers} exists...</echo>
+		<!-- try to put the  html index of the location into the temp file -->
+		<setloglevel level="error"/>
+		<try>
+			<get src="${svn.indexers}" dest="${temp.file}"/>
+			<catch>
+				<echo level="error">No, it does not exist</echo>
+				<property name="svn.indexers.unavailable" value="true"/>
+			</catch>
+		</try>
+		<setloglevel level="info"/>
+		<if>
+			<bool><not><istrue value="${svn.indexers.unavailable}"/></not></bool>
+			<echo level="info">Yes, it exists</echo>
+		</if>
+
+		<!-- documentation branch -->
+		<echo level="info">Checking that ${svn.documentation} exists...</echo>
+		<!-- try to put the  html index of the location into the temp file -->
+		<setloglevel level="error"/>
+		<try>
+			<get src="${svn.documentation}" dest="${temp.file}"/>
+			<catch>
+				<echo level="error">No, it does not exist</echo>
+				<property name="svn.documentation.unavailable" value="true"/>
+			</catch>
+		</try>
+		<setloglevel level="info"/>
+		<if>
+			<bool><not><istrue value="${svn.documentation.unavailable}"/></not></bool>
+			<echo level="info">Yes, it exists</echo>
+		</if>
+
+
+		<!-- clean up the temp file -->
+		<setloglevel level="error"/>
+		<delete file="${temp.file}"/>
+		<setloglevel level="info"/>
+
+
+		<!-- fail if some branches were missing -->
+		<if>
+			<bool>
+				<or>
+					<istrue value="${svn.greenstone3.unavailable}"/>
+					<istrue value="${svn.gsdl.unavailable}"/>
+					<istrue value="${svn.gli.unavailable}"/>
+					<istrue value="${svn.indexers.unavailable}"/>
+					<istrue value="${svn.documentation.unavailable}"/>
+				</or>
+			</bool>
+			<fail>Some branches do not exist, or you are unable to access them from where you are. Please review the list above and create any branches that are missing, or run this script from somewhere with access to the repository.</fail>
+			<else>
+				<echo level="info">All exist</echo>
+			</else>
+		</if>
+
+	</target>
+
+</project>
Index: /release-kits/wirk3/ant-scripts/operations-on-gs3home.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/operations-on-gs3home.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/operations-on-gs3home.xml	(revision 15023)
@@ -0,0 +1,268 @@
+<?xml version="1.0"?>
+
+<!-- ====================================================================== 
+     March 2005                                                    
+
+     Greenstone3 build and install script
+                   
+     kjdon                                                                
+     ====================================================================== -->
+
+<project name="opeations-on-gs3home" default="usage">
+  
+	<!-- include standard build file -->
+	<import file="${basedir}/build.xml"/>
+
+	<property name="documented.collections.home" value="/home/nzdl/for-distributions/collect"/>
+	<property name="greenstone3-change-date" value="Tue Feb 20 12:13:42 NZDT 2007"/>
+	<property name="gs2build-change-date" value="Wed Dec 13 10:35:57 NZDT 2006"/>
+
+	<!-- ====================== DISTRIBUTION Targets ========================= -->
+
+	<!-- these two, do we need tomcat and axis for compilation??-->
+	<!-- Create the binaries for windows distribution -->
+	<target name="prepare-windows" depends="init">
+		<antcall target="checkout-gs2build"/>
+		<antcall target="checkout-gli"/>
+		<antcall target="unzip-windows-packages"/>
+		<antcall target="unzip-windows-packages"/>
+		<antcall target="checkout-winbin"/>
+		<antcall target="get-perl-for-windows"/>
+	</target>
+  
+	<target name="build-windows" depends="init">
+		<antcall target="svnupdate-distribution"/>
+		<antcall target="update-winbin"/>
+		<antcall target="get-windows-binaries"/>
+		<antcall target="rename-gs2build-files-windows"/>
+		<antcall target="compile-gs2build"/>
+		<antcall target="compile-packages"/>
+	</target>
+
+	
+	<target name="create-distribution-1" depends="init" description="do all the initial downloading and setting up">
+		
+		<antcall target="checkout-gs2build"/>
+		<antcall target="checkout-gli"/>
+		<delete file="${gli.home}/gli.bat"/>
+		<delete file="${gli.home}/gli.sh"/>
+		<delete file="${gli.home}/gems.bat"/>
+		<delete file="${gli.home}/gems.sh"/>
+		<antcall target="rename-gs2build-files-dist"/>    
+		<delete dir="${gs2build-extra.home}"/>
+
+		<!-- <antcall target="unzip-windows-packages"/> do we need this? -->
+		<antcall target="prepare-tomcat"/>
+		<delete file="${packages.home}/apache-tomcat-5.5.12.zip"/>
+		<delete file="${packages.home}/apache-tomcat-5.5.12-compat.zip"/>
+		<antcall target="prepare-axis"/>
+		<delete file="${packages.home}/axis-bin-1_2_1.zip"/>
+		
+		<!-- delete old axis dir -->
+		<delete dir="${packages.home}/axis"/>
+		<mkdir dir="${web.home}/applet"/>
+		<mkdir dir="${web.home}/logs"/>
+		<antcall target="prepare-ant"/>
+		<delete file="${packages.home}/apache-ant-1.7.0-bin.zip"/>
+		<antcall target="prepare-collections"/>
+
+		<!-- get good XML-Parser - does this work? -->
+		<antcall target="get-xml-parser"/>
+		
+		<!-- documented collections -->
+		<antcall target="get-documented-collections"/>
+
+		<delete file="${basedir}/README-CVS.txt"/>
+		<delete file="${basedir}/TODO.txt"/>
+		
+		<!-- create extra directories necessary the releases -->
+		<mkdir dir="${gs2build.home}/source"/>
+
+		</target>
+
+	<target name="create-distribution-2" description="do all the compilation">
+		<!-- compile the java stuff -->
+		<antcall target="compile-web"/>
+		
+		<!-- we can get this from the main greenstone3 directory
+		<antcall target="compile-packages-and-indexers"/>-->
+		<antcall target="compile-packages-and-indexers-javaonly"/>
+		
+		<antcall target="compile-core"/>
+		<antcall target="compile-gli"/>
+	</target>
+
+	<target name="create-distribution-3" depends="init" description="Do the rearranging of source code etc">
+
+		<!-- put gs2build source code in a tidy place -->
+		<move todir="${gs2build.home}/source/src" failonerror="false"><fileset dir="${gs2build.home}/src" defaultexcludes="no"/></move>
+		<move todir="${gs2build.home}/source/lib" failonerror="false"><fileset dir="${gs2build.home}/lib" defaultexcludes="no"/></move>
+		<move todir="${gs2build.home}/source/packages" failonerror="false"><fileset dir="${gs2build.home}/packages" defaultexcludes="no"/></move>
+		<move todir="${gs2build.home}/source/indexers" failonerror="false"><fileset dir="${gs2build.home}/indexers" defaultexcludes="no"/></move>
+		<move file="${gs2build.home}/win32.mak" tofile="${gs2build.home}/source/win32.mak"/>
+		<move file="${gs2build.home}/setup.bat" tofile="${gs2build.home}/source/setup.bat"/>
+		<move file="${gs2build.home}/WIN32cfg.h" tofile="${gs2build.home}/source/WIN32cfg.h"/>
+
+		<!-- clean up -->
+		<delete><fileset dir="${basedir}" includes="**/.svn"/></delete>
+		<delete><fileset dir="${basedir}" includes="*.sh"/></delete>
+		<delete><fileset dir="${basedir}/gli" includes="*.sh"/></delete>
+		<delete><fileset dir="${basedir}/gs2build" includes="*.sh"/></delete>
+		<delete><fileset dir="${basedir}/bin/script" includes="*.sh"/></delete>
+
+		<delete dir="${basedir}/build"/>
+		<delete dir="${basedir}/lib/jni"/>
+		<delete dir="${basedir}/dist-resources"/>
+		<delete dir="${basedir}/gs2build/source"/>
+
+		<delete file="${basedir}/gli/client-gli.sh"/>
+		<delete file="${basedir}/gli/client-gli.bat"/>
+
+		<delete>
+			<fileset dir="${gs2build.home}">
+				<include name="config*"/>
+				<include name="ac*"/>
+				<include name="install-sh"/>
+				<include name="setup.bash"/>
+				<include name="Makefile.in"/>
+			</fileset>
+		</delete>
+
+		<!-- generate modified build.xml file -->
+		<antcall target="run-xslt-binary"/>
+
+		
+	</target>
+
+	<!-- Supplementary targets -->
+	<target name="svnupdate-distribution" depends="init">
+		<antcall target="svnupdate-packages"/>
+		<antcall target="svnupdate-core"/>
+		<antcall target="svnupdate-gs2build"/>
+		<antcall target="svnupdate-web"/>
+	</target>
+
+	<target name="run-xslt-source" depends="init">
+		<xslt in="${basedir}/build.xml" out="${basedir}/dist-build.xml" style="${basedir}/dist-resources/convert-build-xml-source.xsl"/>
+	</target>
+  
+	<target name="run-xslt-binary" depends="init">
+		<xslt in="${basedir}/build.xml" out="${basedir}/modified-build.xml" style="${wirk3.home}/xsl/convert-build-xml.xsl"/>
+	</target>
+  
+	<target name="rename-gs2build-files-dist" depends="init">
+		<mkdir dir="${gs2build.home}/gs2build-extra/lib"/>
+		<copy file="${gs2build.home}/gs2build-extra/lib.win32.mak" tofile="${gs2build.home}/lib/win32.mak"/>
+		<copy file="${gs2build.home}/gs2build-extra/win32.mak" tofile="${gs2build.home}/win32.mak"/>
+		<copy file="${gs2build.home}/gs2build-extra/setup.bat" tofile="${gs2build.home}/setup.bat"/>
+	</target>   
+
+	<target name="compile-packages-and-indexers-javaonly" depends="init">
+		<echo>Getting Indexer Jars</echo>
+		<!-- install the jar files -->
+		<copy file="${basedir}/../../greenstone3/gs2build/indexers/mg/mg.jar" todir="${lib.jni}"/>
+		<copy file="${basedir}/../../greenstone3/gs2build/indexers/mgpp/mgpp.jar" todir="${lib.jni}"/>
+		<copy file="${basedir}/../../greenstone3/gs2build/indexers/lucene-gs/LuceneWrapper.jar" todir="${web.lib}"/>
+		<!-- javagdbm -->
+		<!-- install the jar file -->
+		<copy file="${basedir}/../../greenstone3/src/packages/javagdbm/javagdbm.jar" todir="${lib.jni}"/>
+	</target>
+
+	<target name="delete-windows-files" depends="init" unless="current.os.iswindows">
+		<delete dir="${basedir}/winutil"/>
+		<delete>
+			<fileset dir="${lib.jni}" includes="*.dll"/>
+		</delete>
+	</target>
+
+	<target name="get-perl-for-windows" depends="init" if="current.os.iswindows">
+		<mkdir dir="${gs2build.home}/bin/windows"/>
+		<get src="http://www.greenstone.org/gs3files/perl-for-windows.zip" dest="${gs2build.home}/bin/windows/perl-for-windows.zip" usetimestamp="true"/>
+		<unzip src="${gs2build.home}/bin/windows/perl-for-windows.zip" dest="${gs2build.home}/bin/windows"/>
+		<delete file="${gs2build.home}/bin/windows/perl-for-windows.zip"/>
+	</target>
+
+	<!-- copy the doc eg colls from /home/nzdl - note we don't include the formatting ones -->
+	<target name="get-documented-collections" depends="init">
+		<property name="collect.home" value="${basedir}/web/sites/localsite/collect"/>
+
+		<!--    <copy todir="${collect.home}/authen-e">
+		  <fileset dir="${documented.collections.home}/authen-e"/>
+		</copy>
+		<copy todir="${collect.home}/bibliog1">
+		  <fileset dir="${documented.collections.home}/bibliog1"/>
+		</copy>
+		<copy todir="${collect.home}/bibliogr">
+		  <fileset dir="${documented.collections.home}/bibliogr"/>
+		</copy>
+		<copy todir="${collect.home}/dls-e">
+		  <fileset dir="${documented.collections.home}/dls-e"/>
+		</copy>
+		<copy todir="${collect.home}/dspace-e">
+		  <fileset dir="${documented.collections.home}/dspace-e"/>
+		</copy>
+		<copy todir="${collect.home}/gsarch-e">
+		  <fileset dir="${documented.collections.home}/gsarch-e"/>
+		</copy>
+		<copy todir="${collect.home}/image-e">
+		  <fileset dir="${documented.collections.home}/image-e"/>
+		</copy>
+		<copy todir="${collect.home}/isis-e">
+		  <fileset dir="${documented.collections.home}/isis-e"/>
+		</copy>
+		<copy todir="${collect.home}/oai-e">
+		  <fileset dir="${documented.collections.home}/oai-e"/>
+		</copy>
+		<copy todir="${collect.home}/pagedimg-e">
+		  <fileset dir="${documented.collections.home}/pagedimg-e"/>
+		</copy>
+		<copy todir="${collect.home}/wrdpdf-e">
+		  <fileset dir="${documented.collections.home}/wrdpdf-e"/>
+		</copy>
+
+		<copy todir="${collect.home}/garish">
+		  <fileset dir="${documented.collections.home}/garish"/>
+		</copy>
+		<copy todir="${collect.home}/marcexam">
+		  <fileset dir="${documented.collections.home}/marcexam"/>
+		</copy>
+		<copy todir="${collect.home}/style-e">
+		  <fileset dir="${documented.collections.home}/style-e"/>
+		</copy>
+		<copy todir="${collect.home}/wiki">
+		  <fileset dir="${documented.collections.home}/wiki"/>
+		</copy> -->
+	</target>
+
+	<target name="get-xml-parser" depends="init">
+		<get src="http://www.greenstone.org/gs3files/XML-Parser.tar.gz" dest="${gs2build.home}/perllib/cpan/XML-Parser.tar.gz" usetimestamp="true"/>
+		<untar src="${gs2build.home}/perllib/cpan/XML-Parser.tar.gz" dest="${gs2build.home}/perllib/cpan/" compression="gzip"/>
+		<delete file="${gs2build.home}/perllib/cpan/XML-Parser.tar.gz"/>
+	</target>
+
+	<!-- new targets to go in distribution build.xml files -->
+
+	<!-- new usage target for binary release -->
+	<target name="usage-for-binary-dist" description="Print a help message">
+		<echo message="  Execute 'ant -projecthelp' for a list of targets."/>
+		<echo message="  Execute 'ant -help' for Ant help."/>
+	</target>
+    
+	<!-- new install target for source distribution -->
+	<target name="install-for-source-dist" depends="init" description="install the source distribution. Includes configuring and compiling">
+		<antcall target="unzip-windows-packages"/>
+		<!-- do the java version dependent stuff -->
+		<antcall target="configure-java-version"/>
+		<antcall target="install-macos-extra"/>
+		<!-- set gsdlhome in setup.bat -->
+		<antcall target="gs2build-edit-setup-bat"/>
+		<antcall target="install-indexer-files"/>
+		<antcall target="configure"/>
+		<antcall target="configure-c++"/>
+		<antcall target="compile"/>
+		<!-- make sure we have execute permission for the .sh files -->
+		<chmod dir="${basedir}" perm="ugo+rx" includes="*.sh"/>
+	</target>
+	
+</project>
+  
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/ChangeLog.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/ChangeLog.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/ChangeLog.txt	(revision 15023)
@@ -0,0 +1,348 @@
+Antelope Change Log
+Version: @buildnum@
+
+3.4.0:
+o updated for Ant 1.7.
+o finally, <import> is fully supported
+o targets are now sorted in edit mode.
+
+3.2.10:
+o fixed Trace so it works more or less correctly.
+o removed use of the Constant Interface Anti-pattern.
+o rearranged packaging of tasks to better organize typdefs.
+
+3.2.9:
+Oct 2005
+o added Hostname, Split, Repeat, FileUtil, and StringUtil tasks.
+o some general cleanup.
+
+3.2.6:
+11 Jun 2005
+o added Grep, Suite, and TestCase Ant tasks.
+o updated antlib.xml and antelope.taskdefs with missing typedefs
+
+3.2.2:
+10 Apr 2005
+o various minor updates.
+o fixed build files, in particular the build-src.xml file so that all the source, images, docs, etc, is actually included.
+
+3.2.0:
+Looks like I missed a few updates to this file...
+23 Dec 2004
+o added ability to call the "implicit" target explicitly.  The implicit target is the anonymous target that Ant uses to hold top-level tasks like <property> and <import>. Previously, the only way to run the implicit target was to run an explicit target, so Antelope was unable to rerun the implicit target for build files that did not have an explicit target. The button labeled "_implicit_" will run the implicit target.  Note that in multi-target mode, the "_implicit_" button does not show, the implicit target will (as usual) be ran before other targets are executed.
+o Updated the launcher so the run.xml file to start Antelope is no longer required. Just "java -jar Antelope.jar" will start Antelope.
+o Fixed several other minor bugs, but exactly what they were escapes me at the moment.
+
+3.1.10:
+29 Aug 2004
+o Fixed error in StopWatchTask that incorrectly showed total time for
+elapsed time. (Thanks to Wolf Schlegel for pointing this out.)
+o I've used 'enum' as a variable name for an Enumeration for years, but now
+Sun has decided that is a key word, so I've replaced all 'enum' with 'en'.
+(Thanks to Dennis Hofs for pointing this out.)
+o Fixed issue #21, silently ignore property files not found when the build
+file is loaded.
+o Fixed issue #22, caret position is restored properly when build file is
+saved.
+o Fixed issue #24, clicking on "Trace" button automatically selects the
+"Output" tab.
+
+
+3.1.9:
+29 July 2004
+o fix for issue #20, imported targets now have buttons.
+
+3.1.8:
+23 May 2004
+o Completed issue #12, added 'tail' to output window in app.
+o Completed issue #9, fixed NPE on trace target with non-existant target in antcall.
+
+3.1.7:
+19 May 2004
+o Completed issue #13, added line number display to app.
+o Completed issue #14, added option to not sort the target buttons alphabetically.
+o Completed issue #15, added support for native look and feel to app.
+o Completed issue #16, added support for wheel mouse in edit window.
+o Completed issue #9, backward compatibility with Ant 1.5.x.
+
+3.1.6:
+5 May 2004
+o Fixed a bug in the run.xml file, it was looking for a non-existant 'lib' directory in the classpath.
+o Fixed a bug that caused the Antelope plugin to delete Ant when the plugin was deleted from jEdit.
+
+
+3.1.5:
+o Fixed a number of bugs that broke backwards compatibility with Ant 1.5.x. Antelope should now work well with Ant 1.5.0 and later. Note that Ant 1.4.x and earlier are no longer supported.
+
+3.1.4:
+o Added ability to assign a jEdit shortcut to rerun the last ran target.
+o Fixed bug in auto-refresh in multiple target mode.
+
+3.1.3:
+12 Apr 2004
+o Fixed the threading for running the default target from a jEdit shortcut.
+
+3.1.2:
+9 Apr 2004
+o Fixed a bug introduced in 3.1.0 that caused a NPE on an fresh install of Antelope as a jEdit plugin. I had added some icons to the button panel, but forgot that the default settings wouldn't be read unless there was a previously opened build file, which isn't the case on a new install.
+o The default target is now shown with a green color text.
+o Running the default target can be added as a short cut in jEdit. There's something a bit weird about how this works, no output is displayed until the target is complete, so it looks like nothing is happening, then all of a sudden the entire output is shown. Coincidentally, this specific feature was requested in e-mail yesterday.
+o Added some new icons to the Edit tree. Private targets have gray target icons, the default target is green, public targets are black target icons. Imported (via the <import> task) are the same colors, except bulls eye on the targets is red.
+
+3.1.0:
+30 Mar 2004
+o added reload button to control panel.
+o added "About" tab to propery dialog.
+o changed text to icons on all buttons in conrol panel.
+o updated build file to make building the docs while disconnected easier.
+
+3.0.7:
+o Changed the preferences again. The custom preferences are now used on all platforms and all jvm versions, but the custom preferences no longer are the system default preferences. This means if you ran version 3.0.6 (and 3.0.6 only), you will loose any stored settings, but all settings from any previous version of Antelope are available and will be use. I never felt comfortable about doing that anyway. The point of implementing the custom preferences was to get around an annoying bug in the Unix/Linux implementation of java.util.prefs. If you are still running with a jvm that has that bug (see bugs 4868444 and 4751177 at java.sun.com) and want to get rid of all the annoying messages, add this to your command line when starting Antelope:
+
+-Djava.util.prefs.PreferencesFactory=ise.library.UserPreferences
+
+This will install Antelope's custom preferences handler as the default system preferences handler.
+
+o Added popup in "Edit" mode to property and loadproperties tasks to allow opening of a file designated by the "file" or "srcfile" attributes, respectively, in the editor.
+
+o Added auto-reload if property files changed. Property files are those files loaded either by the <property> task with a "file" attribute or by the <loadproperties> task. If the property files have changed since the build file was loaded, the build file will be reloaded, which in turn causes the property files to be reloaded. Note that this reload does not depend on the auto-reload option being checked, it happens regardless.
+
+3.0.6:
+24 Mar 2004:
+o More updates to the dependency tree code and the entity includes.
+o Changed the preferences handling (see the entry dated 22 Jan 2004 below) so that the custom preferences factory is only activated on non-Windows platforms with jvm's earlier than version 1.5. This means that your settings may disappear -- they are not gone, just not readable. If you need to continue to use the custom preferences, start Antelope with this setting on the command line:
+-Djava.util.prefs.PreferencesFactory=ise.library.UserPreferencesFactory
+Hopefully this won't change again.
+
+3.0.5:
+22 Mar 2004:
+o Updates to the dependency tree code.
+o Fixed a bug with included xml (using xml entity includes). The targets of included xml would show up as buttons in "Run" mode, but not in the tree in "Edit" mode. The targets are now in the Edit tree, and the dependency tree works with these targets also.
+o Added some nice icons to the edit tree to make it easier to pick out imported targets and projects.
+
+3.0.4:
+21 Mar 2004:
+o Fixed a bunch of compiler warnings about deprecated methods. Several deprecated methods were not fixed as they would break Ant 1.5 compatibility.
+o Adjusted the "Please wait loading Ant" code as it would occasionally hang in jEdit. It still hangs occassionally, it appears to be due to a classloader issue with other plugins loading an xml parser ahead of Ant's parser. Jane might be the culprit.
+o Right click on a target in "Edit" mode will show a popup of the dependency tree for that target. Clicking a target in the dependency tree moves the cursor to that target.
+
+3.0.3:
+15 Mar 2004:
+o showing 'private' targets in italics in all modes modes. Targets are considered 'private' if:
+   1. the target name starts with -
+   2. the target does not have a description
+   3. there is a . anywhere in the target name
+
+3.0.2:
+23 Feb 2004
+o changed default for showing targets to "Show all targets".
+o fixed bug in setting for auto-reload of build file. Now auto-reload is the default, which it should have been all along but wasn't.
+
+21 Feb 2004
+o added popup to properties dialog so that right clicking (option clicking) on any of the tables shows the cell value in a scrollable text area. This makes it easier to read and copy long values.
+
+
+3.0.1:
+15 Feb 2004
+o Inadvertently dropped the Main-Class attribute from the manifest, so the -jar option didn't work.
+
+
+26 Jan 2004:
+o Put Antelope back on jEdit's "Plugins" menu. It had inadvertently been removed in the last release.
+
+o Now it is much easier to set up Ant with Antelope and jEdit. This isn't an issue with Antelope as an application as Ant is used to start the application. As a plugin, Antelope looks for Ant like this:
+1. check if jEdit loaded ant.jar. This would happen if ant.jar is in the $user.home/.jedit/jars directory.
+2. look for ant.jar in the classpath. If found, assume any other jars needed for Ant are already in the classpath.
+3. check Antelope's preferences for ANT_HOME
+4. check for a System property named ANT_HOME
+5. check for an environment variable named ANT_HOME
+6. ask the user, then store their choice in Antelope's preferences
+The preferred method is to set an environment variable for ANT_HOME, this is also recommended by the Ant manual when installing Ant.
+
+22 Jan 2004:
+o Replaced the default Java Preferences with a custom preferences eliminates the annoying error messages produced on several versions of Linux due to several bugs ( at least bugs 4868444 and 4751177, there may be others) in Sun's implementation of preferences on that platform. You might want to take notice of a couptle of things: First, the new custom preferences are used on all platforms, not just Linux. Second, previously stored preferences are not converted to the new system. If you absolutely must use the old preferences, start Antelope with this setting on the command line:
+
+-Djava.util.prefs.PreferencesFactory=java.util.prefs.FileSystemPreferences
+
+o Set default for auto reload of build file to 'on', that is, do automatically reload the build file. Of course, this is a saved setting, so you can set Antelope to not load your build file. Note that for the new Ant 1.6 <import> task, this setting applies to all imported build files as well.
+
+o Fixed several thread issues with the auto reload with regards to how it interacts with the performance listener and the button panel.
+
+o Adjusted the performance listener to work correctly when running in multiple target mode. Previously, only statistics for the last target were displayed, now it accumulates statistics for all targets.
+
+o Added Antelope version number to the Properties/Description tab. This will make it easier for users of the jEdit plugin to verify which version of Antelope they are using.
+
+o Updates for Ant 1.6. Antelope now works well with all Ant versions 1.5 and later. No regression testing has been done with Ant versions older than 1.5. For Ant 1.6, the new <include> task is support as are top level tasks (that is, tasks that are not in a target).
+
+o Fixed the progress bar, bug 877996. This was broke in version 2.75, which was the first release to support Ant 1.6. Changes in the Ant API made the progress not work quite right. Now it works correctly with Ant 1.5.x and Ant 1.6. Also, the progress bar now shows the name of the targe that is running instead of the percentage. This seems more useful, especially as the progress bar itself gives a good visual indication of the progress.
+
+o Made a number of small fixes and code refactorings that result in cleaner code and somewhat faster execution. (Note: the sometimes slow start up of Antelope is actually due to Ant, initially loading a project can take as long as 10 seconds on an older machine.)
+
+23 Oct 2003:
+o Fixed all open bugs:
+740496	correct taskdef
+786439	Trouble with the xml logger of Ant and the break task
+818781	dtd relative folder
+820814	antelope shows tasks with empty descriptions.
+827162	NullPointer Exception
+827914	ant.version property not set on Windows
+o Added option to automatically reload build file prior to running a target.
+
+27 Sep 2003:
+o Updated tasks to work with Ant 1.6.
+o Update plugin code to work with jEdit 4.2.
+o Removed dependency on CommonControls.jar for plugin.
+o Refactored build files.
+
+15 May 2003:
+o Added run.bat and run.sh scripts to make starting stand-alone app easier.
+o Fixed bug #734867, "Limit Ant Task doesn't fail correctly".
+o Added <bool> support to Assert task.
+o Added code to Stopwatch task so that the elapsed or total time is stored in a property of the same name as the stopwatch.
+o Added IsGreaterThan and IsLessThan conditions to If task. Assert task now can use these same conditions. See testcases/limittest.xml for an example.
+o Went to the new Matrix movie!
+o Antelope can now parse files that use external entities. Nice!
+
+12 Mar 2003, release version 2.42:
+o Added ability to run multiple targets. This is so handy, I don't know why I didn't implement it sooner.
+o Updated build.xml, installPlugin.xml, and run.xml to work much better. Now all distribution files will "run right out of the box", and use the Antelope tasks, too!
+
+10 Mar 2003
+o Added find and replace to stand-alone.
+o Modified Try task to be able to store exception message and/or stack trace in a property.
+
+9 Mar 2003
+o A few files were inadvertently left out of the 2.38 build and the start up run.xml file has been cleaned up a bit. The main build file has also been cleaned up, so external dependencies are not required to do a basic build.
+o Removed the "right click for options" tooltip as right clicking does nothing.
+
+6 Mar 2003, released version 2.38:
+I'm behind on this, so the details aren't as good as they should be.
+o Fixed a bug in the editor where switching between build files would cause the old build file to be appended to the new one.
+o Fixed warning messages about invalid build/xml files.
+o You can now browse any xml file (well, many xml files) via the "Edit" tree. There is no support for xml files with dtds, which typically build files do not have.
+o updated "Edit" mode to show a tree of the build file so navigating the file is easier.
+o added "back" and "next" buttons in "Edit" mode. These work like the back and next buttons in a web browser.
+o Added some new tasks. The "call" task is particularly useful.
+o Source distribution now includes the unit tests for the extra Ant tasks.
+o Updated run.xml so that tools.jar is automatically included in the claspath if it can be found.
+o Added some public API for running as a jEdit plugin so that other plugins can easily interact with Antelope for running targets.
+
+21 Dec 2002
+o the editor is really nice now. The syntax highlighting is configurable, as is the font and many editor options. Documentation is lagging a bit on this, but hopefully the configuration is obvious enough.
+o added undo, redo, cut, copy, and paste to the editor.
+o updated the Math task to use any of the methods in java.lang.Math.
+o removed the ssh and scp tasks to their own distribution package.
+o changed the 'Options' popup to be a regular dialog with an 'Apply' button.
+o refactored the property and settings persistence, this works much better now with all properties being saved and restored correctly.
+o added a StopWatch task for timing of build events.
+o added "startswith" and "endswith" boolean conditions to the "If" task.
+
+6 Dec 2002
+o replaced Antelope editor with an older, MIT licensed version of the jEdit text editor. This makes syntax highlighting configurable and fast.
+o replaced "Format" menu with "Options" menu to support configuration of syntax highlighting and editor options.
+
+24 Nov 2002
+o This is the last 1.xx version. There are a few known bugs that are being pushed to version 2.x for resolution. Version 2 will provide a better editor, a GUI to create build files, and other items related to creating and editing build files.
+o Added input handler so the Ant 'input' task can be used from within Antelope.
+o Added progress bar to show percent complete for running target. This is useful for long running targets. The percent is calculated from the total number of tasks that a target will run and makes no assumptions about how long a particular task will take. It could be that there are only two tasks, but the first one takes 2 seconds and the second takes 10 minutes, the progress will show at 50% until the second one is done.
+o Added ability to gather performance statistics for running target. This should be useful for optimization of build files.
+o Build file syntax highlighting is very slow in app mode, added menu item under Format menu to turn the syntax colorization on or off. Default is off, which makes for much faster performance. Colorization is a bit flaky when changed from on to off or vice versa.
+
+8 Nov 2002
+o Added If, Try, and Variable task.
+o Now works in multiple views in jEdit.
+o rewrote docs in docbook format.
+o improved AntLogger.
+o rearranged packages for tasks to be in a separate package.
+o tasks available in separate jar file
+o added option for display of targets starting with a dash
+
+
+12 Oct 2002
+o Added Assert task.
+o Fixed several bugs in AntLogger.
+o Improved tracing ability.
+o Optimized Antelope editor to make colorizing faster, but this is still really slow on all but the smallest build files.
+o Added Ant coding standards.
+o Updated documentation.
+
+
+23 Sep 2002
+o Adjusted AntProject.java to be able to work correctly when using Antelope as a plugin. The jEdit classloader was preventing certain property files in ant.jar from being accessible to AntProject.java.
+
+o Moved the config and docs directories inside the src directory. The build file copies them to the proper config and docs directories for distribution. This lets the build file adjust the build number automatically within the config and doc files, which keeps everything at the same displayed build number, and keeps all the source files in the src directory.
+
+22 Sep 2002
+o added "User" tab to properties. This tab allows the user to add properties. These properties are treated as if they were passed to Ant on the command line. These properties are persistent for the build file, so each time the build file is opened, the user properties will be restored.
+
+o added "New" menu item to stand-alone app. A very basic build file is created, the user needs to fill in the details.
+
+14 Sep 2002
+o added 'recent files' menus to both stand-alone and plugin. This will track the last 10 opened build files.
+o updated tracing to trace 'ant' tasks.
+o removed references to the classes to link to the ProjectViewer plugin. The
+source for these classes is still included, but they are not compiled by the default 'compile' target in the supplied build file.
+
+8 Sep 2002
+o Fixed the storage of the settings so they actually work correctly. Option settings are stored per build file, plus font settings for the stand-alone and the last build file open are stored and used on application startup.
+o Changed the "Edit" button to be a "mode" like the trace action. Now when the Edit button is clicked, the panel background turns green to indicate 'edit mode', the build file is loaded for editing (either in the "Edit" tab in the stand-alone app or in a jEdit buffer as a plugin), and clicking on a target button will scroll the build file to the target definition.
+o Fixed the Trace button to select the "Output" tab when clicked in stand-alone.
+
+6 Sep 2002
+O Fixed the abstraction mentioned below so that AntelopePanel and AntelopeOptions really don't depend on compiling AntelopePluginPanel.
+
+5 Sep 2002
+o Major rearrangement of package layout.
+o Abstracted the interaction between AntelopePluginPanel and AntelopePanel so that AntelopePanel no longer depends on compiling AntelopePluginPanel (which depends on ProjectViewer), so the stand-alone application can be compiled without any dependency on jEdit or jEdit plugins.
+o Added KappaLayout.jar to the distribution zip. This was supposed to be there all along, but has been missing until now.
+o Adjusted the build file to include a few new targets for compiling the stand-alone, the plugin, and building the distribution zip file.
+
+3 Sep 2002
+o Updated tracing to include the actual values of properties and references.
+o Added font dialog to stand-alone.
+o Made 'Properties' dialog non-modal.
+o Fixed a bug where if the build file contained an error, all the buttons would disappear. Now at least the non-target buttons will stay visible and a dialog with the build file error will explain the problem.
+o Updated the build file to make the zip target better -- the readme, antelope.jar and kappalayout.jar are at the top level, the directory structure for the development files are in directories.
+
+2 Sep 2002
+Made a number of modifications to the stand-alone application:
+o Added ability to save output to a file.
+o Made output area editable.
+o Added ability to edit the build file.
+o Added ability to save modifications to the build file.
+o Added color coding to the build file editor.
+o Added help and about menu items.
+o Added help viewer.
+o Added icons to the menu items.
+
+1 Sep 2002
+o Added 'Trace' button to show exactly what targets and tasks will be executed when a particular target runs. This is useful for tracking down the execution flow in convoluted build files.
+
+29 Aug 2002
+o included a file inadvertently left out of the last distribution. This file lets Antelope run without ProjectViewer when run as a jEdit plugin.
+
+o Did some optimization in AntelopePanel. It can take as long as 8 - 10 seconds to change build files, it turns out this is in Ant's Project class, so there's not much I can do about it (at least, not without joining the Ant project...)
+
+18 Aug 2002
+o Added code to integrate Antelope with ProjectViewer plugin in jEdit. This integration requires the bleeding edge ProjectViewer from CVS. Right click on your build file in ProjectViewer and set it as your build file, and Antelope will be notified and adjust itself accordingly. Antelope will run without ProjectViewer, but won't necessarily compile without it.
+
+17 Aug 2002
+o Fixed a problem with option settings not being restored. They were being saved, but the controls were not being set with the stored values on start up. Settings are stored per build file, so each time a build file is opened, the settings for the particular file are set.
+
+o Major modifications to AntLogger. This is now very useful outside of Antelope and has several settings that can be adjusted either via Ant command line options or build file properties. See the documentation for details.
+
+o Added an "Edit" button when running as a jEdit plugin. This will open the current build file in jEdit for editing.
+
+
+14 Aug 2002
+o Fixed a problem with capturing output from javac when running as a plugin. jEdit diddles with the System print streams, which meant I had to also to be able to catch the output. This caused significant changes to AntLogger, which now only writes to java.util.logging.Logger, there is no more print stream output. Output to a console window is via a java.util.logging.ConsoleHandler.
+
+o Added color coding of output when running as a plugin.
+
+o Fixed a potention null pointer exception when trying to view the properties. (Why does Java hava a null pointer exception, but not pointers?)
+
+o Removed the option panel from jEdit's global plugin properties. There was a problem with trying to maintain two different panels (one on the global menu, one for the options button), so I opted for using the Options button only. This makes the code easier to maintain for stand-alone use.
+
+o Cleaned up some dead methods and old comments.
+
+o Converted all files to contain the same license. Antelope is licensed under an Apache license.
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03.html	(revision 15023)
@@ -0,0 +1,1 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Additional Ant Tasks</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="index.html" title="Antelope Users Guide"><link rel="prev" href="bk02ch09.html" title="Chapter 9. Example Build File"><link rel="next" href="bk03ch01.html" title="Chapter 1. Introduction"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Additional Ant Tasks</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk02ch09.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="bk03ch01.html">Next</a></td></tr></table><hr></div><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="id2518311"></a>Additional Ant Tasks</h1></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Dale</span> <span class="surname">Anson</span></h3></div></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="bk03ch01.html">1. Introduction</a></span></dt><dt><span class="chapter"><a href="bk03ch02.html">2. License</a></span></dt><dt><span class="chapter"><a href="bk03ch03.html">3. Installation</a></span></dt><dt><span class="chapter"><a href="bk03ch04.html">4. Assert Task</a></span></dt><dt><span class="chapter"><a href="bk03ch05.html">5. If Task</a></span></dt><dd><dl><dt><span class="section"><a href="bk03ch05.html#id2519100">If</a></span></dt><dt><span class="section"><a href="bk03ch05s02.html">More Conditions</a></span></dt></dl></dd><dt><span class="chapter"><a href="bk03ch06.html">6. SwitchTask</a></span></dt><dt><span class="chapter"><a href="bk03ch07.html">7. Try Task</a></span></dt><dt><span class="chapter"><a href="bk03ch08.html">8. Unset Task</a></span></dt><dt><span class="chapter"><a href="bk03ch09.html">9. Variable Task</a></span></dt><dt><span class="chapter"><a href="bk03ch10.html">10. Stopwatch</a></span></dt><dt><span class="chapter"><a href="bk03ch11.html">11. Limit</a></span></dt><dt><span class="chapter"><a href="bk03ch12.html">12. FileUtils</a></span></dt><dt><span class="chapter"><a href="bk03ch13.html">13. StringUtils</a></span></dt><dt><span class="chapter"><a href="bk03ch14.html">14. UID</a></span></dt><dt><span class="chapter"><a href="bk03ch15.html">15. Math</a></span></dt><dt><span class="chapter"><a href="bk03ch16.html">16. Hostname</a></span></dt><dt><span class="chapter"><a href="bk03ch17.html">17. HTTP Post</a></span></dt><dt><span class="chapter"><a href="bk03ch18.html">18. SSH and SCP</a></span></dt><dt><span class="chapter"><a href="bk03ch19.html">19. AntFetch</a></span></dt><dt><span class="chapter"><a href="bk03ch20.html">20. AntCallBack</a></span></dt><dt><span class="chapter"><a href="bk03ch21.html">21. Call Task</a></span></dt><dt><span class="chapter"><a href="bk03ch22.html">22. Grep Task</a></span></dt><dt><span class="chapter"><a href="bk03ch23.html">23. Split Task</a></span></dt><dt><span class="chapter"><a href="bk03ch24.html">24. Repeat Task</a></span></dt><dt><span class="chapter"><a href="bk03ch25.html">25. Suite Task</a></span></dt><dt><span class="chapter"><a href="bk03ch26.html">26. TestCase Task</a></span></dt><dt><span class="chapter"><a href="bk03ch27.html">27. Performance Monitoring</a></span></dt><dt><span class="chapter"><a href="bk03ch28.html">28. Feedback</a></span></dt></dl></div><div class="list-of-tables"><p><b>List of Tables</b></p><dl><dt>4.1. <a href="bk03ch04.html#id2518779">Assert Task Attributes</a></dt><dt>5.1. <a href="bk03ch05.html#id2519204">If Task Attributes</a></dt><dt>5.2. <a href="bk03ch05s02.html#id2519740">IfPropertyTrue Attributes</a></dt><dt>5.3. <a href="bk03ch05s02.html#id2519813">IfPropertyFalse Attributes</a></dt><dt>5.4. <a href="bk03ch05s02.html#id2519887">StartsWith Attributes</a></dt><dt>5.5. <a href="bk03ch05s02.html#id2519974">EndsWith Attributes</a></dt><dt>5.6. <a href="bk03ch05s02.html#id2520064">IsGreaterThan Attributes</a></dt><dt>5.7. <a href="bk03ch05s02.html#id2520155">IsLessThan Attributes</a></dt><dt>5.8. <a href="bk03ch05s02.html#id2520243">DateBefore, TimeBefore</a></dt><dt>5.9. <a href="bk03ch05s02.html#id2520355">DateDifference, TimeDifference</a></dt><dt>6.1. <a href="bk03ch06.html#id2520537">Switch Task Attributes</a></dt><dt>6.2. <a href="bk03ch06.html#id2520641">"case" and "default" Attributes</a></dt><dt>7.1. <a href="bk03ch07.html#id2520781">Try Task Attributes</a></dt><dt>8.1. <a href="bk03ch08.html#id2521084">Unset Task Attributes</a></dt><dt>9.1. <a href="bk03ch09.html#id2521241">Variable Task Attributes</a></dt><dt>10.1. <a href="bk03ch10.html#id2521484">Stopwatch Task Attributes</a></dt><dt>11.1. <a href="bk03ch11.html#id2521623">Limit Task Attributes</a></dt><dt>12.1. <a href="bk03ch12.html#id2521773">FileUtil Task Attributes</a></dt><dt>12.2. <a href="bk03ch12.html#id2521860">listfiles</a></dt><dt>12.3. <a href="bk03ch12.html#id2521961">lastmodified</a></dt><dt>13.1. <a href="bk03ch13.html#id2522160">StringUtil Task Attributes</a></dt><dt>13.2. <a href="bk03ch13.html#id2522239">indexof, lastindexof: Find the index of or the last index of a substring.</a></dt><dt>13.3. <a href="bk03ch13.html#id2522312">substring: Get a substring from the string.</a></dt><dt>13.4. <a href="bk03ch13.html#id2522383">replace: Replace parts of the string.</a></dt><dt>13.5. <a href="bk03ch13.html#id2522455">sort: Sort items in a string.</a></dt><dt>13.6. <a href="bk03ch13.html#id2522516">messagebox: Put the string in a box for nice display.</a></dt><dt>14.1. <a href="bk03ch14.html#id2522993">UID Task Attributes</a></dt><dt>15.1. <a href="bk03ch15.html#id2523260">Math Task Attributes</a></dt><dt>15.2. <a href="bk03ch15.html#id2523416">Op Attributes</a></dt><dt>15.3. <a href="bk03ch15.html#id2523516">Num Attributes</a></dt><dt>16.1. <a href="bk03ch16.html#id2523641">Hostname Task Attributes</a></dt><dt>17.1. <a href="bk03ch17.html#id2523989">Post Task Attributes</a></dt><dt>17.2. <a href="bk03ch17.html#id2524204">Prop Attributes</a></dt><dt>19.1. <a href="bk03ch19.html#id2524525">AntFetch Attributes</a></dt><dt>20.1. <a href="bk03ch20.html#id2524711">AntCallBack Attributes</a></dt><dt>21.1. <a href="bk03ch21.html#id2524808">Call Task Attributes</a></dt><dt>22.1. <a href="bk03ch22.html#id2524918">Grep Task Attributes</a></dt><dt>23.1. <a href="bk03ch23.html#id2525260">Split Task Attributes</a></dt><dt>24.1. <a href="bk03ch24.html#id2525632">Repeat Task Attributes</a></dt><dt>25.1. <a href="bk03ch25.html#id2525911">Suite Attributes</a></dt><dt>26.1. <a href="bk03ch26.html#id2526309">TestCase Attributes</a></dt></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk02ch09.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="bk03ch01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 9. Example Build File </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 1. Introduction</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch01.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch01.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch01.html	(revision 15023)
@@ -0,0 +1,21 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 1. Introduction</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03.html" title="Additional Ant Tasks"><link rel="next" href="bk03ch02.html" title="Chapter 2. License"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Introduction</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch02.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="introduction"></a>Chapter 1. Introduction</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+<p>
+Many of the Antelope tasks are now part of the Ant-Contrib project, http://ant-contrib.sourceforge.net. In this version, 3.4.1, the tasks contained in the Antelope distribution are identical to those in Ant-Contrib other than the package name. The Antelope tasks will continue to be distributed as part of the Antelope distribution, but eventually, the package and code base will reside entirely with Ant-Contrib. Additionally, it is likely that the Ant-Contrib tasks that are not part of Antelope will be included in this distribution as well. The intent is to make Ant-Contrib the central location for additional Ant tasks.
+</p><p>
+Ant was not designed to be a scripting language. It was meant to replace 'make' and has done an outstanding job in doing so. However, in day to day use in building even small-scale applications, Ant is being used in ways never foreseen by its creators. Complete applications are being build using Ant as the coding language. Build files call other build files, which in turn call other build files. Regardless of the original intent, Ant has become a replacement for batch files, shell scripts, perl scripts, and make files.
+</p><p>
+Ant is also extensible. The API is nicely defined to allow any number of new tasks to be added, and each new release of Ant includes new and useful tasks. The tasks described here help developers to create more robust build files, and to assist in structuring build files more like a programming or scripting language than is possible with the standard issue tasks.
+</p><p>
+Several of the tasks described in this manual are based on Java language counterparts:
+</p><p>
+The Assert task is modeled after the Java <code class="computeroutput">assert</code>keyword.
+</p><p>
+The If task is modeled after the Java <code class="computeroutput">if/else</code> construct.
+</p><p>
+The Try task is modeled after the Java <code class="computeroutput">try/catch</code> construct.
+</p><p>
+The Variable task is modeled after Java variable declaration and assignment.
+</p><p>
+These tasks have become indispensible for me in daily use. I think you will find that your Ant build files are more robust and better structured through the use of these tasks.  I've tried to incorporate real-world examples, in fact, many come from the unit tests for the tasks.  If you have a source code distribution, you can look at the unit tests for more examples.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Additional Ant Tasks </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 2. License</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch02.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch02.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch02.html	(revision 15023)
@@ -0,0 +1,61 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 2. License</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch01.html" title="Chapter 1. Introduction"><link rel="next" href="bk03ch03.html" title="Chapter 3. Installation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 2. License</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch01.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch03.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="license"></a>Chapter 2. License</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+        These Ant tasks are licensed under the same Apache license as Ant:
+    </p><p>
+    </p><pre class="programlisting">
+    
+The Apache Software License, Version 1.1
+
+Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+3. The end-user documentation included with the redistribution, if
+   any, must include the following acknowlegement:
+      "This product includes software developed by the
+       Apache Software Foundation (http://www.apache.org/)."
+   Alternately, this acknowlegement may appear in the software itself,
+   if and wherever such third-party acknowlegements normally appear.
+
+4. The names "The Jakarta Project", "Ant", and "Apache Software
+   Foundation" must not be used to endorse or promote products derived
+   from this software without prior written permission. For written
+   permission, please contact apache@apache.org.
+
+5. Products derived from this software may not be called "Apache"
+   nor may "Apache" appear in their names without prior written
+   permission of the Apache Group.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+====================================================================
+
+This software consists of voluntary contributions made by many
+individuals on behalf of the Apache Software Foundation.  For more
+information on the Apache Software Foundation, please see
+&lt;http://www.apache.org/&gt;.
+    
+    </pre><p>
+    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 1. Introduction </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 3. Installation</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch03.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch03.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch03.html	(revision 15023)
@@ -0,0 +1,44 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 3. Installation</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch02.html" title="Chapter 2. License"><link rel="next" href="bk03ch04.html" title="Chapter 4. Assert Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 3. Installation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch02.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch04.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="installation"></a>Chapter 3. Installation</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+        If you are running your build files from Antelope, these tasks are already installed and nothing more needs to be done. The following discusses installing the tasks by hand for use outside of Antelope.
+    </p><p>
+        These Ant tasks are packaged as a part of Antelope, which is an application for running Ant build files. They may also be obtained as a separate package. Depending on the distribution you have on hand, copy either antelope.jar or antelope_tasks.jar into your ${ant.home}/lib directory or add it to your classpath. This is the directory where ant.jar and optional.jar are installed for your Ant distribution.
+    </p><p>
+        Once installed, each task that you want to use in a build file must be defined in that build file. Since several of the Antelope tasks are dependent on each other, the preferred way to define them is like this:
+       </p><pre class="programlisting">
+       
+         &lt;taskdef resource="ise.antelope.tasks.antelope.taskdefs
+                  classpath="path/to/AntelopeTasks_3.4.1.jar"/&gt;
+       
+       </pre><p>
+       This will load all Antelope tasks without further hassle, and will only load the tasks once. It is not good to load the tasks multiple times, this can cause problems with 'ant' and 'antcall' in particular.
+    </p><p>
+        If you don't want to load all of the tasks, the documentation for each task explains in detail what you will need to add to your build file to use the individual task. For example, the Assert tasks says:
+    </p><p>
+        </p><pre class="programlisting">
+        To use this task in your build files, include a task definition like this:
+        
+        &lt;taskdef name="assert" classname="ise.antelope.tasks.Assert"/&gt;
+        &lt;property name="ant.enable.asserts" value="true"/&gt;
+        
+        </pre><p>
+    </p><p>
+        Notice that you may name the tasks whatever you want via 'taskdef'. The names listed in the individual task descriptions are those that are set via the preferred method mentioned above.
+    </p><p>
+        As of Antelope version 2.64, the 'AntLib' feature of Ant 1.6 is supported, which provides an alternate way of loading optional tasks. If AntelopeTasks_3.4.1.jar is in the core classpath (in ${ant.home}/lib for example) one can use the namespace short-cut to load them:
+        </p><pre class="programlisting">
+        
+        &lt;project xmlns:antelope="antlib:ise.antelope.tasks"&gt;
+          &lt;antelope:try messageproperty="failed"&gt;
+            &lt;fail&gt;This should fail&lt;/fail&gt;
+            &lt;echo&gt;This will not be reached&lt;/echo&gt;
+            &lt;antelope:catch&gt;
+              &lt;echo&gt;failed is ${failed}&lt;/echo&gt;
+            &lt;/antelope:catch&gt;
+          &lt;/antelope:try&gt;
+        &lt;/project&gt;
+        
+        </pre><p>
+        <span class="italic">Thanks to Peter Reilly of the Ant development team for this pointer and example.</span>
+    </p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 2. License </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 4. Assert Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch04.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch04.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch04.html	(revision 15023)
@@ -0,0 +1,83 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 4. Assert Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch03.html" title="Chapter 3. Installation"><link rel="next" href="bk03ch05.html" title="Chapter 5. If Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 4. Assert Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch03.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch05.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Assert"></a>Chapter 4. Assert Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Assert task adds an assertion capability to Ant projects. This task works in a manner very similar to the Java <code class="computeroutput">assert</code> keyword, and provides a limited "design by contract" facility to Ant. This is very useful for testing build scripts prior to putting them into production.
+</p><p>
+The Assert task verifies that a given property has a
+given value and throws a BuildException if the property value is not as expected
+or the property does not exist.
+</p><p>
+Also like Java's <code class="computeroutput">assert</code> keyword, the Assert task must be 'turned on' using the property <code class="computeroutput">ant.enable.asserts</code>. If not set, or is set to <code class="computeroutput">false</code>, the Assert task works exactly like the Sequential task. If the <a href="bk03ch09.html" title="Chapter 9. Variable Task">Variable task</a> is used to define this property, then it can be turned on and off as needed throughout a build.
+</p><p>
+This task can hold other tasks including Assert.
+</p><p>
+The Assert task may contain one 'bool' element. The 'bool' element is identical to the ConditionTask, but unlike the ConditionTask, is actually a Task. The 'bool' element can contain all the conditions permitted by the ConditionTask, plus the <a href="bk03ch05s02.html" title="More Conditions">IsPropertyTrue</a>, <a href="bk03ch05s02.html" title="More Conditions">IsPropertyFalse</a>,
+<a href="bk03ch05s02.html" title="More Conditions">StartsWith</a>,
+<a href="bk03ch05s02.html" title="More Conditions">EndsWith</a>,
+<a href="bk03ch05s02.html" title="More Conditions">IsGreaterThan</a>,
+<a href="bk03ch05s02.html" title="More Conditions">IsLessThan</a>,
+<a href="bk03ch05s02.html" title="More Conditions">DateTimeBefore</a>,
+<a href="bk03ch05s02.html" title="More Conditions">DateTimeDifference</a>,
+<a href="bk03ch05s02.html" title="More Conditions">MathEquals</a> conditions.
+See the <a href="bk03ch05.html" title="Chapter 5. If Task">If task</a> for examples of using these conditionals.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="assert" classname="ise.antelope.tasks.Assert"/&gt;
+    &lt;property name="ant.enable.asserts" value="true"/&gt;
+
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2518779"></a><p class="title"><b>Table 4.1. Assert Task Attributes</b></p><table summary="Assert Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of the property to test for.</td><td>none</td><td>Yes</td></tr><tr><td>exists</td><td>Test for existence or non-existence of the property.</td><td>True</td><td>No</td></tr><tr><td>value</td><td>The value to test for, implies 'exists=true'. If the value in the project is different than this value, a BuildException will be thrown and the build will stop.</td><td>none</td><td>No</td></tr><tr><td>execute</td><td>Should the tasks contained in this task be executed? It may be useful to set this to false when testing build files.</td><td>True</td><td>No</td></tr><tr><td>failonerror</td><td>Should the build halt if the assertion fails? Setting this to false is contrary to the intented use of assertions, but may be useful in certain situations. </td><td>True</td><td>No</td></tr><tr><td>message</td><td>A message to include with the output in the event of this assert failing.</td><td>none</td><td>No</td></tr><tr><td>level</td><td>A "level" for the assert, similar to debug levels.  Valid values are 'error', 'warning', 'info', 'debug'.</td><td>error</td><td>No</td></tr></tbody></table></div><p>
+
+</p><p>
+As stated above, the Assert task may contain a nested "bool" task, otherwise,
+the Assert task does not support any nested
+elements apart from Ant tasks. Any valid Ant task may be embedded within the
+assert task.
+</p><p>
+The "level" attribute is only (so far) useful when Assert is used in conjunction with the <a href="bk03ch26.html" title="Chapter 26. TestCase Task">Testcase task</a>. Setting this attribute to "warning", "info", or "debug" will force "failonerror" to false.
+</p><p>
+In the following example, the first <code class="computeroutput">assert</code> task checks that the <code class="computeroutput">wait</code> property exists and does not execute the <code class="computeroutput">echo</code> and <code class="computeroutput">sleep</code> tasks. The second <code class="computeroutput">assert</code> task checks that the <code class="computeroutput">wait</code> property exists, has a value of 2, and executes the <code class="computeroutput">echo</code> task.
+</p><p>
+</p><pre class="programlisting">
+
+     &lt;property name="wait" value="2"/&gt;
+     &lt;assert name="wait" execute="false"&gt;
+        &lt;echo&gt;
+            Waiting ${wait} seconds...
+            Click the red button to stop waiting.
+        &lt;/echo&gt;
+        &lt;sleep seconds="${wait}"/&gt;
+     &lt;/assert&gt;
+     &lt;assert name="wait" value="2" execute="true"&gt;
+        &lt;echo&gt;done waiting!&lt;/echo&gt;
+     &lt;/assert&gt;
+
+</pre><p>
+</p><p>
+The next example shows Assert being used in a unit test for the "limit" task:
+</p><pre class="programlisting">
+
+  &lt;property name="ant.enable.asserts" value="true"/&gt;
+  &lt;target name="test2"&gt;
+    &lt;!-- should not stop 'sleep' task, should print out '_passed_' --&gt;
+    &lt;stopwatch name="timer"/&gt;
+    &lt;limit maxwait="5"&gt;
+        &lt;sleep seconds="1"/&gt;
+        &lt;echo&gt;_passed_&lt;/echo&gt;
+    &lt;/limit&gt;
+    &lt;stopwatch name="timer" action="total"/&gt;
+    &lt;assert message="Too much time."&gt;
+        &lt;bool&gt;
+            &lt;islessthan arg1="${timer}" arg2="2"/&gt;
+        &lt;/bool&gt;
+    &lt;/assert&gt;
+  &lt;/target&gt;
+
+</pre><p>
+</p><p>
+If the <code class="computeroutput">ant.enable.asserts</code> property is set to false, then in the above example, the <code class="computeroutput">echo</code>, <code class="computeroutput">sleep</code>, and <code class="computeroutput">echo</code> tasks will all execute.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch05.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 3. Installation </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 5. If Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05.html	(revision 15023)
@@ -0,0 +1,244 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 5. If Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch04.html" title="Chapter 4. Assert Task"><link rel="next" href="bk03ch05s02.html" title="More Conditions"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 5. If Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch04.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch05s02.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="IfTask"></a>Chapter 5. If Task</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="bk03ch05.html#id2519100">If</a></span></dt><dt><span class="section"><a href="bk03ch05s02.html">More Conditions</a></span></dt></dl></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2519100"></a>If</h2></div></div></div><p>
+The If task provides a greatly improved "if" capability to Ant projects. This task works in a manner very similar to the Java <code class="computeroutput">if</code> keyword. This is useful for performing certain tasks only if a property has a specific value or certain conditions are met.
+</p><p>
+This task can hold other tasks including the If task. In particular, it can also have a single "else", which gives Ant a Java-like if/else construct, and a single "bool", which can be used for the "if" boolean expression.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="if" classname="ise.antelope.tasks.IfTask"/&gt;
+   
+</pre><p>
+</p><p>
+An If task may contain only one 'bool' and one 'else' and may contain a 'break'. The 'bool' element is identical to the ConditionTask, but unlike the ConditionTask, is actually a Task. The 'bool' element can contain all the conditions permitted by the ConditionTask, plus the <a href="bk03ch05s02.html" title="More Conditions">IsPropertyTrue</a>, <a href="bk03ch05s02.html" title="More Conditions">IsPropertyFalse</a>,
+<a href="bk03ch05s02.html" title="More Conditions">StartsWith</a>,
+<a href="bk03ch05s02.html" title="More Conditions">EndsWith</a>,
+<a href="bk03ch05s02.html" title="More Conditions">IsGreaterThan</a>,
+<a href="bk03ch05s02.html" title="More Conditions">IsLessThan</a> and conditions.
+</p><p>
+Here is a general outline of the If task:
+</p><pre class="programlisting">
+
+&lt;if&gt;
+    &lt;bool&gt;
+        &lt;some condition(s)/&gt;
+    &lt;/bool&gt;
+
+    some tasks...
+
+    &lt;!-- a break is allowed
+    &lt;break/&gt;
+    --&gt;
+
+    &lt;else&gt;
+        some other tasks...
+
+        &lt;!-- a break is allowed
+        &lt;break/&gt;
+        --&gt;
+    &lt;/else&gt;
+&lt;/if&gt;
+
+</pre><p>
+</p><p>
+
+</p><div class="table"><a name="id2519204"></a><p class="title"><b>Table 5.1. If Task Attributes</b></p><table summary="If Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of the property to test for.</td><td>none</td><td>Yes, unless nested bool is used.</td></tr><tr><td>exists</td><td>Test for existence or non-existence of the property.</td><td>True</td><td>No</td></tr><tr><td>value</td><td>The value to test for, implies 'exists=true'. If the value for the property in the project is the same as this value, embedded tasks will be executed.</td><td>none</td><td>No</td></tr></tbody></table></div><p>
+
+</p><p>
+The If task can hold any number of Ant tasks. If the property value is correct or the "bool" element evaluates to true, these tasks will be executed.
+</p><p>
+In addition, the If task supports three special nested elements:
+</p><div class="itemizedlist"><ul type="disc"><li><p>
+<span class="bold"><strong>bool</strong></span> This is very similar to the standard Ant Condition task. All conditions supported by the Condition task are supported by the bool element. This is an optional element and if used, is used to decide if the "if" tasks or the "else" tasks should be executed. If the bool element is not used, then the "name" attribute must be used.
+</p></li><li><p>
+<span class="bold"><strong>else</strong></span> This is very similar to the standard Ant Sequential task. The "else" can hold any number of Ant tasks. These tasks are executed if the "bool" element evaluates to false.
+</p></li><li><p>
+<span class="bold"><strong>break</strong></span> This is very similar to the Java "break" keyword. This is only useful if the If task is nested in another task that understands "break", such as the <a href="bk03ch06.html" title="Chapter 6. SwitchTask">Switch</a> task. Like the Java "break", when this element is encountered, no subsequent tasks will be executed and control passes outside the If.
+</p></li></ul></div><p>
+In the following example, the <code class="computeroutput">antcall</code> task will execute only if the project has a property named <code class="computeroutput">test</code> with a value of <code class="computeroutput">true</code>.
+</p><p>
+</p><pre class="programlisting">
+   
+   &lt;if name="test" value="true"&gt;
+      &lt;antcall target="doUnitTests"/&gt;
+   &lt;/if&gt;
+   
+</pre><p>
+</p><p>
+In the next example, the <code class="computeroutput">antcall</code> task will execute only if the project has a property named <code class="computeroutput">test</code>. In this example, it does not matter what value is assigned to the <code class="computeroutput">test</code> property.
+</p><p>
+</p><pre class="programlisting">
+    
+   &lt;if name="test"&gt;
+      &lt;antcall target="doUnitTests"/&gt;
+   &lt;/if&gt;
+   
+</pre><p>
+</p><p>
+Of course, the same thing could have been done as follows, but the "if" is generally much cleaner.
+</p><pre class="programlisting">
+   
+   &lt;antcall target="doUnitTests"/&gt;
+   &lt;target name="doUnitTests" if="test"&gt;
+      ...
+   &lt;/target&gt;
+   
+</pre><p>
+</p><p>
+In the next example, the <code class="computeroutput">antcall</code> task will execute only if the project does not have a property named <code class="computeroutput">test</code>. This is the opposite situation of the previous example.
+</p><p>
+</p><pre class="programlisting">
+   
+   &lt;if name="test" exists="false"&gt;
+      &lt;antcall target="doUnitTests"/&gt;
+   &lt;/if&gt;
+   
+</pre><p>
+</p><p>
+The next example demonstrates nested 'if' tasks. This example will run the unit tests, and if it is Monday, will publish the accumulated test results.
+</p><p>
+</p><pre class="programlisting">
+    
+   &lt;tstamp&gt;
+      &lt;format property="day" pattern="E" /&gt;
+   &lt;/tstamp&gt;
+   &lt;if name="test" value="true"&gt;
+      &lt;antcall target="doUnitTests"/&gt;
+      &lt;if name="day" value="Mon"&gt;
+         &lt;antcall target="publishTestResults"/&gt;
+      &lt;/if&gt;
+   &lt;/if&gt;
+   
+</pre><p>
+</p><p>
+The next example shows how to use If with Else. Notice that it doesn't matter where the Else is placed inside the If. All tasks in the If that are not in the Else will execute if the property value is correct, otherwise, only those tasks inside the else will execute. The "var" task is discussed <a href="bk03ch09.html" title="Chapter 9. Variable Task">here</a>.
+</p><p>
+</p><pre class="programlisting">
+    
+    &lt;var name="foo" value="bar"/&gt;
+    &lt;if name="foo" value="bar"&gt;
+        &lt;echo&gt;this will happen&lt;/echo&gt;
+        &lt;else&gt;
+            &lt;echo&gt;this won't happen&lt;/echo&gt;
+        &lt;/else&gt;
+        &lt;echo&gt;this will happen also&lt;/echo&gt;
+    &lt;/if&gt;
+
+    &lt;if name="foo" value="snarf"&gt;
+        &lt;echo&gt;this won't happen&lt;/echo&gt;
+        &lt;else&gt;
+            &lt;echo&gt;this 'else' will happen&lt;/echo&gt;
+            &lt;echo&gt;and so will this&lt;/echo&gt;
+        &lt;/else&gt;
+        &lt;echo&gt;this won't happen either&lt;/echo&gt;
+    &lt;/if&gt;
+    
+</pre><p>
+</p><p>
+The next example shows the "if" and "assert" tasks working together to validate a property before use, and also shows an example of where the "assert" 'failonerror' attribute might be useful. In this example, if the e-mail address is invalid, the e-mail won't be sent and the build won't fail. The "try" task is discussed <a href="bk03ch07.html" title="Chapter 7. Try Task">here</a>.
+</p><p>
+</p><pre class="programlisting">
+    
+   &lt;if name="email_from" value="buildteam@mycompany.com"&gt;
+      &lt;property name="valid_email" value="true"/&gt;
+   &lt;/if&gt;
+   &lt;if name="email_from" value="buildsite@mycompany.com"&gt;
+      &lt;property name="valid_email" value="true"/&gt;
+   &lt;/if&gt;
+   &lt;assert name="valid_email" value="true" failonerror="false"&gt;
+      &lt;try&gt;
+          &lt;mail from="${email_from}" tolist="${email_to}"
+              message="New release available"/&gt;
+      &lt;/try&gt;
+   &lt;/assert&gt;
+   
+</pre><p>
+</p><p>
+Here is the same thing, but using only If and Else:
+</p><p>
+</p><pre class="programlisting">
+    
+   &lt;try&gt;
+       &lt;if name="email_from" value="buildteam@mycompany.com"&gt;
+          &lt;mail from="${email_from}" tolist="${email_to}"
+              message="New release available"/&gt;
+          &lt;else&gt;
+             &lt;if name="email_from" value="buildsite@mycompany.com"&gt;
+                 &lt;mail from="${email_from}" tolist="${email_to}"
+                      message="New release available"/&gt;
+             &lt;/if&gt;
+          &lt;/else&gt;
+       &lt;/if&gt;
+   &lt;/try&gt;
+   
+</pre><p>
+</p><p>
+The next example shows how to use the "bool" element:
+</p><p>
+</p><pre class="programlisting">
+    
+    &lt;if&gt;
+        &lt;!-- "if" evaluates this element --&gt;
+        &lt;bool&gt;
+            &lt;and&gt;
+                &lt;available file="build.xml"/&gt;
+                &lt;available file="run.xml"/&gt;
+            &lt;/and&gt;
+        &lt;/bool&gt;
+
+        &lt;!-- if true, then tasks listed here will execute --&gt;
+        &lt;echo&gt;build.xml and run.xml are available&lt;/echo&gt;
+
+        &lt;!-- if false, then tasks inside the "else" will execute --&gt;
+        &lt;else&gt;
+            &lt;echo&gt;didn't find one or both of build.xml and run.xml&lt;/echo&gt;
+        &lt;/else&gt;
+    &lt;/if&gt;
+    
+</pre><p>
+</p><p>
+The following example shows the "bool" element again:
+</p><p>
+</p><pre class="programlisting">
+    
+    &lt;if&gt;
+        &lt;bool&gt;
+            &lt;equals arg1="${download.dir}" arg2="test.dir"/&gt;
+        &lt;/bool&gt;
+
+        &lt;fail message="Download and test directories cannot be
+            the same! You need to reset to use the production
+            property set."/&gt;
+
+        &lt;else&gt;
+            &lt;copy file="installer.zip" todir="${download.dir}"/&gt;
+        &lt;/else&gt;
+    &lt;/if&gt;
+    
+</pre><p>
+</p><p>
+The following example is from the unit test for the "Limit" task. It shows the Stopwatch task, the Limit task, and the If task with boolean conditions:
+</p><p>
+</p><pre class="programlisting">
+    
+  &lt;target name="test2"&gt;
+    &lt;!-- should not stop 'sleep' task, should print out '_passed_' --&gt;
+    &lt;stopwatch name="timer"/&gt;
+    &lt;limit maxwait="5"&gt;
+        &lt;sleep seconds="1"/&gt;
+        &lt;echo&gt;_passed_&lt;/echo&gt;
+    &lt;/limit&gt;
+    &lt;stopwatch name="timer" action="total"/&gt;
+    &lt;if&gt;
+        &lt;bool&gt;
+            &lt;isgreaterthan arg1="${timer}" arg2="2"/&gt;
+        &lt;/bool&gt;
+        &lt;fail message="Too much time"/&gt;
+    &lt;/if&gt;
+  &lt;/target&gt;
+    
+</pre><p>
+</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch04.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch05s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 4. Assert Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> More Conditions</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05s02.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05s02.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch05s02.html	(revision 15023)
@@ -0,0 +1,174 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>More Conditions</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03ch05.html" title="Chapter 5. If Task"><link rel="prev" href="bk03ch05.html" title="Chapter 5. If Task"><link rel="next" href="bk03ch06.html" title="Chapter 6. SwitchTask"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">More Conditions</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch05.html">Prev</a> </td><th width="60%" align="center">Chapter 5. If Task</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch06.html">Next</a></td></tr></table><hr></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="conditionals"></a>More Conditions</h2></div></div></div><p>
+These conditions are suitable for use in the &lt;bool&gt; element. Unfortunately, they cannot be used in the &lt;condition&gt; task, although all conditions for the &lt;condition&gt; task can be used with the bool and the bool can be used anywhere that &lt;condition&gt; can be used.
+</p><h3><a name="id2519728"></a>IfPropertyTrue</h3><p>
+Given a property name, tests whether the value for that property equals "true" (or "yes" or "on").
+</p><p>
+</p><div class="table"><a name="id2519740"></a><p class="title"><b>Table 5.2. IfPropertyTrue Attributes</b></p><table summary="IfPropertyTrue Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>property</td><td>The name of a property to test the value of.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;ispropertytrue property="myprop"/&gt;
+&lt;ispropertytrue property="${someprop}"/&gt;
+
+</pre><p>
+</p><h3><a name="id2519801"></a>IfPropertyFalse</h3><p>
+Given a property name, tests whether the value for that property equals "false" (or "no" or "off").
+</p><p>
+</p><div class="table"><a name="id2519813"></a><p class="title"><b>Table 5.3. IfPropertyFalse Attributes</b></p><table summary="IfPropertyFalse Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>property</td><td>The name of a property to test the value of.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;ispropertyfalse property="myprop"/&gt;
+&lt;ispropertyfalse property="${someprop}"/&gt;
+
+</pre><p>
+</p><h3><a name="id2519875"></a>StartsWith</h3><p>
+Given a property name, tests whether the value for that property starts with a specified string.
+</p><p>
+</p><div class="table"><a name="id2519887"></a><p class="title"><b>Table 5.4. StartsWith Attributes</b></p><table summary="StartsWith Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>string</td><td>The string to test.</td><td>Yes</td></tr><tr><td>with</td><td>Check if 'string' starts with this value.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;startswith string="abcdefg" with="abc"/&gt;
+&lt;startswith string="${myprop}" with="foo"/&gt;
+
+</pre><p>
+</p><h3><a name="id2519962"></a>EndsWith</h3><p>
+Given a property name, tests whether the value for that ends with with a specified string.
+</p><p>
+</p><div class="table"><a name="id2519974"></a><p class="title"><b>Table 5.5. EndsWith Attributes</b></p><table summary="EndsWith Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>string</td><td>The string to test.</td><td>Yes</td></tr><tr><td>with</td><td>Check if 'string' ends with this value.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;endswith string="abcdefg" with="efg"/&gt;
+&lt;endswith string="${myprop}" with="bar"/&gt;
+
+</pre><p>
+</p><h3><a name="id2520049"></a>IsGreaterThan</h3><p>
+Tests whether the first argument is greater than the second argument. Will
+automatically treat the arguments as numbers if both arguments consists of only the characters 0 through 9 and optionally a decimal point. Otherwise, a String
+comparison is used.
+</p><p>
+</p><div class="table"><a name="id2520064"></a><p class="title"><b>Table 5.6. IsGreaterThan Attributes</b></p><table summary="IsGreaterThan Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>arg1</td><td>The first argument.</td><td>Yes</td></tr><tr><td>arg2</td><td>The second argument.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;!-- evaluates to true --&gt;
+&lt;isgreaterthan arg1="6.02" arg2="4"/&gt;
+
+&lt;!-- evaluates to false --&gt;
+&lt;isgreaterthan arg1="bar" arg2="foo"/&gt;
+
+</pre><p>
+</p><h3><a name="id2520135"></a>IsLessThan</h3><p>
+Tests whether the first argument is less than the second argument. Will
+automatically treat the arguments as numbers if both arguments consists of only the characters 0 through 9 and optionally a decimal point. Otherwise, a String
+comparison is used.
+</p><p>
+</p><div class="table"><a name="id2520155"></a><p class="title"><b>Table 5.7. IsLessThan Attributes</b></p><table summary="IsLessThan Attributes" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>arg1</td><td>The first argument.</td><td>Yes</td></tr><tr><td>arg2</td><td>The second argument.</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;!-- evaluates to false --&gt;
+&lt;islessthan arg1="6.02" arg2="4"/&gt;
+
+&lt;!-- evaluates to true --&gt;
+&lt;islessthan arg1="bar" arg2="foo"/&gt;
+
+</pre><p>
+</p><h3><a name="id2520226"></a>DateBefore, TimeBefore </h3><p>
+Tests whether the first date/time is before the second date/time.
+</p><p>
+</p><div class="table"><a name="id2520243"></a><p class="title"><b>Table 5.8. DateBefore, TimeBefore</b></p><table summary="DateBefore, TimeBefore" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>datetime1</td><td>The first date/time.</td><td>Yes</td></tr><tr><td>datetime2</td><td>The second date/time.</td><td>Yes</td></tr><tr><td>format</td><td>The format of the date/time stamps.</td><td>Yes</td></tr><tr><td>lenient</td><td>Whether the datetime parser should use lenient parsing, defaults to true.</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+   &lt;target name="test1"&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;not&gt;
+            &lt;datebefore datetime1="2005-09-09 14:58:36" datetime2="2005-07-11 14:58:36" format="yyyy-MM-dd HH:mm:ss"/&gt;
+            &lt;/not&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test2"&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;not&gt;
+            &lt;timebefore datetime1="22:58:36" datetime2="10:58:36" format="HH:mm:ss"/&gt;
+            &lt;/not&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3"&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;timebefore datetime1="2005" datetime2="2030" format="yyyy"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test4"&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;timebefore datetime1="01:00:00" datetime2="03:00:00" format="hh:mm:ss"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><h3><a name="id2520343"></a>DateDifference, TimeDifference </h3><p>
+Tests that the difference between two dates or times is a certain value.
+</p><p>
+</p><div class="table"><a name="id2520355"></a><p class="title"><b>Table 5.9. DateDifference, TimeDifference</b></p><table summary="DateDifference, TimeDifference" border="1"><colgroup><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Required</th></tr></thead><tbody><tr><td>datetime1</td><td>The first date/time.</td><td>Yes</td></tr><tr><td>datetime2</td><td>The second date/time.</td><td>Yes</td></tr><tr><td>format</td><td>The format of the date/time stamps.</td><td>Yes</td></tr><tr><td>lenient</td><td>Whether the datetime parser should use lenient parsing, defaults to true.</td><td>No</td></tr><tr><td>value</td><td>The expected difference between the 2 datetimes.</td><td>No, default is 0</td></tr><tr><td>unit</td><td>Sets the unit for the difference between the 2 datetimes.  For example,
+if value is 12 and unit is "hours", then this
+condition checks that the difference between the 2 datetimes is 12 hours.
+Valid values are "millisecond", "second", "minute", "hour", "day", "week", "month", "year".</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+   &lt;target name="test1"&gt;
+      &lt;a:assert message="Difference between dates is not 60 days."&gt;
+         &lt;bool&gt;
+            &lt;datedifference datetime1="2005-09-09 14:58:36" datetime2="2005-07-11 14:58:36" format="yyyy-MM-dd HH:mm:ss" value="60" unit="day"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test2"&gt;
+      &lt;a:assert message="Difference between hours is not 12."&gt;
+         &lt;bool&gt;
+            &lt;timedifference datetime1="22:58:36" datetime2="10:58:36" format="HH:mm:ss" value="12" unit="hour"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3"&gt;
+      &lt;a:assert message="Difference between years is not 25."&gt;
+         &lt;bool&gt;
+            &lt;timedifference datetime1="2005" datetime2="2030" format="yyyy" value="25" unit="year"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test4"&gt;
+      &lt;a:assert message="Difference between minutes is not 120."&gt;
+         &lt;bool&gt;
+            &lt;timedifference datetime1="01:00:00" datetime2="03:00:00" format="hh:mm:ss" value="120" unit="minute"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test5"&gt;
+      &lt;a:assert message="Difference between seconds is not 7200."&gt;
+         &lt;bool&gt;
+            &lt;timedifference datetime1="01:00:00" datetime2="03:00:00" format="hh:mm:ss" value="7200" unit="second"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch05.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03ch05.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch06.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 5. If Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 6. SwitchTask</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch06.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch06.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch06.html	(revision 15023)
@@ -0,0 +1,37 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 6. SwitchTask</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch05s02.html" title="More Conditions"><link rel="next" href="bk03ch07.html" title="Chapter 7. Try Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 6. SwitchTask</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch05s02.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch07.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="switch"></a>Chapter 6. SwitchTask</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The "Switch" task works much like the Java "switch" construct. It supports nested "case" elements, which in turn, support nested "break" elements. There is also a "default" case element, so this should be very natural for Java developers to use.
+</p><p>
+</p><div class="table"><a name="id2520537"></a><p class="title"><b>Table 6.1. Switch Task Attributes</b></p><table summary="Switch Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of a property whose value will be used for the switch.</td><td>None</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><div class="table"><a name="id2520641"></a><p class="title"><b>Table 6.2. "case" and "default" Attributes</b></p><table summary='"case" and "default" Attributes' border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>value</td><td>The value of of the property used for the switch. If this value equals the property value, then all tasks in this 'case' will be executed.</td><td>None</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+</p><pre class="programlisting">
+
+&lt;property name="foo" value="bar"/&gt;
+&lt;switch name="foo"&gt;
+    &lt;case value="baz"&gt;
+        &lt;echo&gt;Executing case baz&lt;/echo&gt;
+        &lt;break/&gt;
+    &lt;/case&gt;
+    &lt;case value="bar"&gt;
+        &lt;echo&gt;Executing case bar&lt;/echo&gt;
+        &lt;if name="foo" value="bar"&gt;
+            &lt;echo&gt;breaking from the if&lt;/echo&gt;
+            &lt;break/&gt;
+        &lt;/if&gt;
+        &lt;echo&gt;Falling through to case "bat"&lt;/echo&gt;
+    &lt;/case&gt;
+    &lt;case value="bat"&gt;
+        &lt;echo&gt;Executing case bat&lt;/echo&gt;
+        &lt;break/&gt;
+    &lt;/case&gt;
+    &lt;default&gt;
+        &lt;echo&gt;Executing default case&lt;/echo&gt;
+        &lt;break/&gt;
+    &lt;/default&gt;
+&lt;/switch&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch05s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch07.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">More Conditions </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 7. Try Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch07.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch07.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch07.html	(revision 15023)
@@ -0,0 +1,105 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 7. Try Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch06.html" title="Chapter 6. SwitchTask"><link rel="next" href="bk03ch08.html" title="Chapter 8. Unset Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 7. Try Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch06.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch08.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="TryTask"></a>Chapter 7. Try Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The "Try" task works similarly to the try/catch/finally construct in Java. This task is useful when a particular task might fail, but the build should not fail if it does. An example is the "mail" task will fail if the mail server is not available, but the build should not fail if the mail message cannot be delivered.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+&lt;taskdef name="try" classname="ise.antelope.tasks.TryTask"/&gt;
+
+</pre><p>
+</p><p>
+A quick example is probably all that is necessary:
+</p><pre class="programlisting">
+
+ &lt;tempfile property="temp.file" destdir="${java.io.tmpdir}"
+     prefix="delete" suffix=".tmp"/&gt;
+ &lt;try&gt;
+     &lt;!-- use 'get' task to post to the unit test status servlet. It
+         would be better to use a post for this, but this shows a good
+         use of 'finally'. --&gt;
+     &lt;get
+         src="http://mycompany.com/servlet/junit?testnum=${test.num}&amp;status="${status}"
+         dest="${temp.file}"/&gt;
+
+     &lt;catch&gt;
+         &lt;echo&gt;Unit test servlet update failed.&lt;/echo&gt;
+     &lt;/catch&gt;
+
+     &lt;finally&gt;
+         &lt;delete file="${temp.file}"/&gt;
+     &lt;/finally&gt;
+ &lt;/try&gt;
+
+</pre><p>
+</p><p>
+Unlike the Java "try", neither the "catch" block nor the "finally" block are required. Also, the order does not matter, the "catch" block may be listed first, followed by the "finally", followed by the tasks that may fail.
+</p><p>
+</p><div class="table"><a name="id2520781"></a><p class="title"><b>Table 7.1. Try Task Attributes</b></p><table summary="Try Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>break</td><td>If true and a nested task fails, no other nested tasks will execute. If false, all nested tasks will execute regardless of whether a previous task failed. Note that for each failed task, the 'catch' block (if defined) will execute.</td><td>true</td><td>No</td></tr><tr><td>printstacktrace</td><td>If true, the exception stack trace from a failed task will be logged. </td><td>false</td><td>No</td></tr><tr><td>stacktraceproperty</td><td>Specify a property to store the stack trace of any exception. </td><td>None</td><td>No</td></tr><tr><td>printmessage</td><td>If true, the exception message from a failed task will be logged. If printstacktrace is set to true, this attribute is ignored as the exception message is printed as part of the stack trace.</td><td>true</td><td>No</td></tr><tr><td>messageproperty</td><td>Specify a property to store the message line of any exception.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+The next example shows the "break" attribute set to "no". In this case, the second echo task will execute.
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;target name="test" description="This exercises the Try task."&gt;
+        &lt;try break="no"&gt;
+            &lt;echo&gt;I am trying...&lt;/echo&gt;
+            &lt;fail message=" and I failed..."/&gt;
+            &lt;echo&gt; but I did not die!&lt;/echo&gt; &lt;!-- this WILL print --&gt;
+        &lt;/try&gt;
+    &lt;/target&gt;
+   
+</pre><p>
+</p><p>
+This slightly more practical example uses the <a href="bk03ch09.html" title="Chapter 9. Variable Task">Variable</a> task coupled with "try" to run a series of tests. All tests will run even if a preceding test fails. The "catch" block logs a message of each failed test.
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;target name="runTests" messageproperty="msg"&gt;
+        &lt;try catch="testFailed" break="no"&gt;
+            &lt;var name="testname" value="fileUtilTests"/&gt;
+            &lt;antcall target="runFileUtilTests"/&gt;
+            &lt;var name="testname" value="imageUtilTests"/&gt;
+            &lt;antcall target="runImageUtilTests"/&gt;
+            &lt;var name="testname" value="imageConversionTests"/&gt;
+            &lt;antcall target="runImageConversionTests"/&gt;
+
+            &lt;catch&gt;
+              &lt;!-- log a test failure --&gt;
+              &lt;echo file="test.log" append="yes"&gt;
+                  Test suite ${testname} failed: ${msg}
+              &lt;/echo&gt;
+            &lt;/catch&gt;
+        &lt;/try&gt;
+    &lt;/target&gt;
+    &lt;/target&gt;
+   
+</pre><p>
+</p><p>
+The following example uses a nested Finally to clean up resources:
+</p><pre class="programlisting">
+
+    &lt;tempfile property="temp.file" destdir="${java.io.tmpdir}"
+        prefix="delete" suffix=".tmp"/&gt;
+    &lt;try&gt;
+        &lt;!-- use 'get' task to post to the unit test status servlet. It
+            would be better use use a post for this, but this shows a good
+            use of 'finally'. --&gt;
+        &lt;get
+            src="http://mycompany.com/servlet/junit?testnum=${test.num}&amp;status="${status}"
+            dest="${temp.file}"/&gt;
+
+        &lt;catch&gt;
+            &lt;echo&gt;Unit test servlet update failed.&lt;/echo&gt;
+        &lt;/catch&gt;
+
+        &lt;finally&gt;
+            &lt;delete file="${temp.file}"/&gt;
+        &lt;/finally&gt;
+    &lt;/try&gt;
+
+</pre><p>
+See the <a href="bk03ch17.html" title="Chapter 17. HTTP Post">post</a> task for a better way to do a post.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch08.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 6. SwitchTask </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 8. Unset Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch08.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch08.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch08.html	(revision 15023)
@@ -0,0 +1,39 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 8. Unset Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch07.html" title="Chapter 7. Try Task"><link rel="next" href="bk03ch09.html" title="Chapter 9. Variable Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 8. Unset Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch07.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch09.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Unset"></a>Chapter 8. Unset Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Unset task provides easier access to one of the most used use cases of <a href="bk03ch09.html" title="Chapter 9. Variable Task">Variable</a>, the ability to unset a property.  By design, Ant properties are immutable, but sometimes it is handy to set a property to a new value.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="unset" classname="ise.antelope.tasks.Unset"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2521084"></a><p class="title"><b>Table 8.1. Unset Task Attributes</b></p><table summary="Unset Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of the property to unset.</td><td>None</td><td>Yes, unless 'file' is used.</td></tr><tr><td>file</td><td>The name of a property file.  All properties references in the file will be unset.  This means you can load a bunch of properties from a file, then unset them all with a single line.</td><td>None</td><td>Yes, unless 'name' is used.</td></tr></tbody></table></div><p>
+</p><p>
+Example:
+</p><pre class="programlisting">
+
+&lt;project name="unset_example" basedir="."&gt;
+    &lt;taskdef resource="ise/antelope/tasks/antlib.xml"/&gt;
+    &lt;property name="x" value="6"/&gt;
+    &lt;echo&gt;original value = ${x}&lt;/echo&gt;
+    &lt;unset name="x"/&gt;
+    &lt;echo&gt;unset: ${x}&lt;/echo&gt;
+    &lt;property name="x" value="hello"/&gt;
+    &lt;echo&gt;new value = ${x}&lt;/echo&gt;
+&lt;/project&gt;
+
+$ ant -f unset_example.xml
+Buildfile: unset_example.xml
+     [echo] original value = 6
+     [echo] unset: ${x}
+     [echo] new value = hello
+
+BUILD SUCCESSFUL
+Total time: 0 seconds
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch07.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch09.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 7. Try Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 9. Variable Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch09.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch09.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch09.html	(revision 15023)
@@ -0,0 +1,89 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 9. Variable Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch08.html" title="Chapter 8. Unset Task"><link rel="next" href="bk03ch10.html" title="Chapter 10. Stopwatch"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 9. Variable Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch08.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch10.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Variable"></a>Chapter 9. Variable Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Variable task provides a mutable property to Ant and works much like variable assignment in Java. This task is similar to the standard Ant Property task, except that THESE PROPERTIES ARE MUTABLE. While this goes against the standard Ant use of properties, occasionally it is useful to be able to change a property value within the build. <span class="bold"><strong>In general, use of this task is DISCOURAGED, and the standard Ant Property should be used if possible.</strong></span> Having said that, in real life I use this a lot.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="var" classname="ise.antelope.tasks.Variable"/&gt;
+   
+</pre><p>
+</p><p>
+Variables can be set individually or loaded from a standard properties file. A 'feature' of variables is that they can override properties, but properties cannot override variables. So if an already established property exists, its value can be reassigned by use of this task.
+</p><p>
+</p><div class="table"><a name="id2521241"></a><p class="title"><b>Table 9.1. Variable Task Attributes</b></p><table summary="Variable Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of the property to set.</td><td>None</td><td>Yes, unless 'file' is used.</td></tr><tr><td>value</td><td>The value of the property.</td><td>""</td><td>No</td></tr><tr><td>file</td><td>The name of a standard properties file to load variables from.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+In the following example, the property <code class="computeroutput">x</code> is first set to "6", then evaluated by the <code class="computeroutput">if</code>, and reassigned the value "12". The <code class="computeroutput">echo</code> task will print out 12.
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;var name="x" value="6"/&gt;
+    &lt;if name="x" value="6"&gt;
+        &lt;var name="x" value="12"/&gt;
+    &lt;/if&gt;
+    &lt;echo&gt;${x}&lt;/echo&gt;   &lt;!-- will print 12 --&gt;
+
+</pre><p>
+</p><p>
+The following shows some more uses of the Variable task. It is especially handy for property appending. Notice a couple of things: the property task can't override a var value, however, if the var value is set to "", then it can as in the case of the format example.
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;var name="x" value="6"/&gt;
+    &lt;echo&gt;x = ${x}&lt;/echo&gt;   &lt;!-- print: 6 --&gt;
+
+    &lt;var name="x" value="12"/&gt;
+    &lt;echo&gt;x = ${x}&lt;/echo&gt;   &lt;!-- print: 12 --&gt;
+
+    &lt;var name="x" value="6 + ${x}"/&gt;
+    &lt;echo&gt;x = ${x}&lt;/echo&gt;   &lt;!-- print: 6 + 12 --&gt;
+
+    &lt;var name="str" value="I "/&gt;
+    &lt;var name="str" value="${str} am "/&gt;
+    &lt;var name="str" value="${str} a "/&gt;
+    &lt;var name="str" value="${str} string."/&gt;
+    &lt;echo&gt;${str}&lt;/echo&gt;     &lt;!-- print: I am a string. --&gt;
+
+    &lt;var name="x" value="6"/&gt;
+    &lt;echo&gt;x = ${x}&lt;/echo&gt;   &lt;!-- print: 6 --&gt;
+
+    &lt;property name="x" value="12"/&gt;
+    &lt;echo&gt;x = ${x}&lt;/echo&gt;   &lt;!-- print: 6 (property can't override) --&gt;
+
+    &lt;var name="x" value="blue"/&gt;
+    &lt;tstamp&gt;
+        &lt;format property="x" pattern="EEEE"/&gt;
+    &lt;/tstamp&gt;
+    &lt;echo&gt;Today is ${x}.&lt;/echo&gt; &lt;!-- print: Today is blue. --&gt;
+
+    &lt;var name="x" value=""/&gt;
+    &lt;tstamp&gt;
+        &lt;format property="x" pattern="EEEE"/&gt;
+    &lt;/tstamp&gt;
+    &lt;echo&gt;Today is ${x}.&lt;/echo&gt; &lt;!-- print: Today is Friday. --&gt;
+
+
+</pre><p>
+</p><p>
+The next example shows Variable, If, Assert, and Try working together to make sure e-mail is sent from the right address and that if the mail fails to be sent for any reason, the build will not fail.
+</p><p>
+</p><pre class="programlisting">
+    
+   &lt;var name="valid_email" value="false"/&gt;
+   &lt;if name="email_from" value="buildteam@mycompany.com"&gt;
+      &lt;var name="valid_email" value="true"/&gt;
+   &lt;/if&gt;
+   &lt;if name="email_from" value="buildsite@mycompany.com"&gt;
+      &lt;var name="valid_email" value="true"/&gt;
+   &lt;/if&gt;
+   &lt;assert name="valid_email" value="true" failonerror="false"&gt;
+      &lt;try&gt;
+         &lt;mail from="${email_from}" tolist="${email_to}"
+            message="New release available"/&gt;
+      &lt;/try&gt;
+   &lt;/assert&gt;
+   
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch08.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch10.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 8. Unset Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 10. Stopwatch</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch10.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch10.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch10.html	(revision 15023)
@@ -0,0 +1,28 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 10. Stopwatch</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch09.html" title="Chapter 9. Variable Task"><link rel="next" href="bk03ch11.html" title="Chapter 11. Limit"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 10. Stopwatch</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch09.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch11.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="stopwatch"></a>Chapter 10. Stopwatch</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Stopwatch task makes it easy to add performance timing to Ant targets. Stopwatches are named so that multiple watches can run simultaneously.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="stopwatch" classname="ise.antelope.tasks.StopWatchTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2521484"></a><p class="title"><b>Table 10.1. Stopwatch Task Attributes</b></p><table summary="Stopwatch Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name for the stopwatch. The elapsed time or total time will be stored as an Ant property with this name.</td><td>None</td><td>Yes</td></tr><tr><td>action</td><td>Valid values are "start", "stop", "elapsed", and "total".</td><td>"start"</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+The stopwatch is started with the "start" action. When the action is "elapsed" or "total", the running time of the stopwatch is printed out. Both "stop" and "total" stop the stopwatch and reset it to zero. "elapsed" prints out the current running time of the stopwatch without stopping it.
+</p><p>
+Example:
+</p><pre class="programlisting">
+
+&lt;stopwatch name="timer1"/&gt;
+&lt;!-- do some tasks here... --&gt;
+&lt;stopwatch name="timer1" action="elapsed"/&gt; &lt;!-- print the elapsed time --&gt;
+&lt;!-- do some more tasks here... --&gt;
+&lt;stopwatch name="timer1" action="total"/&gt; &lt;!-- print out the total time --&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch09.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch11.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 9. Variable Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 11. Limit</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch11.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch11.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch11.html	(revision 15023)
@@ -0,0 +1,39 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 11. Limit</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch10.html" title="Chapter 10. Stopwatch"><link rel="next" href="bk03ch12.html" title="Chapter 12. FileUtils"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 11. Limit</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch10.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch12.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Limit"></a>Chapter 11. Limit</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+   <p>
+The Limit task is a task container (that is, it holds other tasks) and sets a time limit on how long the nested tasks are allowed to run. This is useful for unit tests that go awry, hung socket connections, or other potentially long running tasks that need to be shut off without stopping the build.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="limit" classname="ise.antelope.tasks.Limit"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2521623"></a><p class="title"><b>Table 11.1. Limit Task Attributes</b></p><table summary="Limit Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>maxwait</td><td>How long to wait for nested tasks to finish, this is in seconds.</td><td>180 seconds (3 minutes)</td><td>No</td></tr><tr><td>failonerror</td><td>Should the build fail if the time limit has been exceeded?</td><td>false</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Examples:
+</p><p>
+Neither the echo nor the fail will happen in this example. The build will continue once the time has expired.
+</p><pre class="programlisting">
+
+&lt;limit maxwait="3"&gt;
+   &lt;sleep seconds="10"/&gt;
+   &lt;echo&gt;This won't happen...&lt;/echo&gt;
+   &lt;fail&gt;This won't happen either...&lt;/fail&gt;
+&lt;/limit&gt;
+
+</pre><p>
+</p><p>
+Neither the echo nor the fail will happen in this example. The build will not continue once the time has expired.
+</p><pre class="programlisting">
+
+&lt;limit maxwait="3" failonerror="true"&gt;
+   &lt;sleep seconds="10"/&gt;
+   &lt;echo&gt;This won't happen...&lt;/echo&gt;
+   &lt;fail&gt;This won't happen either...&lt;/fail&gt;
+&lt;/limit&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch10.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch12.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 10. Stopwatch </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 12. FileUtils</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch12.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch12.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch12.html	(revision 15023)
@@ -0,0 +1,45 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 12. FileUtils</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch11.html" title="Chapter 11. Limit"><link rel="next" href="bk03ch13.html" title="Chapter 13. StringUtils"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 12. FileUtils</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch11.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch13.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="FileUtils"></a>Chapter 12. FileUtils</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+   <p>
+The FileUtils task provides a number of useful file information functions, such as readability, writability, length, etc.  <span class="bold"><strong>Caution: this task does not follow the standard Ant convention of property immutability.</strong></span>
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="fileutil" classname="ise.antelope.tasks.FileUtilTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2521773"></a><p class="title"><b>Table 12.1. FileUtil Task Attributes</b></p><table summary="FileUtil Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>file</td><td>The file or directory in question.</td><td>None</td><td>No, but does nothing without a file.</td></tr><tr><td>property</td><td>Where to store the answer. Caution: this task will overwrite any existing property with this name.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Operations as nested elements:
+</p><p>
+<span class="bold"><strong>listfiles</strong></span> Create a list of files and/or directories.
+</p><div class="table"><a name="id2521860"></a><p class="title"><b>Table 12.2. listfiles</b></p><table summary="listfiles" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>what</td><td>What to list, valid values are "files", "dirs", or "all".</td><td>files</td><td>No</td></tr><tr><td>separator</td><td>The separator to use between individual items in the list of files.</td><td>, (comma)</td><td>No</td></tr><tr><td>includepath</td><td>If true, include the path with the names in the list.  If false, include only the names.</td><td>true</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+<span class="bold"><strong>lastmodified</strong></span> Get the "last modified" date/timestamp of a file.
+
+</p><div class="table"><a name="id2521961"></a><p class="title"><b>Table 12.3. lastmodified</b></p><table summary="lastmodified" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>format</td><td>A format for the last modified timestamp.  Must comply with the standards listed in java.text.SimpleDateFormat.</td><td> </td><td>No</td></tr></tbody></table></div><p>
+
+</p><p>
+These operations have no attributes:
+</p><div class="itemizedlist"><ul type="disc"><li><p>
+<span class="bold"><strong>canread</strong></span> Is the file readable?
+</p></li><li><p>
+<span class="bold"><strong>canwrite</strong></span> Is the file writable?
+</p></li><li><p>
+<span class="bold"><strong>length</strong></span> Finds the length of the file.
+</p></li><li><p>
+<span class="bold"><strong>filecount</strong></span> Find the number of files in the directory.
+</p></li><li><p>
+<span class="bold"><strong>isdirectory</strong></span> Is the file a directory?
+</p></li><li><p>
+<span class="bold"><strong>isfile</strong></span> Is the file a file?
+</p></li></ul></div><p>
+
+</p><p>
+Only one of the operations can be used at once.
+</p><p>
+Examples: See the <a href="bk03ch23.html" title="Chapter 23. Split Task">Split</a> for several examples.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch11.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch13.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 11. Limit </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 13. StringUtils</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch13.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch13.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch13.html	(revision 15023)
@@ -0,0 +1,221 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 13. StringUtils</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch12.html" title="Chapter 12. FileUtils"><link rel="next" href="bk03ch14.html" title="Chapter 14. UID"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 13. StringUtils</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch12.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch14.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="StringUtils"></a>Chapter 13. StringUtils</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+   <p>
+The StringUtils task provides a number of useful string manipulation functions, such as converting a string to upper or lower case, trimming white space, finding a substring, etc. <span class="bold"><strong>Caution: this task does not follow the standard Ant convention of property immutability.</strong></span>
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="stringutil" classname="ise.antelope.tasks.StringUtilTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2522160"></a><p class="title"><b>Table 13.1. StringUtil Task Attributes</b></p><table summary="StringUtil Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>string</td><td>The string to manipulate.</td><td>None</td><td>No</td></tr><tr><td>property</td><td>Where to store the manipulated string. Caution: this task will overwrite any existing property with this name.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Operations as nested elements:
+</p><p>
+</p><div class="table"><a name="id2522239"></a><p class="title"><b>Table 13.2. indexof, lastindexof: Find the index of or the last index of a substring.</b></p><table summary="indexof, lastindexof: Find the index of or the last index of a substring." border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>string</td><td>The string to find the index of.</td><td>None</td><td>No</td></tr><tr><td>fromindex</td><td>Where to start looking.</td><td>0</td><td>No</td></tr></tbody></table></div><p>
+
+
+</p><div class="table"><a name="id2522312"></a><p class="title"><b>Table 13.3. substring: Get a substring from the string.</b></p><table summary="substring: Get a substring from the string." border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>beginindex</td><td>Start of substring.</td><td>0</td><td>No</td></tr><tr><td>endindex</td><td>End of substring.</td><td>End of string.</td><td>No</td></tr></tbody></table></div><p>
+
+
+</p><div class="table"><a name="id2522383"></a><p class="title"><b>Table 13.4. replace: Replace parts of the string.</b></p><table summary="replace: Replace parts of the string." border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>regex</td><td>Pattern to replace.</td><td>None</td><td>No</td></tr><tr><td>replacement</td><td>What to replace with.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+
+</p><div class="table"><a name="id2522455"></a><p class="title"><b>Table 13.5. sort: Sort items in a string.</b></p><table summary="sort: Sort items in a string." border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>separator</td><td>The character separating individual items in the string.</td><td>Any of tab, new line, carriage return, line feed, or space.</td><td>No</td></tr></tbody></table></div><p>
+This is useful for sorting a comma separated list or a property value that spans several lines.
+
+</p><p>
+</p><div class="table"><a name="id2522516"></a><p class="title"><b>Table 13.6. messagebox: Put the string in a box for nice display.</b></p><table summary="messagebox: Put the string in a box for nice display." border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>title</td><td>Title for the message box.</td><td>None</td><td>No</td></tr><tr><td>width</td><td>
+Maximum width in characters for the message box. Lines
+will be wrapped to fit inside the box.  The box will not
+stretch to this width if the message is less than
+width - 4 characters wide.
+</td><td>60</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+These operations have no attributes:
+</p><div class="itemizedlist"><ul type="disc"><li><p>
+<span class="bold"><strong>lowercase</strong></span> Converts the string to lowercase.
+</p></li><li><p>
+<span class="bold"><strong>uppercase</strong></span> Converts the string to uppercase.
+</p></li><li><p>
+<span class="bold"><strong>length</strong></span> Finds the length of the string.
+</p></li><li><p>
+<span class="bold"><strong>trim</strong></span> Removes white space from boths ends of the string.
+</p></li></ul></div><p>
+
+</p><p>
+More than one of the operations can be used at once, that is, you can convert a string to lowercase and trim it at the same time.  See below for examples.
+</p><p>
+Examples:
+</p><p>
+Convert a string to lower case:
+</p><pre class="programlisting">
+
+   &lt;target name="test1"&gt;
+      &lt;property name="prop1" value="ABCDE"/&gt;
+      &lt;echo&gt;prop1 before = ${prop1}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop1}" property="prop1"&gt;
+         &lt;a:lowercase/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop1 after = ${prop1}&lt;/echo&gt;
+      &lt;a:assert message="prop1, expected abcde, got ${prop1}"&gt;
+         &lt;bool&gt;
+            &lt;equals arg1="abcde" arg2="${prop1}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Convert a string to upper case:
+</p><pre class="programlisting">
+
+   &lt;target name="test2"&gt;
+      &lt;property name="prop2" value="abcdefgh"/&gt;
+      &lt;echo&gt;prop2 before = ${prop2}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop2}" property="prop2"&gt;
+         &lt;a:uppercase/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop2 after = ${prop2}&lt;/echo&gt;
+      &lt;a:assert message="prop2, expected ABCDEFGH, got ${prop2}"&gt;
+         &lt;bool&gt;
+            &lt;equals arg1="ABCDEFGH" arg2="${prop2}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Convert a string to upper case and trim white space:
+</p><pre class="programlisting">
+
+   &lt;target name="test3"&gt;
+      &lt;property name="prop3" value=" abcdefgh "/&gt;
+      &lt;echo&gt;prop3 before = ${prop3}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop3}" property="prop3"&gt;
+         &lt;a:uppercase/&gt;
+         &lt;a:trim/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop3 after = ${prop3}&lt;/echo&gt;
+      &lt;a:assert message="prop3, expected ABCDEFGH, got ${prop3}"&gt;
+         &lt;bool&gt;
+            &lt;equals arg1="ABCDEFGH" arg2="${prop3}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Convert a string to upper case, trim white space, and find a substring:
+</p><pre class="programlisting">
+
+   &lt;target name="test4"&gt;
+      &lt;property name="prop4" value=" abcdefgh "/&gt;
+      &lt;echo&gt;prop4 before = ${prop4}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop4}" property="prop4"&gt;
+         &lt;a:uppercase/&gt;
+         &lt;a:trim/&gt;
+         &lt;a:substring beginindex="3"/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop4 after = ${prop4}&lt;/echo&gt;
+      &lt;a:assert message="prop4, expected DEFGH, got ${prop4}"&gt;
+         &lt;bool&gt;
+            &lt;equals arg1="DEFGH" arg2="${prop4}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Get the length of a string:
+</p><pre class="programlisting">
+
+   &lt;target name="test7"&gt;
+      &lt;property name="prop7" value="abcdefgh"/&gt;
+      &lt;echo&gt;prop7 before = ${prop7}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop7}" property="prop7"&gt;
+         &lt;a:length/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop7 length = ${prop7}&lt;/echo&gt;
+      &lt;a:assert message="prop7, expected 8, got ${prop7}"&gt;
+         &lt;bool&gt;
+            &lt;mathequals arg1="8" arg2="${prop7}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Sort a list:
+</p><pre class="programlisting">
+
+   &lt;target name="test12"&gt;
+      &lt;property name="prop12" value="a,b,c,d,e,f,g,h,a,b,c,d,e,f,g,h"/&gt;
+      &lt;echo&gt;prop12 before = ${prop12}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop12}" property="prop12"&gt;
+         &lt;a:sort separator=","/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop12 sorted = ${prop12}&lt;/echo&gt;
+      &lt;a:assert message="prop12, expected 'a,a,b,b,c,c,d,d,e,e,f,f,g,g,h,h', got ${prop12}"&gt;
+         &lt;bool&gt;
+            &lt;equals arg1="a,a,b,b,c,c,d,d,e,e,f,f,g,g,h,h" arg2="${prop12}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p><p>
+Message boxes:
+</p><pre class="programlisting">
+
+   &lt;target name="test13"&gt;
+      &lt;property name="prop13" value="Character boundary analysis allows users to interact with characters as they expect to, for example, when moving the cursor around through a text string. Character boundary analysis provides correct navigation of through character strings, regardless of how the character is stored. For example, an accented character might be stored as a base character and a diacritical mark. What users consider to be a character can differ between languages."/&gt;
+      &lt;echo&gt;prop13 before = ${prop13}&lt;/echo&gt;
+      &lt;a:stringutil string="${prop13}" property="prop13"&gt;
+         &lt;a:messagebox/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop13 in messagebox:${line.separator}${prop13}&lt;/echo&gt;
+
+      &lt;property name="prop13a" value="Character boundary analysis allows users to interact with characters as they expect to, for example, when moving the cursor around through a text string. Character boundary analysis provides correct navigation of through character strings, regardless of how the character is stored. For example, an accented character might be stored as a base character and a diacritical mark. What users consider to be a character can differ between languages."/&gt;
+      &lt;a:stringutil string="${prop13a}" property="prop13a"&gt;
+         &lt;a:messagebox title="About Character Boundaries"/&gt;
+      &lt;/a:stringutil&gt;
+      &lt;echo&gt;prop13a in messagebox with title:${line.separator}${prop13a}&lt;/echo&gt;
+
+   &lt;/target&gt;
+
+test13:
+     [echo] prop13 before = Character boundary analysis allows users to interact with characters as they expect to, for
+example, when moving the cursor around through a text string. Character boundary analysis provides correct navigation of
+ through character strings, regardless of how the character is stored. For example, an accented character might be store
+d as a base character and a diacritical mark. What users consider to be a character can differ between languages.
+     [echo] prop13 in messagebox:
+     [echo]
+     [echo] +----------------------------------------------------------------------+
+     [echo] | Character boundary analysis allows users to interact with characters |
+     [echo] | as they expect to, for example, when moving the cursor around        |
+     [echo] | through a text string. Character boundary analysis provides correct  |
+     [echo] | navigation of through character strings, regardless of how the       |
+     [echo] | character is stored. For example, an accented character might        |
+     [echo] | be stored as a base character and a diacritical mark. What users     |
+     [echo] | consider to be a character can differ between languages.             |
+     [echo] +----------------------------------------------------------------------+
+     [echo] prop13a in messagebox with title:
+     [echo]
+     [echo] +----------------------------------------------------------------------+
+     [echo] | About Character Boundaries                                           |
+     [echo] +----------------------------------------------------------------------+
+     [echo] | Character boundary analysis allows users to interact with characters |
+     [echo] | as they expect to, for example, when moving the cursor around        |
+     [echo] | through a text string. Character boundary analysis provides correct  |
+     [echo] | navigation of through character strings, regardless of how the       |
+     [echo] | character is stored. For example, an accented character might        |
+     [echo] | be stored as a base character and a diacritical mark. What users     |
+     [echo] | consider to be a character can differ between languages.             |
+     [echo] +----------------------------------------------------------------------+
+[antlib:ise.antelope.tasks:testcase] test13 passed.
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch12.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch14.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 12. FileUtils </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 14. UID</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch14.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch14.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch14.html	(revision 15023)
@@ -0,0 +1,30 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 14. UID</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch13.html" title="Chapter 13. StringUtils"><link rel="next" href="bk03ch15.html" title="Chapter 15. Math"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 14. UID</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch13.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch15.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="UID"></a>Chapter 14. UID</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+   <p>
+The UID task generates a unique ID.  This ID may be either a unique string or integer.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="uid" classname="ise.antelope.tasks.UIDTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2522993"></a><p class="title"><b>Table 14.1. UID Task Attributes</b></p><table summary="UID Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>Name of a property to store the unique ID.</td><td>None</td><td>Yes</td></tr><tr><td>int</td><td>If true, generate a unique integer.</td><td>false</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Examples:
+</p><p>
+</p><pre class="programlisting">
+
+&lt;uid name="uid_1"/&gt;
+&lt;echo&gt;uid_1 = ${uid_1}&lt;/echo&gt;
+&lt;uid name="uid_2" int="yes"/&gt;
+&lt;echo&gt;uid_2 = ${uid_2}&lt;/echo&gt;
+
+
+     [echo] uid_1 = -4a1a8b86:10728498757:-7fff
+     [echo] uid_2 = 2
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch13.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch15.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 13. StringUtils </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 15. Math</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch15.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch15.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch15.html	(revision 15023)
@@ -0,0 +1,121 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 15. Math</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch14.html" title="Chapter 14. UID"><link rel="next" href="bk03ch16.html" title="Chapter 16. Hostname"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 15. Math</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch14.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch16.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="math"></a>Chapter 15. Math</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Math task provides support for all the basic mathematical operations
+provided by the java.lang.Math and java.lang.StrictMath classed. It supports int, long, float and double data types. Nesting of operations is supported to allow computation of formulas like (6 + (7.25 * 3.9))/(2 * 3 * 3) or calculating the area of a circle given a radius (I'm sure this comes up often in builds controlled by Ant!).
+</p><p>
+In addition to the operations provided by the java.lang.Math and java.lang.StrictMath classes, the Math task provides several additional operations: "add", "subtract", "multiply", "divide", and "mod", which duplicate the basic Java mathematical operations "+", "-", "*", "/", and "%", respectively. In fact, either notation can be used, that is, the operation can be set to "add" or "+", depending only on which you feel is more convenient.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="math" classname="ise.antelope.tasks.MathTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2523260"></a><p class="title"><b>Table 15.1. Math Task Attributes</b></p><table summary="Math Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>result</td><td>The name of the property to hold the result of the operation.</td><td>None</td><td>Yes</td></tr><tr><td>datatype</td><td>Sets the datatype of the calculation. Allowed values are
+"int", "long", "float", or "double". Optional, if
+used, will be applied to all numbers in this math operation.</td><td>double</td><td>No</td></tr><tr><td>strict</td><td>If true, use the methods in the java.lang.StrictMath class.</td><td>false</td><td>No</td></tr><tr><td>operation</td><td>If used, any nested Ops will be ignored. This is for convenience for simple calculations.</td><td>None</td><td>No</td></tr><tr><td>operand1</td><td>A number to use with the operation specified in the 'operation' attribute.</td><td>None</td><td>Depends on the specific operation.</td></tr><tr><td>operand2</td><td>A number to use with the operation specified in the 'operation' attribute.</td><td>None</td><td>Depends on the specific operation.</td></tr></tbody></table></div><p>
+</p><p>
+The 'result' property is reusable.
+</p>
+
+The Math task supports nested "Op" elements. An Op element represents single mathematical operation, such as "min" or "add".
+
+<p>
+</p><div class="table"><a name="id2523416"></a><p class="title"><b>Table 15.2. Op Attributes</b></p><table summary="Op Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>op</td><td>Set the name of this operation. Allowed values are
+one of the method names from java.lang.Math or java.lang.StrictMath, or one of "add", "subtract", "multiply", "divide", or "mod" (or "+", "-", "*", "/", or "%", respectively)</td><td>None</td><td>Yes</td></tr><tr><td>datatype</td><td>Sets the datatype of this calculation. Allowed values are
+"int", "long", "float", or "double". Optional, default
+is "double". If the parent Math task has a datatype set, this value will be ignored and the datatype specifed in the task will be used.</td><td>"int"</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+The Op element supports nested "Op" elements and nested "Num" elements. A Num represents a number. When an Op is nested in another Op, the nested Op is treated as a Num. The nested elements can be any combination of Op or Num as appropriate for the formula being calculated. Most of the operations provided by java.lang.Math and java.lang.StrictMath operate on one or two numbers. The "+", "-", "*", "/", and "%" operations can task any number of nested numbers.
+</p><p>
+</p><div class="table"><a name="id2523516"></a><p class="title"><b>Table 15.3. Num Attributes</b></p><table summary="Num Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>value</td><td>Set the value for this number. Must be able to parse to the datatype set by the parent element or the default datatype set by the task. Two special numbers, pi and e, can be represented by PI and E respectively. ("PI" is the ratio of the diameter of a circle to its radius, "E" is Euler's e, the base for natural logrithms.)</td><td>None</td><td>Yes</td></tr><tr><td>datatype</td><td>Sets the datatype of this number. Allowed values are
+"int", "long", "float", or "double". Optional, default
+is "double". If the parent Math task has a datatype set, this value will be ignored and the datatype specifed in the task will be used.</td><td>double</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Some examples:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;var name="op1" value="12"/&gt;
+    &lt;var name="op2" value="6"/&gt;
+    &lt;var name="op" value="+"/&gt;
+
+    &lt;!-- demo plus --&gt;
+    &lt;math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="18"/&gt;
+
+    &lt;!-- demo reusing result --&gt;
+    &lt;math result="result" operand1="${result}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="24"/&gt;
+
+    &lt;!-- demo minus --&gt;
+    &lt;var name="op" value="-"/&gt;
+    &lt;math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="6"/&gt;
+
+    &lt;!-- demo multiply --&gt;
+    &lt;var name="op" value="*"/&gt;
+    &lt;math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="72"/&gt;
+
+    &lt;!-- demo divide --&gt;
+    &lt;var name="op" value="/"/&gt;
+    &lt;math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="2"/&gt;
+
+    &lt;!-- demo modulo --&gt;
+    &lt;var name="op" value="%"/&gt;
+    &lt;math result="result" operand1="${op1}" operation="${op}" operand2="${op2}" datatype="int"/&gt;
+    &lt;echo&gt;${op1} ${op} ${op2} = ${result}&lt;/echo&gt;
+    &lt;assert name="result" value="0"/&gt;
+
+    &lt;!-- demo calculating the area of a circle --&gt;
+    &lt;!-- first, calculate the radius --&gt;
+    &lt;math result="radius"&gt;  &lt;!-- defaults to double datatype --&gt;
+        &lt;op type="*"&gt;
+            &lt;num value="1"/&gt;
+            &lt;num value="2"/&gt;
+            &lt;num value="3"/&gt;
+            &lt;num value="4"/&gt;
+            &lt;num value="5"/&gt;
+        &lt;/op&gt;
+    &lt;/math&gt;
+    &lt;echo&gt; 1 * 2 * 3 * 4 * 5 = ${radius}&lt;/echo&gt;
+
+    &lt;!-- now calculate the area --&gt;
+    &lt;math result="area" precision="float"&gt;
+        &lt;op type="*"&gt;
+            &lt;num value="PI"/&gt;
+            &lt;op type="pow"&gt;
+                &lt;num value="${radius}"/&gt;
+                &lt;num value="2"/&gt;
+            &lt;/op&gt;
+        &lt;/op&gt;
+    &lt;/math&gt;
+    &lt;echo&gt;area = PI * radius ^ 2 = ${area}&lt;/echo&gt;
+
+    &lt;!-- demo calculating a random number between 0 and 100 --&gt;
+    &lt;math result="result"&gt;
+        &lt;op op="rint"&gt;
+            &lt;op op="*"&gt;
+                &lt;num value="100"/&gt;
+                &lt;op op="random"/&gt;
+            &lt;/op&gt;
+        &lt;/op&gt;
+    &lt;/math&gt;
+    &lt;echo&gt;a random number between 0 and 100: ${result}&lt;/echo&gt;
+
+    &lt;!-- demo another multiplication --&gt;
+    &lt;math result="result" operation="multiply" operand1="17" operand2="13"/&gt;
+    &lt;echo&gt;${result}&lt;/echo&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch14.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch16.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 14. UID </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 16. Hostname</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch16.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch16.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch16.html	(revision 15023)
@@ -0,0 +1,77 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 16. Hostname</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch15.html" title="Chapter 15. Math"><link rel="next" href="bk03ch17.html" title="Chapter 17. HTTP Post"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 16. Hostname</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch15.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch17.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="hostname"></a>Chapter 16. Hostname</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+This task shows the hostname or IP address of the local machine.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="hostname" classname="ise.antelope.tasks.HostnameTask"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2523641"></a><p class="title"><b>Table 16.1. Hostname Task Attributes</b></p><table summary="Hostname Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>property</td><td>Name of the property to store the hostname or IP</td><td>hostname</td><td>No</td></tr><tr><td>showip</td><td>If true, get the IP address of the local machine.</td><td>false</td><td>No</td></tr><tr><td>nic</td><td>The specific name of an interface to get the hostname or IP address of.</td><td>None</td><td>No</td></tr><tr><td>showall</td><td>Get all names or IP addresses for all network interfaces on the local machine.</td><td>false</td><td>No</td></tr><tr><td>failonerror</td><td>Should the build fail if this task fails?</td><td>false</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Examples:
+</p><p>
+</p><pre class="programlisting">
+
+   &lt;description&gt;
+      Unit tests for hostname task, not really good as hostname is machine
+      dependent, so writing a portable test is hard.
+   &lt;/description&gt;
+
+   &lt;target name="test1"&gt;
+      &lt;a:unset name="hostname"/&gt;
+      &lt;a:hostname/&gt;
+      &lt;echo&gt;hostname: ${hostname}&lt;/echo&gt;
+      &lt;a:assert name="hostname" exists="true" message="test 1 failed."/&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test2"&gt;
+      &lt;a:unset name="localhost"/&gt;
+      &lt;a:hostname property="localhost"/&gt;
+      &lt;echo&gt;localhost: ${localhost}&lt;/echo&gt;
+      &lt;a:assert name="localhost" exists="true" message="test 2 failed."/&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3"&gt;
+      &lt;a:unset name="localhost"/&gt;
+      &lt;a:hostname property="localhost" showall="yes"/&gt;
+      &lt;echo&gt;all interfaces: ${localhost}&lt;/echo&gt;
+      &lt;a:assert name="localhost" exists="true" message="test 3 failed."/&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test4"&gt;
+      &lt;a:unset name="localhost"/&gt;
+      &lt;a:hostname property="localhost" showall="yes" showip="yes"/&gt;
+      &lt;echo&gt;all interfaces by IP: ${localhost}&lt;/echo&gt;
+      &lt;a:assert name="localhost" exists="true" message="test 4 failed."/&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test5"&gt;
+      &lt;a:unset name="localhost"/&gt;
+      &lt;a:hostname property="localhost" nic="lo" showip="yes"/&gt;
+      &lt;echo&gt;nic lo: ${localhost}&lt;/echo&gt;
+      &lt;a:assert name="localhost" value="lo:127.0.0.1" message="test 5 failed."/&gt;
+   &lt;/target&gt;
+
+Output:
+
+test1:
+     [echo] hostname: blackdog
+
+test2:
+     [echo] localhost: blackdog
+
+test3:
+     [echo] all interfaces: lo:127.0.0.1, eth0:, eth1:blackdog.somewhere.com, eth2:blackdog.wireless.somewhere.com
+
+test4:
+     [echo] all interfaces by IP: lo:127.0.0.1, eth0:, eth1:192.168.1.3, eth2:192.168.44.12
+
+test5:
+     [echo] nic lo: lo:127.0.0.1
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch15.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch17.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 15. Math </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 17. HTTP Post</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch17.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch17.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch17.html	(revision 15023)
@@ -0,0 +1,83 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 17. HTTP Post</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch16.html" title="Chapter 16. Hostname"><link rel="next" href="bk03ch18.html" title="Chapter 18. SSH and SCP"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 17. HTTP Post</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch16.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch18.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="post"></a>Chapter 17. HTTP Post</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Post task is a companion to the standard Ant "Get" task. This task does a post and does not necessarily expect anything in return. Almost always, there will be some sort of returned data, this can be logged or written to a file if needed.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="post" classname="ise.antelope.tasks.PostTask"/&gt;
+   
+</pre><p>
+</p><p>
+Basically, an HTTP POST sends name/value pairs to a web server. A very common usage is for html forms for submitting data. A typical use of this task is to send data to a servlet for updating a web page with the status of a build.
+</p><p>
+This Post task handles cookies and remembers them across calls.  This means that you can post to a login form, receive authentication cookies, then subsequent posts will automatically pass the correct cookies.  The cookies are stored in memory only, they are not written to disk and will cease to exist upon completion of the build.
+</p><p>
+The Post task has three ways of specifying the data to be posted. Nested "prop" elements can be used. A "prop" element represents a single name/value pair. The second way is to specify a property file as an attribute to the Post. All properties from the file will be sent as part of the Post data. The third way is to just type in some defined Ant properties. Is it allowed to use all three ways at once, that is, read some properties from a file, specify others via "prop" elements, and just type in some Ant properties.
+</p><p>
+</p><div class="table"><a name="id2523989"></a><p class="title"><b>Table 17.1. Post Task Attributes</b></p><table summary="Post Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>to</td><td>The URL of the remote server to send the post.</td><td>None</td><td>Yes</td></tr><tr><td>encoding</td><td>Character encoding for the name/value pairs.</td><td>UTF-8</td><td>No</td></tr><tr><td>logfile</td><td>The name of a file to write any response to. Ignored if wantresponse is set to false.</td><td>None</td><td>No</td></tr><tr><td>append</td><td>Should an existing log file be appended to or overwritten?</td><td>True, append to an existing file.</td><td>No</td></tr><tr><td>file</td><td>A file to read POST data from. All Ant properties contained in this file will be resolved (that is, ${} syntax will be expanded to their values) prior to sending the file contents.</td><td>None</td><td>No</td></tr><tr><td>maxwait</td><td>The maximum amount of time in seconds to wait for the data to be sent or for a response from the remote server. Setting this to zero means wait forever.</td><td>180 (3 minutes)</td><td>No</td></tr><tr><td>wantresponse</td><td>Whether to wait for a response from the remote server or not. In many cases this can greatly improve the performance of the build script as the server response may be large and useless to the script. Use this with caution - while the response from the server may not be required for the client, the server may require that the client accept the response prior to processing the post data.</td><td>true</td><td>No</td></tr><tr><td>property</td><td>If set and wantresponse, put the response from the remote server into this property.</td><td>None</td><td>No</td></tr><tr><td>failonerror</td><td>Whether the build should fail if the post fails.</td><td>false</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Post supports nested "prop" elements. As an HTTP POST basically sends a list of names and values, the "prop" element represents one name/value pair. A Post may contain any number of "prop" elements.
+</p><p>
+</p><div class="table"><a name="id2524204"></a><p class="title"><b>Table 17.2. Prop Attributes</b></p><table summary="Prop Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>name</td><td>The name of a property to post.</td><td>None</td><td>Yes</td></tr><tr><td>value</td><td>The value associated with the name.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+The "value" attribute is not strictly required. This provides a short-cut method in cases where the property data is an already-defined Ant property. Suppose the build file has this property defined:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;property name="src.dir" value="/home/user/project/src"/&gt;
+
+</pre><p>
+</p><p>
+Then the following are equivalent:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;prop name="src.dir"/&gt;
+    &lt;prop name="src.dir" value="${src.dir}"/&gt;
+    &lt;prop name="src.dir" value="/home/user/project/src"/&gt;
+
+</pre><p>
+</p><p>
+Defined Ant properties can be entered directly into the post element. Again, suppose the build file has this property defined:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;property name="src.dir" value="/home/user/project/src"/&gt;
+
+</pre><p>
+</p><p>
+Then the following are equivalent:
+</p><p>
+</p><pre class="programlisting">
+
+    ${src.dir}
+    &lt;prop name="src.dir"/&gt;
+    &lt;prop name="src.dir" value="${src.dir}"/&gt;
+    &lt;prop name="src.dir" value="/home/user/project/src"/&gt;
+
+</pre><p>
+</p><p>
+I googled for the URL in the following example.
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;property name="test.val" value="here's my test value"/&gt;
+    &lt;property name="test.val2" value="second test value"/&gt;
+    &lt;post to="http://wwwj.cs.unc.edu:8888/tang/servlet/tangGetPostServlet"
+        verbose="true"&gt;
+        &lt;prop name="prop1" value="val1 ${test.val}"/&gt;
+        &lt;prop name="prop2" value="val1 value 2"/&gt;
+        &lt;prop name="prop3" value="val got some spaces %funky ^$* chars"/&gt;
+        &lt;prop name="prop4" value="&amp;amp; do an ampersand like this &amp;amp;amp; or
+        Ant will whine"/&gt;
+        &lt;prop name="thanks" value="dude, thanks for the echo server!"/&gt;
+        &lt;prop name="test.val"/&gt;
+        ${test.val2}
+    &lt;/post&gt;
+
+</pre><p>
+</p><p>
+Also see the <a href="bk03ch22.html" title="Chapter 22. Grep Task">Grep task</a> for additional examples.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch16.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch18.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 16. Hostname </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 18. SSH and SCP</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch18.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch18.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch18.html	(revision 15023)
@@ -0,0 +1,6 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 18. SSH and SCP</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch17.html" title="Chapter 17. HTTP Post"><link rel="next" href="bk03ch19.html" title="Chapter 19. AntFetch"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 18. SSH and SCP</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch17.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch19.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="ssh"></a>Chapter 18. SSH and SCP</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+
+<p>
+The ssh and scp tasks are no longer included in the main Antelope distribution as they are scheduled to be released as part of Ant 1.6.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch17.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch19.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 17. HTTP Post </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 19. AntFetch</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch19.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch19.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch19.html	(revision 15023)
@@ -0,0 +1,47 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 19. AntFetch</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch18.html" title="Chapter 18. SSH and SCP"><link rel="next" href="bk03ch20.html" title="Chapter 20. AntCallBack"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 19. AntFetch</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch18.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch20.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="antfetch"></a>Chapter 19. AntFetch</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+AntFetch is identical to the standard 'Ant' task, except that it allows properties from the new project to be set in the original project.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="antfetch" classname="ise.antelope.tasks.AntFetch"/&gt;
+   
+</pre><p>
+</p><p>
+Some background may be in order: When the &lt;ant&gt; task is used, in actuality, a new Ant project is created, and depending on the inheritAll property, it is populated with properties from the original project. Then the target in this new project is executed. Any properties set in the new project remain with that project, they do not get "passed back" to the original project. So, for example, if the target in the new project sets a property named "image.directory", there is no reference to that property in the original. Here's an example of what I mean:
+</p><p>
+Suppose that the "fillImageDirectory" target sets a property named "image.directory" and I call the following:
+</p><pre class="programlisting">
+
+    &lt;ant dir="${image.project} target="fillImageDirectory"/&gt;
+    &lt;echo&gt;${image.directory}&lt;/echo&gt;
+
+</pre><p>
+The output of the echo task will be ${image.directory}, not whatever was set in the "fillImageDirectory" target.
+</p><p>
+The AntFetch task allows that image.directory property to be set in the original project. The attributes for AntFetch are identical to the 'Ant' task, with one additional, optional attibute. This attribute is named "return" and can be either a single property name or a comma separated list of property names.
+</p><p>
+Assuming that "fillImageDirectory" actually sets a property named "image.directory", the following example will print out the directory name:
+</p><pre class="programlisting">
+
+    &lt;antfetch dir="${image.project} target="fillImageDirectory" return="image.directory"/&gt;
+    &lt;echo&gt;${image.directory}&lt;/echo&gt;
+
+</pre><p>
+</p><p>
+And this one will also print out the thumbnail directory:
+</p><pre class="programlisting">
+
+    &lt;antfetch dir="${image.project} target="fillImageDirectory" return="image.directory, thumbnail.directory"/&gt;
+    &lt;echo&gt;${image.directory}&lt;/echo&gt;
+    &lt;echo&gt;${thumbnail.directory}&lt;/echo&gt;
+
+</pre><p>
+</p><p>
+The attributes for AntFetch are identical to the 'ant' task, with one additional, optional attibute. This attribute is named "return" and can be either a single property name or a comma separated list of property names.
+</p><div class="table"><a name="id2524525"></a><p class="title"><b>Table 19.1. AntFetch Attributes</b></p><table summary="AntFetch Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>return</td><td>A comma separated list of property names. Whitespace is allowed, so either "a,b" or "a, b" are acceptable.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+For other attribute and nested element information and more examples, see the documentation for the "ant" task in the Ant documentation.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch18.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch20.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 18. SSH and SCP </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 20. AntCallBack</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch20.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch20.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch20.html	(revision 15023)
@@ -0,0 +1,61 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 20. AntCallBack</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch19.html" title="Chapter 19. AntFetch"><link rel="next" href="bk03ch21.html" title="Chapter 21. Call Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 20. AntCallBack</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch19.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch21.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="antcallback"></a>Chapter 20. AntCallBack</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+AntCallBack is identical to the standard 'antcall' task, except that it allows properties set in the called target to be available in the calling target.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack"/&gt;
+   
+</pre><p>
+</p><p>
+Some background may be in order: When the &lt;antcall&gt; task is used, in actuality, a new Ant project is created, and depending on the inheritAll property, it is populated with properties from the original project. Then the requested target in this new project is executed. Any properties set in the new project remain with that project, they do not get "passed back" to the original project. So, for example, if the target in the new project sets a property named "image.directory", there is no reference to that property in the original. Here's an example of what I mean:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;target name="testCallback" description="Test CallBack"&gt;
+        &lt;taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack" classpath="${antelope.home}/build" /&gt;
+        &lt;antcallback target="-testcb" return="a, b"/&gt;
+        &lt;echo&gt;a = ${a}&lt;/echo&gt;
+        &lt;echo&gt;b = ${b}&lt;/echo&gt;
+    &lt;/target&gt;
+
+    &lt;target name="-testcb"&gt;
+        &lt;property name="a" value="A"/&gt;
+        &lt;property name="b" value="B"/&gt;
+    &lt;/target&gt;
+
+</pre><p>
+The output from executing "testCallback" looks like this:
+</p><pre class="programlisting">
+a = A
+b = B
+</pre><p>
+Contrast with this output from "antcall":
+</p><pre class="programlisting">
+a = ${a}
+b = ${b}
+</pre><p>
+</p><p>
+This is an often requested feature for Ant, at least judging from the Ant mailing lists. I assume this is because it allows a more functional programming style than Ant natively supports. The proper Ant way of doing the above is like this:
+</p><pre class="programlisting">
+
+    &lt;target name="testCallback" description="Test CallBack" depends="-testcb"&gt;
+        &lt;echo&gt;a = ${a}&lt;/echo&gt;
+        &lt;echo&gt;b = ${b}&lt;/echo&gt;
+    &lt;/target&gt;
+
+    &lt;target name="-testcb"&gt;
+        &lt;property name="a" value="A"/&gt;
+        &lt;property name="b" value="B"/&gt;
+    &lt;/target&gt;
+
+</pre><p>
+This is actually looks cleaner in this situation, and is faster, too. There is significant overhead in using both "antcall" and "antcallback" in that they both require a lot of object instantiation and property copying. That said, many people prefer to use "antcall" and "antcallback" as it better fits their logic and style.
+</p><p>
+The attributes for AntCallBack are identical to the 'antcall' task, with one additional, optional attibute. This attribute is named "return" and can be either a single property name or a comma separated list of property names.
+</p><div class="table"><a name="id2524711"></a><p class="title"><b>Table 20.1. AntCallBack Attributes</b></p><table summary="AntCallBack Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>return</td><td>A comma separated list of property names. Whitespace is allowed, so either "a,b" or "a, b" are acceptable.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+For other attribute and nested element information and more examples, see the documentation for the "antcall" task in the Ant documentation.
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch19.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch21.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 19. AntFetch </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 21. Call Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch21.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch21.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch21.html	(revision 15023)
@@ -0,0 +1,32 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 21. Call Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch20.html" title="Chapter 20. AntCallBack"><link rel="next" href="bk03ch22.html" title="Chapter 22. Grep Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 21. Call Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch20.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch22.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="calltask"></a>Chapter 21. Call Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+This is the simplest and possibly the most obvious of the "call" type of tasks. It simply calls a target in the current build file and provides exactly the functionality expected by many users of "antcall".
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="call" classname="ise.antelope.tasks.Call"/&gt;
+   
+</pre><p>
+</p><p>
+There is only one attribute, that is the name of the target to call.
+
+</p><div class="table"><a name="id2524808"></a><p class="title"><b>Table 21.1. Call Task Attributes</b></p><table summary="Call Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>target</td><td>The name of a target to execute.</td><td>None</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+There is none of the weird property manipulation done by "ant", "antcall", "antfetch", or "antcallback", and none of the overhead. When you call a target, any properties set in that target are immediately available in the calling target. A simple example should be all that is necessary:
+</p><pre class="programlisting">
+
+ &lt;target name="test" description="Test Call"&gt;
+     &lt;call target="called"/&gt;
+     &lt;echo&gt;a = ${a}&lt;/echo&gt;
+     &lt;echo&gt;b = ${b}&lt;/echo&gt;
+ &lt;/target&gt;
+
+ &lt;target name="called"&gt;
+     &lt;property name="a" value="A"/&gt;
+     &lt;property name="b" value="B"/&gt;
+ &lt;/target&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch20.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch22.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 20. AntCallBack </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 22. Grep Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch22.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch22.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch22.html	(revision 15023)
@@ -0,0 +1,99 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 22. Grep Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch21.html" title="Chapter 21. Call Task"><link rel="next" href="bk03ch23.html" title="Chapter 23. Split Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 22. Grep Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch21.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch23.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="greptask"></a>Chapter 22. Grep Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+This task uses a regular expression to do pattern matching against a string and store the match in a property.  This is useful for extracting a substring, or checking that an html form contains a particular value.</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="grep" classname="ise.antelope.tasks.Find"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2524918"></a><p class="title"><b>Table 22.1. Grep Task Attributes</b></p><table summary="Grep Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>in</td><td>The string to perform the regular expression matching on</td><td>None</td><td>Yes</td></tr><tr><td>regex</td><td>The regular expression.  See the Java API documentation for java.util.regex.Pattern for the details of the syntax for this expression.</td><td>None</td><td>Yes</td></tr><tr><td>group</td><td>The regular expression group to return in the property.</td><td>0</td><td>No</td></tr><tr><td>property</td><td>The name of a property in which to put the matched value.</td><td>None</td><td>Yes</td></tr><tr><td>allmatches</td><td>A regex may find multiple matches in the input string.  If this attribute is set to true, then the property set after the grep will contain all matches.  The individual matches can be separated by using the 'separator' attribute (see below). The default is 'false', that is, only return the first match.</td><td>false</td><td>No</td></tr><tr><td>separator</td><td>When 'allmatches' is set to true and there are multiple matches, this value will be used to separate the individual matches.</td><td>${line.separator}</td><td>No</td></tr><tr><td>caseinsensitive</td><td>Enables case-insensitive matching.</td><td>false</td><td>No</td></tr><tr><td>comments</td><td>Permits whitespace and comments in pattern.</td><td>false</td><td>No</td></tr><tr><td>dotall</td><td>Enables dotall mode.</td><td>false</td><td>No</td></tr><tr><td>multiline</td><td>Enables multiline mode.</td><td>false</td><td>No</td></tr><tr><td>unicodecase</td><td>Enables Unicode-aware case folding.</td><td>false</td><td>No</td></tr><tr><td>canoneq</td><td>Enables canonical equivalence.</td><td>false</td><td>No</td></tr><tr><td>unixlines</td><td>Enables Unix lines mode.</td><td>false</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Examples:
+</p><p>
+</p><pre class="programlisting">
+
+ &lt;target name="test" description="Test grep"&gt;
+      &lt;grep in="${response}" regex="(account id=)([0-9]+)" group="2" property="AccountId"/&gt;
+      &lt;echo&gt;Account Id: ${AccountId} received for ${user}&lt;/echo&gt;
+ &lt;/target&gt;
+
+</pre><p>
+</p><p>
+This example uses the 'unset' and 'post' tasks along with 'grep' to list the download url's for Ant:
+</p><pre class="programlisting">
+
+
+    &lt;target name="test"&gt;
+      &lt;unset name="ant_download_page"/&gt;
+      &lt;post to="http://ant.apache.org/bindownload.cgi"
+            verbose="no"
+            property="ant_download_page"/&gt;
+      &lt;grep in="${ant_download_page}"
+            regex="select name=&amp;quot;Preferred.*?&amp;lt;/select"
+            dotall="yes"
+            property="options"/&gt;
+
+      &lt;unset name="urls"/&gt;
+      &lt;grep in="${options}"
+         regex="&amp;lt;option.*?&amp;gt;(.*?)&amp;lt;/option&amp;gt;"
+         group="1"
+         allmatches="yes"
+         separator="${line.separator}"
+         property="urls"/&gt;
+      &lt;echo&gt;${urls}&lt;/echo&gt;
+    &lt;/target&gt;
+
+     [echo] http://apache.gr-linux.com
+     [echo] http://www.reverse.net/pub/apache
+     [echo] http://government-grants.org/mirrors/apache.org
+     [echo] http://apache.mirrors.hoobly.com
+     [echo] http://apache.mirrormax.net
+     [echo] http://www.ibiblio.org/pub/mirrors/apache
+     [echo] http://www.mirrormonster.com/apache.org
+     [echo] http://apache.towardex.com
+     [echo] http://www.axint.net/apache
+     [echo] http://apache.tradebit.com/pub
+     [echo] http://www.eng.lsu.edu/mirrors/apache
+     [echo] http://mirrors.isc.org/pub/apache
+     [echo] http://www.theshell.com/pub/apache
+     [echo] http://apache.mirrors.redwire.net
+     [echo] http://apache.cs.utah.edu
+     [echo] http://www.tux.org/pub/net/apache/dist
+     [echo] http://linux.cs.lewisu.edu/apache
+     [echo] http://apache.roweboat.net
+     [echo] http://apache.secsup.org/dist
+     [echo] http://www.signal42.com/mirrors/apache
+     [echo] http://apache.mirror99.com
+     [echo] http://mirrors.xtria.com/apache
+     [echo] http://apache.downlod.in
+     [echo] http://apache.mirrors.pair.com
+     [echo] http://apache.seekmeup.com
+     [echo] http://mirrors.combose.com/apache
+     [echo] http://www.wmwweb.com/apache
+     [echo] http://apache.intissite.com
+     [echo] http://apache.oregonstate.edu
+     [echo] http://apache.bestwebcover.com
+     [echo] http://ftp.wayne.edu/apache
+     [echo] http://mirrors.ccs.neu.edu/Apache/dist
+     [echo] http://www.ip97.com/apache.org
+     [echo] http://apache.mirrors.versehost.com
+     [echo] http://mirrors.playboy.com/apache
+     [echo] ftp://ftp.ccs.neu.edu/net/mirrors/Apache/dist
+     [echo] ftp://apache.mirrors.pair.com
+     [echo] ftp://apache.cs.utah.edu/pub/apache.org
+     [echo] ftp://apache.mirrors.redwire.net/pub/apache
+     [echo] ftp://ftp.oregonstate.edu/pub/apache
+     [echo] ftp://ftp.wayne.edu/apache
+     [echo] ftp://mirror.sg.depaul.edu/pub/apache
+     [echo] ftp://www.ibiblio.org/pub/mirrors/apache
+     [echo] ftp://ftp.tux.org/pub/net/apache/dist
+     [echo] ftp://www.reverse.net/pub/apache
+     [echo] ftp://apache.secsup.org/pub/apache/dist
+     [echo] http://www.eu.apache.org/dist (backup)
+     [echo] http://www.apache.org/dist (backup)
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch21.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch23.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 21. Call Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 23. Split Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch23.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch23.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch23.html	(revision 15023)
@@ -0,0 +1,102 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 23. Split Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch22.html" title="Chapter 22. Grep Task"><link rel="next" href="bk03ch24.html" title="Chapter 24. Repeat Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 23. Split Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch22.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch24.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Split"></a>Chapter 23. Split Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+This task splits a property or file into pieces.  This is similar to the "split" utility found on most Unix and Linux distributions.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><p>
+</p><pre class="programlisting">
+
+    &lt;taskdef name="split" classname="ise.antelope.tasks.SplitTask"/&gt;
+   
+</pre><p>
+</p><p>
+Once a file has been split into smaller pieces, it can be rejoined with the "concat" task that is part of the standard Ant core tasks.
+</p><p>
+</p><div class="table"><a name="id2525260"></a><p class="title"><b>Table 23.1. Split Task Attributes</b></p><table summary="Split Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>prefix</td><td>The start of the filename(s) to write the parts to.</td><td>x</td><td>No</td></tr><tr><td>bytes</td><td>How big, in bytes, to make the individual pieces. In general, use lines for text files, bytes or size for binary files.</td><td>None</td><td>No</td></tr><tr><td>size</td><td>How big to make the individual pieces. Like the Unix/Linux split utility, this attribute allows modifiers: b for 512, k for 1K, m for 1 Meg, so 100k is the same as passing 102400 in the bytes attribute.  In general, use lines for text files, bytes or size for binary files.</td><td>None</td><td>No</td></tr><tr><td>lines</td><td>How big to make the individual pieces in lines.  In general, use lines for text files, bytes or size for binary files.</td><td>1000</td><td>No</td></tr><tr><td>property</td><td>Split the value of the property into several files.</td><td>None</td><td>No</td></tr><tr><td>string</td><td>Split this string into several files.</td><td>None</td><td>No</td></tr><tr><td>file</td><td>Split this file into several files.</td><td>None</td><td>No</td></tr><tr><td>outputdir</td><td>Destination for the output files.</td><td>None</td><td>Maybe.  If file is given and output dir is not, will write to the same directory as file, otherwise, this is a required attribute.</td></tr><tr><td>failonerror</td><td>Should the build stop if this task fails?</td><td>Yes</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Examples
+</p><p>
+Split the value of a property into several files:
+</p><pre class="programlisting">
+
+   &lt;target name="test1" depends="clean"&gt;
+      &lt;property name="prop1" value="ABCDE"/&gt;
+      &lt;a:split property="prop1" bytes="1" outputdir="${out_dir}"/&gt;
+      &lt;a:fileutil file="${out_dir}" property="file_count"&gt;
+         &lt;a:filecount/&gt;
+      &lt;/a:fileutil&gt;
+      &lt;a:assert message="Expected 5 files, got ${file_count}"&gt;
+         &lt;bool&gt;
+            &lt;a:mathequals arg1="5" arg2="${file_count}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+</pre><p>
+This will result in 5 files named x.0, x.1, x.2, x.3, and x.4, each containing a single character.
+</p><p>
+This more involved example shows how to split ant.jar into several files each 100000 bytes in size.  The files will be names ant.jar.0, ant.jar.1, ..., ant.jar.10.  Then the parts are put back together with concat.
+</p><pre class="programlisting">
+
+   &lt;target name="test2" depends="clean"&gt;
+      &lt;!-- make sure ant.jar is available --&gt;
+      &lt;property name="ant.jar" value="${ant.library.dir}/ant.jar"/&gt;
+      &lt;available property="ant.jar.available" file="${ant.jar}"/&gt;
+
+      &lt;a:if name="ant.jar.available" value="true"&gt;
+         &lt;!-- ant.jar generally runs around 1MB in size, so split into 100000 byte pieces --&gt;
+         &lt;a:unset name="piece_size"/&gt;
+         &lt;property name="piece_size" value="100000"/&gt;
+         &lt;a:split file="${ant.jar}" bytes="${piece_size}" outputdir="${out_dir}" prefix="ant.jar"/&gt;
+
+         &lt;!-- count the parts --&gt;
+         &lt;a:fileutil file="${out_dir}" property="file_count"&gt;
+            &lt;a:filecount/&gt;
+         &lt;/a:fileutil&gt;
+
+         &lt;!-- calculate how many parts there should be --&gt;
+         &lt;a:fileutil file="${ant.jar}" property="ant_size"&gt;
+            &lt;a:filelength/&gt;
+         &lt;/a:fileutil&gt;
+         &lt;a:math result="split_size"&gt;
+            &lt;a:op op="ceil"&gt;
+               &lt;a:op op="/"&gt;
+                  &lt;a:num value="${ant_size}"/&gt;
+                  &lt;a:num value="${piece_size}"/&gt;
+               &lt;/a:op&gt;
+            &lt;/a:op&gt;
+         &lt;/a:math&gt;
+
+         &lt;!-- make sure there are the right number of parts --&gt;
+         &lt;a:assert message="Expected ${split_size} files, got ${file_count}"&gt;
+            &lt;bool&gt;
+               &lt;a:mathequals arg1="${split_size}" arg2="${file_count}"/&gt;
+            &lt;/bool&gt;
+         &lt;/a:assert&gt;
+
+         &lt;!-- sort the filenames of the parts so concat puts them together in
+         the right order--&gt;
+         &lt;a:fileutil file="${out_dir}" property="file_list"&gt;
+            &lt;a:listfiles includepath="no"/&gt;
+         &lt;/a:fileutil&gt;
+         &lt;a:stringutil string="${file_list}" property="file_list"&gt;
+            &lt;a:sort/&gt;
+         &lt;/a:stringutil&gt;
+
+         &lt;!-- put them back together --&gt;
+         &lt;concat destfile="${out_dir}/ant.jar" binary="true"&gt;
+            &lt;filelist dir="${out_dir}" files="${file_list}"/&gt;
+         &lt;/concat&gt;
+
+         &lt;!-- make sure the new file is the identical to the original --&gt;
+         &lt;a:assert message="concat did not produce identical file"&gt;
+            &lt;bool&gt;
+               &lt;filesmatch file1="${ant.jar}" file2="${out_dir}/ant.jar"/&gt;
+            &lt;/bool&gt;
+         &lt;/a:assert&gt;
+      &lt;/a:if&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch22.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch24.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 22. Grep Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 24. Repeat Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch24.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch24.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch24.html	(revision 15023)
@@ -0,0 +1,215 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 24. Repeat Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch23.html" title="Chapter 23. Split Task"><link rel="next" href="bk03ch25.html" title="Chapter 25. Suite Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 24. Repeat Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch23.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch25.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="Repeat"></a>Chapter 24. Repeat Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The Repeat task performs the same subtasks over and over a certain number of times or until a condition is met.  Since most tasks are configured when the build file is first loaded and never again, this task may not do what you want.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="call" classname="ise.antelope.tasks.Repeat"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2525632"></a><p class="title"><b>Table 24.1. Repeat Task Attributes</b></p><table summary="Repeat Task Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>count</td><td>The number of times to repeat execution of the nested tasks.</td><td>1</td><td>No</td></tr><tr><td>interval</td><td>How long to wait between repetitions.  If set to 0, only 1 repetition will be performed, this is to avoid a tight loop.</td><td>0</td><td>No</td></tr><tr><td>unit</td><td>The units for interval, allowed values are "milliseconds", "seconds", "minutes", "days", and "weeks"</td><td>seconds</td><td>No</td></tr><tr><td>property</td><td>The name of a property to set upon completion.</td><td>None</td><td>No</td></tr><tr><td>value</td><td>The value to set for the property to be set upon completion.</td><td>None</td><td>No</td></tr></tbody></table></div><p>
+</p><p>
+Here are a number of examples taken from the unit tests for this task:
+</p><pre class="programlisting">
+
+   &lt;target name="test1a"&gt;
+      &lt;!-- no count set, verify performs tasks once --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;mathequals arg1="${count}" arg2="1"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test1b"&gt;
+      &lt;!-- count &gt; 1, verify performs tasks correct number of times --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat count="3" interval="1"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert message="Expected 3, got ${count}"&gt;
+         &lt;bool&gt;
+            &lt;mathequals arg1="${count}" arg2="3"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test1c"&gt;
+      &lt;!-- count = -1, verify performs tasks indefinitely --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:limit maxwait="10"&gt;
+         &lt;a:repeat count="-1" interval="1"&gt;
+            &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+         &lt;/a:repeat&gt;
+      &lt;/a:limit&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;and&gt;
+               &lt;a:isgreaterthan arg1="${count}" arg2="8"/&gt;
+               &lt;a:islessthan arg1="${count}" arg2="12"/&gt;
+            &lt;/and&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test2a"&gt;
+      &lt;!-- no interval set, verify performs tasks 10 seconds apart --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:stopwatch name="test2a_stopwatch" action="start"/&gt;
+      &lt;a:repeat count="2"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:stopwatch name="test2a_stopwatch" action="total"/&gt;
+      &lt;a:assert message="Got ${count}, expected 2"&gt;
+         &lt;bool&gt;
+            &lt;and&gt;
+               &lt;a:mathequals arg1="${count}" arg2="2"/&gt;
+               &lt;a:islessthan arg1="${test2a_stopwatch}" arg2="11"/&gt;
+            &lt;/and&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+
+   &lt;target name="test2b"&gt;
+      &lt;!-- interval set to other than 10 seconds, verify tasks performed correct
+           time apart. --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:stopwatch name="test2b_stopwatch" action="start"/&gt;
+      &lt;a:repeat count="2" interval="5"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:stopwatch name="test2b_stopwatch" action="total"/&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;and&gt;
+               &lt;a:mathequals arg1="${count}" arg2="2"/&gt;
+               &lt;a:islessthan arg1="${test2b_stopwatch}" arg2="6"/&gt;
+            &lt;/and&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test2c"&gt;
+      &lt;!-- interval = 0, verify tasks performed just once --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:stopwatch name="test2c_stopwatch" action="start"/&gt;
+      &lt;a:repeat count="5" interval="0"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+" datatype="int"/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:stopwatch name="test2c_stopwatch" action="total"/&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;and&gt;
+               &lt;a:mathequals arg1="${count}" arg2="1"/&gt;
+               &lt;a:islessthan arg1="${test2c_stopwatch}" arg2="1"/&gt;
+            &lt;/and&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3a"&gt;
+      &lt;!-- failOnError not set, verify continues to execute tasks even if one fails --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat count="3" interval="1"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+         &lt;fail/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;a:mathequals arg1="${count}" arg2="3"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3b"&gt;
+      &lt;!-- failOnError set to false, same as 3a --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat count="3" interval="1" failonerror="no"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+         &lt;fail/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;a:mathequals arg1="${count}" arg2="3"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test3c"&gt;
+      &lt;!-- failOnError set to true, verify build fails if subtask fails --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:try&gt;
+         &lt;a:repeat count="3" interval="1" failonerror="yes"&gt;
+            &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+            &lt;fail/&gt;
+         &lt;/a:repeat&gt;
+      &lt;/a:try&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;a:mathequals arg1="${count}" arg2="1"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test4a"&gt;
+      &lt;!-- property name set, value not set, verify property is set to true when task
+           is complete --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat count="1" interval="1" property="test4a_property"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+         &lt;fail/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert&gt;
+         &lt;bool&gt;
+            &lt;istrue value="${test4a_property}"/&gt;
+         &lt;/bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test4b"&gt;
+      &lt;!-- property ame set, value set to a specific value, verify property is set to
+           specific value when task is complete --&gt;
+      &lt;a:var name="count" value="0"/&gt;
+      &lt;a:repeat count="1" interval="1" property="test4b_property" value="good"&gt;
+         &lt;a:math result="count" operand1="${count}" operand2="1" operation="+"/&gt;
+         &lt;fail/&gt;
+      &lt;/a:repeat&gt;
+      &lt;a:assert name="test4b_property" value="good"/&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test5"&gt;
+      &lt;property name="call_count" value="0"/&gt;
+      &lt;a:limit seconds="5" failonerror="true"&gt;
+         &lt;a:repeat count="-1" interval="1"&gt;
+            &lt;a:until&gt;
+               &lt;a:contains property="log_contents" substring="All tests passed 4 times." /&gt;
+            &lt;/a:until&gt;
+
+            &lt;echo&gt;read log&lt;/echo&gt;
+            &lt;a:new&gt;
+               &lt;a:call target="readLog"/&gt;
+            &lt;/a:new&gt;
+            &lt;echo&gt;${call_count} - ${log_contents}&lt;/echo&gt;
+
+         &lt;/a:repeat&gt;
+      &lt;/a:limit&gt;
+   &lt;/target&gt;
+
+   &lt;target name="readLog"&gt;
+      &lt;a:unset name="log_contents"/&gt;
+      &lt;a:new&gt;
+         &lt;a:math result="call_count" operand1="${call_count}" operand2="1" operation="+" datatype="int"/&gt;
+         &lt;property name="log_contents" value="All tests passed ${call_count} times."/&gt;
+      &lt;/a:new&gt;
+   &lt;/target&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch23.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch25.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 23. Split Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 25. Suite Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch25.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch25.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch25.html	(revision 15023)
@@ -0,0 +1,156 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 25. Suite Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch24.html" title="Chapter 24. Repeat Task"><link rel="next" href="bk03ch26.html" title="Chapter 26. TestCase Task"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 25. Suite Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch24.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch26.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="suitetask"></a>Chapter 25. Suite Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+ Modeled after the TestSuite provided by jUnit, this class is an Ant task that
+ looks through the build file that contains this task, calls a 'setUp' target
+ (if it exists), then executes all nested tasks, and last calls
+ a target named 'tearDown' (if it exists).  Both 'setUp' and 'tearDown' are
+ optional targets in the build file.  A build file may contain multiple suite tasks, note that each invocation will call 'setUp' and 'tearDown', so you may want to use some conditionals to only have them execute once.
+</p><p>
+<span class="bold"><strong>While this task and the associated 'testcase' task work very well, a similar test framework has been created by the Ant development team.  You may want to check out that framework as it is likely to be the "standard" Ant test framework.  Look for "AntUnit" at http://ant.apache.org.</strong></span>
+</p><p>
+ Typically, the nested tasks are TestCases, although they can be any task as appropriate to your testing.  The nested tasks may also be Suites, so you can group your tests easily.  Nested tasks are executed in order.
+</p><p>
+ Suite may also hold FileSets.  Each file in the FileSet will be treated as a file suitable for use by a TestCase and will be executed as such.  This makes it easy to run an entire directory of tests without having to specify a TestCase for each one individually.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="suite" classname="ise.antelope.tasks.Suite"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2525911"></a><p class="title"><b>Table 25.1. Suite Attributes</b></p><table summary="Suite Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>enabled</td><td>Determines if this suite should be ran.  By using a property for this attribute, it is easy to turn off/on multiple tests.</td><td>On</td><td>No</td></tr><tr><td>assertenabled</td><td>Generally tests will use the Assert task.  This attribute sets whether asserts should be enabled.</td><td>Yes</td><td>No</td></tr><tr><td>showoutput</td><td>If true, show intermediate test results</td><td>Yes</td><td>No</td></tr><tr><td>showsummary</td><td>If true, show a summary of test results at the end of the test run.</td><td>Yes</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+In the example below, the "suite" tasks is a top-level task, so will execute automatically.  This example does not use 'setUp' or 'tearDown' targets.
+</p><p>
+</p><pre class="programlisting">
+
+&lt;project name="mathtest" basedir="." xmlns:a="antlib:ise.antelope.tasks"&gt;
+   &lt;description&gt;
+     Build file to run unit tests for the Math task
+   &lt;/description&gt;
+
+   &lt;a:suite&gt;
+      &lt;a:testcase file="math_basic_tests.xml"/&gt;
+      &lt;a:testcase file="math_rules_tests.xml"/&gt;
+      &lt;a:testcase file="math_precision_tests.xml"/&gt;
+   &lt;/a:suite&gt;
+
+   &lt;!-- alternatively, a fileset could be used:
+   &lt;a:suite&gt;
+      &lt;fileset dir="${basedir}"&gt;
+         &lt;include name="math_*.xml"/&gt;
+      &lt;/fileset&gt;
+   &lt;/a:suite&gt;
+   --&gt;
+&lt;/project&gt;
+
+$ ant -f mathtest2.xml
+Buildfile: mathtest2.xml
+ [testcase] +-------------------------------------------+
+ [testcase] + mathtest
+ [testcase] +-------------------------------------------+
+
+test6:
+ [testcase] ERROR: test6 failed: string or property must be set.
+
+test5:
+ [testcase] test5 passed.
+
+test4:
+ [testcase] test4 passed.
+
+test3:
+ [testcase] test3 passed.
+
+test2:
+ [testcase] test2 passed.
+
+test1:
+ [testcase] test1 passed.
+ [testcase] +-------------------------------------------+
+ [testcase] + mathtest
+ [testcase] +-------------------------------------------+
+ [testcase]
+ [testcase] ---- Errors ---------------------------------
+ [testcase] ERROR: test6 failed: string or property must be set.
+ [testcase] ---- Results --------------------------------
+ [testcase] Ran 6 out of 6 tests.
+ [testcase] Passed: 5
+ [testcase] Warning: 0
+ [testcase] Failed: 1
+ [testcase] +-------------------------------------------+
+ [testcase] +-------------------------------------------+
+ [testcase] + math_precision_tests
+ [testcase] +-------------------------------------------+
+
+test11:
+     [echo] Division by zero test
+    [a:try] Task 'a:math' in target 'test11' failed, error message is: java.lang.ArithmeticException
+ [testcase] ERROR: test11 failed: java.lang.ArithmeticException: / by zero
+
+test10:
+     [echo] Circle area test
+ [testcase] ERROR: test10 failed: string or property must be set.
+ [testcase] +-------------------------------------------+
+ [testcase] + math_precision_tests
+ [testcase] +-------------------------------------------+
+ [testcase]
+ [testcase] ---- Errors ---------------------------------
+ [testcase] ERROR: test11 failed: java.lang.ArithmeticException: / by zero
+ [testcase] ERROR: test10 failed: string or property must be set.
+ [testcase] ---- Results --------------------------------
+ [testcase] Ran 2 out of 2 tests.
+ [testcase] Passed: 0
+ [testcase] Warning: 0
+ [testcase] Failed: 2
+ [testcase] +-------------------------------------------+
+ [testcase] +-------------------------------------------+
+ [testcase] + math_rules_tests
+ [testcase] +-------------------------------------------+
+
+test7.2:
+ [testcase] test7.2 passed.
+
+test7.1:
+ [testcase] test7.1 passed.
+
+test7.0:
+ [testcase] test7.0 passed.
+
+test8.3:
+ [testcase] test8.3 passed.
+
+test8.2:
+ [testcase] test8.2 passed.
+
+test9:
+ [testcase] test9 passed.
+
+test8.1:
+ [testcase] test8.1 passed.
+
+test8.0:
+ [testcase] test8.0 passed.
+ [testcase] +-------------------------------------------+
+ [testcase] + math_rules_tests
+ [testcase] +-------------------------------------------+
+ [testcase] ---- Results --------------------------------
+ [testcase] Ran 8 out of 8 tests.
+ [testcase] Passed: 8
+ [testcase] Warning: 0
+ [testcase] Failed: 0
+ [testcase] +-------------------------------------------+
+    [suite] ++-- Totals -------------------------------++
+    [suite] ++ Total Ran 16 out of 16 tests.
+    [suite] ++ Total Passed: 13
+    [suite] ++ Total Warnings: 0
+    [suite] ++ Total Failed: 3
+    [suite] ++-----------------------------------------++
+
+BUILD SUCCESSFUL
+Total time: 1 second
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch24.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch26.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 24. Repeat Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 26. TestCase Task</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch26.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch26.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch26.html	(revision 15023)
@@ -0,0 +1,96 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 26. TestCase Task</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch25.html" title="Chapter 25. Suite Task"><link rel="next" href="bk03ch27.html" title="Chapter 27. Performance Monitoring"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 26. TestCase Task</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch25.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch27.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="testcasetask"></a>Chapter 26. TestCase Task</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+ Modeled after the TestCase provided by jUnit, this class is an Ant task that
+ looks through the build file that contains this task, calls a 'setUp' target
+ (if it exists), then all targets whose names start with 'test', and last calls
+ a target named 'tearDown' (if it exists).  Both 'setUp' and 'tearDown' are
+ optional targets in the build file.
+</p><p>
+ Ant stores targets in a hashtable, so there is no guaranteed order in which
+ the 'test*' targets will be called.  If order is important, use the 'depends'
+ attribue of a target to enforce order, and do not name dependent targets with
+ a name starting with 'test'.
+</p><p>
+ Most unit tests will make use of Assert.  As the Assert task requires that the property "ant.enable.asserts" be set to true before it will do anything, this task automatically sets this property to true. The Assert task has a "level" attribute.  By default, the level is set to "error", so if the Assert fails, the TestCase fails.  If the level is set to "warning", the test case will be marked as a warning rather than a failure.  If the level is set to "info" or "debug" and the Assert fails, any message associated with the Assert will be written out, but otherwise will be ignored by TestCase.
+</p><p>
+To use this task in your build files, include a task definition like this:
+</p><pre class="programlisting">
+
+    &lt;taskdef name="testcase" classname="ise.antelope.tasks.TestCase"/&gt;
+   
+</pre><p>
+</p><p>
+</p><div class="table"><a name="id2526309"></a><p class="title"><b>Table 26.1. TestCase Attributes</b></p><table summary="TestCase Attributes" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>Attribute</th><th>Description</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>file</td><td>The file containing tests.</td><td>None</td><td>Yes</td></tr><tr><td>enabled</td><td>Determines if this test should be ran.  By using a property for this attribute, it is easy to turn off/on multiple tests.</td><td>On</td><td>No</td></tr><tr><td>assertenabled</td><td>Generally tests will use the Assert task.  This attribute sets whether asserts should be enabled.</td><td>Yes</td><td>No</td></tr><tr><td>failonerror</td><td>If true, cause the build to fail. By default, a failed test does not cause the build to fail, so all tests may have the opportunity to run.</td><td>No</td><td>No</td></tr><tr><td>showoutput</td><td>If true, show intermediate test results</td><td>Yes</td><td>No</td></tr><tr><td>showsummary</td><td>If true, show a summary of test results at the end of the test run.</td><td>Yes</td><td>Yes</td></tr></tbody></table></div><p>
+</p><p>
+TestCase is most often used in conjunction with the Suite task.
+</p><p>
+</p><pre class="programlisting">
+
+&lt;project name="mathtest" basedir="." default="suite"
+   xmlns:a="antlib:ise.antelope.tasks"&gt;
+
+   &lt;description&gt;
+     Build file to run unit tests for the Math task
+   &lt;/description&gt;
+
+   &lt;a:suite&gt;
+      &lt;a:testcase file="math_basic_tests.xml"/&gt;
+      &lt;a:testcase file="math_rules_tests.xml"/&gt;
+      &lt;a:testcase file="math_precision_tests.xml"/&gt;
+   &lt;/a:suite&gt;
+
+&lt;/project&gt;
+
+</pre><p>
+</p><p>
+Here is an example build file containing actual tests.  The 'setUp' target will execute first, then the two test targets.
+</p><p>
+</p><pre class="programlisting">
+
+&lt;project name="math_precision_tests" basedir="." default="suite"
+   xmlns:a="antlib:ise.antelope.tasks"&gt;
+
+   &lt;target name="setUp"&gt;
+      &lt;echo&gt;Running math precision tests.&lt;/echo&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test10"&gt;
+      &lt;echo&gt;Circle area test&lt;/echo&gt;
+      &lt;a:math result="pi"&gt;
+         &lt;a:op op="*"&gt;
+            &lt;a:num value="PI"/&gt;
+            &lt;a:op op="pow"&gt;
+               &lt;a:num value="1"/&gt;
+               &lt;a:num value="2"/&gt;
+            &lt;/a:op&gt;
+         &lt;/a:op&gt;
+      &lt;/a:math&gt;
+      &lt;a:assert message="failed circle area test"&gt;
+         &lt;a:bool&gt;
+            &lt;a:startswith string="${pi}" with="3.141592653589793"/&gt;
+         &lt;/a:bool&gt;
+      &lt;/a:assert&gt;
+   &lt;/target&gt;
+
+   &lt;target name="test11"&gt;
+      &lt;echo&gt;Division by zero test&lt;/echo&gt;
+      &lt;!-- division by zero --&gt;
+      &lt;a:try&gt;
+         &lt;a:math result="x"&gt;
+            &lt;a:op op="/"&gt;
+               &lt;a:num value="PI"/&gt;
+               &lt;a:num value="0"/&gt;
+            &lt;/a:op&gt;
+         &lt;/a:math&gt;
+         &lt;fail&gt;Division by 0 succeeded: ${x}&lt;/fail&gt;
+         &lt;catch&gt;
+            &lt;assert/&gt;
+         &lt;/catch&gt;
+      &lt;/a:try&gt;
+   &lt;/target&gt;
+
+&lt;/project&gt;
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch25.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch27.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 25. Suite Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 27. Performance Monitoring</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch27.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch27.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch27.html	(revision 15023)
@@ -0,0 +1,101 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 27. Performance Monitoring</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch26.html" title="Chapter 26. TestCase Task"><link rel="next" href="bk03ch28.html" title="Chapter 28. Feedback"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 27. Performance Monitoring</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch26.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> <a accesskey="n" href="bk03ch28.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="performance"></a>Chapter 27. Performance Monitoring</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+In addition to the tasks described in this manual, Antelope also ships with a special Ant listener than can keep track of the amount of time that each target and task takes to execute. At the end of the build, these times will be sorted from fastest to slowest and displayed following the build output. This can be useful to pinpoint slow and/or inefficient spots in the build process and identify those areas that could benefit from optimization.
+</p><p>
+The performance listener can be used outside of Antelope by passing a parameter to the command line for Ant:
+</p><p>
+</p><pre class="programlisting">
+
+    ant -listener ise.antelope.common.AntPerformanceListener target
+
+</pre><p>
+</p><p>
+Following is an example of the results from using the listener. The result format is projectname.targetname for targets and projectname.targetname.taskname for tasks. All times are shown to the nearest millisecond.
+</p><pre class="programlisting">
+
+[danson@blackdog antelope]$ ant -listener ise.antelope.common.AntPerformanceListener dist
+Buildfile: build.xml
+
+init:
+
+clean:
+   [delete] Deleting 170 files from /home/danson/apps/antelope/build
+
+compile:
+    [javac] Compiling 61 source files to /home/danson/apps/antelope/build
+
+all:
+
+-build_number:
+
+prep_files:
+   [delete] Deleting 3 files from /home/danson/apps/antelope/config
+     [copy] Copying 3 files to /home/danson/apps/antelope/config
+
+combined:
+     [echo] basedir = /home/danson/apps/antelope
+      [jar] Building jar: /home/danson/apps/antelope/Antelope_1.208.jar
+
+dist:
+   [delete] Deleting 4 files from /home/danson/apps/antelope/dist
+      [zip] Building zip: /home/danson/apps/antelope/dist/Antelope_1.208.zip
+     [echo] Created zip file.
+
+-zip_docs:
+      [zip] Building zip: /home/danson/apps/antelope/dist/Antelope_docs_1.208.zip
+     [echo] Zipped docs to Antelope_docs_1.208.zip.
+
+-zip_tasks:
+      [jar] Building jar: /tmp/Antelope_tasks_1.208.jar
+      [zip] Building zip: /home/danson/apps/antelope/dist/Antelope_tasks_1.208.zip
+   [delete] Deleting: /tmp/Antelope_tasks_1.208.jar
+     [echo] Zipped tasks to Antelope_tasks_1.208.zip.
+     [copy] Copying 1 file to /home/danson/apps/antelope/dist
+
+BUILD SUCCESSFUL
+Total time: 8 seconds
+
+-------------- Target Results -----------------------
+Antelope.all: 0.000 sec
+Antelope.init: 0.011 sec
+Antelope.-build_number: 0.014 sec
+Antelope.clean: 0.233 sec
+Antelope.-zip_tasks: 0.297 sec
+Antelope.prep_files: 0.311 sec
+Antelope.-zip_docs: 0.546 sec
+Antelope.combined: 1.290 sec
+Antelope.compile: 1.724 sec
+Antelope.dist: 2.162 sec
+
+-------------- Task Results -----------------------
+Antelope.init.mkdir: 0.000 sec
+Antelope.init.mkdir: 0.001 sec
+Antelope.dist.echo: 0.002 sec
+Antelope.prep_files.delete: 0.004 sec
+Antelope.combined.echo: 0.005 sec
+Antelope.dist.delete: 0.006 sec
+Antelope.-zip_tasks.echo: 0.007 sec
+Antelope.dist.copy: 0.011 sec
+Antelope.-build_number.buildnumber: 0.014 sec
+Antelope.compile.copy: 0.016 sec
+Antelope.prep_files.copy: 0.020 sec
+Antelope.prep_files.replace: 0.071 sec
+Antelope.-zip_tasks.zip: 0.122 sec
+Antelope.-zip_tasks.jar: 0.161 sec
+Antelope.prep_files.replace: 0.216 sec
+Antelope.clean.delete: 0.233 sec
+Antelope.dist.antcall: 0.421 sec
+Antelope.-zip_docs.zip: 0.540 sec
+Antelope.dist.antcall: 0.685 sec
+Antelope.dist.zip: 1.036 sec
+Antelope.combined.jar: 1.284 sec
+Antelope.compile.javac: 1.708 sec
+
+-------------- Totals -----------------------
+Start time: Thu, 5 Dec 2002 17:18:30
+Stop time: Thu, 5 Dec 2002 17:18:39
+Total time: 8.476 sec
+
+</pre><p>
+</p></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch26.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="bk03ch28.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 26. TestCase Task </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 28. Feedback</td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch28.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch28.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/bk03ch28.html	(revision 15023)
@@ -0,0 +1,11 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 28. Feedback</title><meta name="generator" content="DocBook XSL Stylesheets V1.68.1"><link rel="start" href="index.html" title="Antelope Users Guide"><link rel="up" href="bk03.html" title="Additional Ant Tasks"><link rel="prev" href="bk03ch27.html" title="Chapter 27. Performance Monitoring"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 28. Feedback</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="bk03ch27.html">Prev</a> </td><th width="60%" align="center">Additional Ant Tasks</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="feedback"></a>Chapter 28. Feedback</h2></div></div></div>
+<STYLE TYPE="text/css"> <!-- @import url(./style.css); --> </STYLE>
+    <p>
+The preferred way to send bug reports is to use the
+Issue Tracker at
+<a href="http://antelope.tigris.org" target="_top">
+http://antelope.tigris.org
+</a>.
+</p><p>You can also write to me directly at:</p><div class="itemizedlist"><ul type="disc"><li><p>
+        Dale Anson <code class="email">&lt;<a href="mailto:danson@germane-software.com">danson@germane-software.com</a>&gt;</code>
+    </p></li></ul></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="bk03ch27.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="bk03.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top">Chapter 27. Performance Monitoring </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/style.css
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/style.css	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/docs/manual/style.css	(revision 15023)
@@ -0,0 +1,106 @@
+
+.dummy {color: red}
+
+ADDRESS, BLOCKQUOTE, BODY, CAPTION, CENTER, DD, DIR, DIV, DL, DT, FORM, LI, MENU, OL, P, PRE, TD, TH, TR, UL {
+   font-family: verdana, tahoma, geneva, sans-serif;
+   font-size: 12px;
+   color: black;
+}
+
+A {
+   cursor: pointer; 
+   background: transparent;
+   text-decoration: none;
+}
+A:link {color: black; text-decoration: underline}
+A:visited {color: gray; text-decoration: underline}
+A:active {color: black;}
+A:hover {color: gray; background: white}
+
+ADDRESS {font-style: italic}
+
+BIG {font-size: 19px}
+
+BLOCKQUOTE {font-style: italic}
+
+BODY {background: white}
+
+BUTTON {cursor: auto}
+
+CITE {font-style: italic}
+
+.computeroutput {
+   font-family: monospace;
+   border: none;
+   padding: none;
+   background: none;
+}
+
+CODE, KBD, PRE, SAMP, TT {font-size: 12px}
+
+CODE, PRE {
+   font-family: monospace;
+}
+
+
+PRE.PROGRAMLISTING {
+   font-family: monospace;
+   border: solid thin;
+   padding: 2em;
+   background: white;
+}
+
+DT {font-weight: bold}
+
+H1, H2, H3, H4, H5, H6 {
+   font-weight: bold;
+   font-family: verdana, tahoma, geneva, sans-serif;
+   color: black;
+   margin: 0 0 0 0;
+}
+
+H1 {font-size: 22px}
+H2 {font-size: 20px}
+H3 {font-size: 18px}
+H4 {font-size: 16px}
+H5 {font-size: 14px}
+H6 {font-size: 12px}
+
+HTML {margin: 0; padding: 0}
+
+INPUT {cursor: auto}
+
+OL {list-style: decimal}
+UL {list-style: disc}
+
+PRE {margin-left: 0; white-space: pre}
+
+SMALL, SUB, SUP {font-size: 10px}
+
+TEXTAREA {cursor: text}
+
+TABLE {
+   border: solid thin; 
+   background: white; 
+   cellpadding: 3; 
+   cellspacing: 0; 
+}
+
+TD {
+   padding: 3;
+   background: white;
+}
+
+TH {
+   font-weight: bold;
+   text-align: center;
+   margin-left: 0;
+   background: #ADD8E6; 
+   color: black;
+}
+
+
+
+
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/install_tasks.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/install_tasks.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/install_tasks.txt	(revision 15023)
@@ -0,0 +1,15 @@
+Antelope Tasks Installation:
+
+Make sure Ant is installed correctly. Locate the directory where Ant is 
+installed. Locate a directory named "lib" in that directory.
+
+Unzip the distribution file. It will create a directory named 
+AntelopeTasks_3.4.2.
+
+Change to the AntelopeTasks_3.4.2 directory. In this directory will be a 
+jar file named AntelopeTasks_3.4.2.jar.
+
+Copy the jar file to Ant's "lib" directory. 
+
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/license.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/license.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/license.txt	(revision 15023)
@@ -0,0 +1,52 @@
+license.txt
+
+This license pertains to all files in the Antelope distribution except the images, 
+which are from Sun's Java Look and Feel Design Guidelines and are licensed according 
+to those guidelines.
+
+
+Based on the Apache Software License, Version 1.1
+
+Copyright (c) 2002 Dale Anson.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+3. The end-user documentation included with the redistribution, if
+   any, must include the following acknowlegement:
+      "This product includes software developed by Dale Anson,
+       danson@users.sourceforge.net."
+   Alternately, this acknowlegement may appear in the software itself,
+   if and wherever such third-party acknowlegements normally appear.
+
+4. The name "Antelope" must not be used to endorse or promote products derived
+   from this software without prior written permission. For written
+   permission, please contact danson@users.sourceforge.net.
+
+5. Products derived from this software may not be called "Antelope"
+   nor may "Antelope" appear in their names without prior written
+   permission of Dale Anson.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED.  IN NO EVENT SHALL DALE ANSON OR ANY PROJECT
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntCallBack.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntCallBack.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntCallBack.java	(revision 15023)
@@ -0,0 +1,686 @@
+/*
+ *  The Apache Software License, Version 1.1
+ *
+ *  Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
+ *  reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in
+ *  the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *  3. The end-user documentation included with the redistribution, if
+ *  any, must include the following acknowlegement:
+ *  "This product includes software developed by the
+ *  Apache Software Foundation (http://www.apache.org/)."
+ *  Alternately, this acknowlegement may appear in the software itself,
+ *  if and wherever such third-party acknowlegements normally appear.
+ *
+ *  4. The names "The Jakarta Project", "Ant", and "Apache Software
+ *  Foundation" must not be used to endorse or promote products derived
+ *  from this software without prior written permission. For written
+ *  permission, please contact apache@apache.org.
+ *
+ *  5. Products derived from this software may not be called "Apache"
+ *  nor may "Apache" appear in their names without prior written
+ *  permission of the Apache Group.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *  SUCH DAMAGE.
+ *  ====================================================================
+ *
+ *  This software consists of voluntary contributions made by many
+ *  individuals on behalf of the Apache Software Foundation.  For more
+ *  information on the Apache Software Foundation, please see
+ *  <http://www.apache.org/>.
+ */
+package ise.antelope.tasks;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.ProjectHelper;
+
+import org.apache.tools.ant.Task;
+
+import org.apache.tools.ant.taskdefs.Property;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Identical (copy and paste, even) to the 'Ant' task, with the exception that
+ * properties from the new project can be copied back into the original project.
+ * Further modified to emulate "antcall". Build a sub-project. <pre>
+ *  &lt;target name=&quot;foo&quot; depends=&quot;init&quot;&gt;
+ *    &lt;ant antfile=&quot;build.xml&quot; target=&quot;bar&quot; &gt;
+ *      &lt;property name=&quot;property1&quot; value=&quot;aaaaa&quot; /&gt;
+ *      &lt;property name=&quot;foo&quot; value=&quot;baz&quot; /&gt;
+ *    &lt;/ant&gt;</SPAN> &lt;/target&gt;</SPAN> &lt;target name=&quot;bar&quot;
+ * depends=&quot;init&quot;&gt; &lt;echo message=&quot;prop is ${property1}
+ * ${foo}&quot; /&gt; &lt;/target&gt; </pre>
+ *
+ * @author     costin@dnt.ro
+ * @author     Dale Anson, danson@germane-software.com
+ * @since      Ant 1.1
+ * @ant.task   category="control"
+ */
+public class AntCallBack extends Task {
+
+   /** the basedir where is executed the build file */
+   private File dir = null;
+
+   /**
+    * the build.xml file (can be absolute) in this case dir will be ignored
+    */
+   private String antFile = null;
+
+   /** the target to call if any */
+   private String target = null;
+
+   /** the output */
+   private String output = null;
+
+   /** should we inherit properties from the parent ? */
+   private boolean inheritAll = true;
+
+   /** should we inherit references from the parent ? */
+   private boolean inheritRefs = false;
+
+   /** the properties to pass to the new project */
+   private Vector properties = new Vector();
+
+   /** the references to pass to the new project */
+   private Vector references = new Vector();
+
+   /** the temporary project created to run the build file */
+   private Project newProject;
+
+   /** The stream to which output is to be written. */
+   private PrintStream out = null;
+
+   /** the name of the property to fetch from the new project */
+   private String returnName = null;
+
+
+   /**
+    * If true, pass all properties to the new Ant project. Defaults to true.
+    *
+    * @param value  The new inheritAll value
+    */
+   public void setInheritAll( boolean value ) {
+      inheritAll = value;
+   }
+
+
+   /**
+    * If true, pass all references to the new Ant project. Defaults to false.
+    *
+    * @param value  The new inheritRefs value
+    */
+   public void setInheritRefs( boolean value ) {
+      inheritRefs = value;
+   }
+
+
+   /** Creates a Project instance for the project to call. */
+   public void init() {
+      newProject = new Project();
+      newProject.setJavaVersionProperty();
+      newProject.addTaskDefinition( "property",
+            (Class)getProject().getTaskDefinitions().get( "property" ) );
+   }
+
+
+   /**
+    * Called in execute or createProperty if newProject is null. <p>
+    *
+    * This can happen if the same instance of this task is run twice as
+    * newProject is set to null at the end of execute (to save memory and help
+    * the GC).</p> <p>
+    *
+    * Sets all properties that have been defined as nested property elements.
+    * </p>
+    */
+   private void reinit() {
+      init();
+      final int count = properties.size();
+      for ( int i = 0; i < count; i++ ) {
+         Property p = (Property)properties.elementAt( i );
+         Property newP = (Property)newProject.createTask( "property" );
+         newP.setName( p.getName() );
+         if ( p.getValue() != null ) {
+            newP.setValue( p.getValue() );
+         }
+         if ( p.getFile() != null ) {
+            newP.setFile( p.getFile() );
+         }
+         if ( p.getResource() != null ) {
+            newP.setResource( p.getResource() );
+         }
+         if ( p.getPrefix() != null ) {
+            newP.setPrefix( p.getPrefix() );
+         }
+         if ( p.getRefid() != null ) {
+            newP.setRefid( p.getRefid() );
+         }
+         if ( p.getEnvironment() != null ) {
+            newP.setEnvironment( p.getEnvironment() );
+         }
+         if ( p.getClasspath() != null ) {
+            newP.setClasspath( p.getClasspath() );
+         }
+         properties.setElementAt( newP, i );
+      }
+   }
+
+
+   /**
+    * Attaches the build listeners of the current project to the new project,
+    * configures a possible logfile, transfers task and data-type definitions,
+    * transfers properties (either all or just the ones specified as user
+    * properties to the current project, depending on inheritall), transfers the
+    * input handler.
+    */
+   private void initializeProject() {
+      newProject.setInputHandler( getProject().getInputHandler() );
+
+      Vector listeners = getProject().getBuildListeners();
+      final int count = listeners.size();
+      for ( int i = 0; i < count; i++ ) {
+         newProject.addBuildListener( (BuildListener)listeners.elementAt( i ) );
+      }
+
+      if ( output != null ) {
+         File outfile = null;
+         if ( dir != null ) {
+            outfile = FileUtils.newFileUtils().resolveFile( dir, output );
+         }
+         else {
+            outfile = getProject().resolveFile( output );
+         }
+         try {
+            out = new PrintStream( new FileOutputStream( outfile ) );
+            DefaultLogger logger = new DefaultLogger();
+            logger.setMessageOutputLevel( Project.MSG_INFO );
+            logger.setOutputPrintStream( out );
+            logger.setErrorPrintStream( out );
+            newProject.addBuildListener( logger );
+         }
+         catch ( IOException ex ) {
+            log( "Ant: Can't set output to " + output );
+         }
+      }
+
+      Hashtable taskdefs = getProject().getTaskDefinitions();
+      Enumeration et = taskdefs.keys();
+      while ( et.hasMoreElements() ) {
+         String taskName = (String)et.nextElement();
+         if ( taskName.equals( "property" ) ) {
+            // we have already added this taskdef in #init
+            continue;
+         }
+         Class taskClass = (Class)taskdefs.get( taskName );
+         newProject.addTaskDefinition( taskName, taskClass );
+      }
+
+      Hashtable typedefs = getProject().getDataTypeDefinitions();
+      Enumeration e = typedefs.keys();
+      while ( e.hasMoreElements() ) {
+         String typeName = (String)e.nextElement();
+         Class typeClass = (Class)typedefs.get( typeName );
+         newProject.addDataTypeDefinition( typeName, typeClass );
+      }
+
+      // set user-defined properties
+      getProject().copyUserProperties( newProject );
+
+      if ( !inheritAll ) {
+         // set Java built-in properties separately,
+         // b/c we won't inherit them.
+         newProject.setSystemProperties();
+
+      }
+      else {
+         // set all properties from calling project
+
+         Hashtable props = getProject().getProperties();
+         e = props.keys();
+         while ( e.hasMoreElements() ) {
+            String arg = e.nextElement().toString();
+            if ( "basedir".equals( arg ) || "ant.file".equals( arg ) ) {
+               // basedir and ant.file get special treatment in execute()
+               continue;
+            }
+
+            String value = props.get( arg ).toString();
+            // don't re-set user properties, avoid the warning message
+            if ( newProject.getProperty( arg ) == null ) {
+               // no user property
+               newProject.setNewProperty( arg, value );
+            }
+         }
+      }
+   }
+
+
+   /**
+    * Pass output sent to System.out to the new project.
+    *
+    * @param line  Description of the Parameter
+    * @since       Ant 1.5
+    */
+   protected void handleOutput( String line ) {
+      if ( newProject != null ) {
+         newProject.demuxOutput( line, false );
+      }
+      else {
+         super.handleOutput( line );
+      }
+   }
+
+
+   /**
+    * Pass output sent to System.err to the new project.
+    *
+    * @param line  Description of the Parameter
+    * @since       Ant 1.5
+    */
+   protected void handleErrorOutput( String line ) {
+      if ( newProject != null ) {
+         newProject.demuxOutput( line, true );
+      }
+      else {
+         super.handleErrorOutput( line );
+      }
+   }
+
+
+   /**
+    * Do the execution.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   public void execute() throws BuildException {
+      setAntfile( getProject().getProperty( "ant.file" ) );
+
+      File savedDir = dir;
+      String savedAntFile = antFile;
+      String savedTarget = target;
+      try {
+         if ( newProject == null ) {
+            reinit();
+         }
+
+         if ( ( dir == null ) && ( inheritAll ) ) {
+            dir = getProject().getBaseDir();
+         }
+
+         initializeProject();
+
+         if ( dir != null ) {
+            newProject.setBaseDir( dir );
+            if ( savedDir != null ) {   // has been set explicitly
+               newProject.setInheritedProperty( "basedir",
+                     dir.getAbsolutePath() );
+            }
+         }
+         else {
+            dir = getProject().getBaseDir();
+         }
+
+         overrideProperties();
+
+         if ( antFile == null ) {
+            throw new BuildException( "Attribute target is required.",
+                  getLocation() );
+            //antFile = "build.xml";
+         }
+
+         File file = FileUtils.newFileUtils().resolveFile( dir, antFile );
+         antFile = file.getAbsolutePath();
+
+         log( "calling target " + ( target != null ? target : "[default]" )
+                + " in build file " + antFile.toString(),
+               Project.MSG_VERBOSE );
+         newProject.setUserProperty( "ant.file", antFile );
+         ProjectHelper.getProjectHelper().parse( newProject, new File( antFile ) );
+
+         if ( target == null ) {
+            target = newProject.getDefaultTarget();
+         }
+
+         addReferences();
+
+         // Are we trying to call the target in which we are defined?
+         if ( newProject.getBaseDir().equals( getProject().getBaseDir() ) &&
+               newProject.getProperty( "ant.file" ).equals( getProject().getProperty( "ant.file" ) ) &&
+               getOwningTarget() != null &&
+               target.equals( this.getOwningTarget().getName() ) ) {
+
+            throw new BuildException( "antcallback task calling its own parent "
+                   + "target" );
+         }
+
+         newProject.executeTarget( target );
+         
+         // copy back the props if possible
+         if ( returnName != null ) {
+            StringTokenizer st = new StringTokenizer( returnName, "," );
+            while ( st.hasMoreTokens() ) {
+               String name = st.nextToken().trim();
+               String value = newProject.getUserProperty( name );
+               if ( value != null ) {
+                  getProject().setUserProperty( name, value );
+               }
+               else {
+                  value = newProject.getProperty( name );
+                  if ( value != null ) {
+                     getProject().setProperty( name, value );
+                  }
+               }
+            }
+         }
+      }
+      finally {
+         // help the gc
+         newProject = null;
+         if ( output != null && out != null ) {
+            try {
+               out.close();
+            }
+            catch ( final Exception e ) {
+               //ignore
+            }
+         }
+         dir = savedDir;
+         antFile = savedAntFile;
+         target = savedTarget;
+      }
+   }
+
+
+   /**
+    * Override the properties in the new project with the one explicitly defined
+    * as nested elements here.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void overrideProperties() throws BuildException {
+      Enumeration e = properties.elements();
+      while ( e.hasMoreElements() ) {
+         Property p = (Property)e.nextElement();
+         p.setProject( newProject );
+         p.execute();
+      }
+      getProject().copyInheritedProperties( newProject );
+   }
+
+
+   /**
+    * Add the references explicitly defined as nested elements to the new
+    * project. Also copy over all references that don't override existing
+    * references in the new project if inheritrefs has been requested.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void addReferences() throws BuildException {
+      Hashtable thisReferences = (Hashtable)getProject().getReferences().clone();
+      Hashtable newReferences = newProject.getReferences();
+      Enumeration e;
+      if ( references.size() > 0 ) {
+         for ( e = references.elements(); e.hasMoreElements();  ) {
+            Reference ref = (Reference)e.nextElement();
+            String refid = ref.getRefId();
+            if ( refid == null ) {
+               throw new BuildException( "the refid attribute is required"
+                      + " for reference elements" );
+            }
+            if ( !thisReferences.containsKey( refid ) ) {
+               log( "Parent project doesn't contain any reference '"
+                      + refid + "'",
+                     Project.MSG_WARN );
+               continue;
+            }
+
+            thisReferences.remove( refid );
+            String toRefid = ref.getToRefid();
+            if ( toRefid == null ) {
+               toRefid = refid;
+            }
+            copyReference( refid, toRefid );
+         }
+      }
+
+      // Now add all references that are not defined in the
+      // subproject, if inheritRefs is true
+      if ( inheritRefs ) {
+         for ( e = thisReferences.keys(); e.hasMoreElements();  ) {
+            String key = (String)e.nextElement();
+            if ( newReferences.containsKey( key ) ) {
+               continue;
+            }
+            copyReference( key, key );
+         }
+      }
+   }
+
+
+   /**
+    * Try to clone and reconfigure the object referenced by oldkey in the parent
+    * project and add it to the new project with the key newkey. <p>
+    *
+    * If we cannot clone it, copy the referenced object itself and keep our
+    * fingers crossed.</p>
+    *
+    * @param oldKey  Description of the Parameter
+    * @param newKey  Description of the Parameter
+    */
+   private void copyReference( String oldKey, String newKey ) {
+      Object orig = getProject().getReference( oldKey );
+      Class c = orig.getClass();
+      Object copy = orig;
+      try {
+         Method cloneM = c.getMethod( "clone", new Class[0] );
+         if ( cloneM != null ) {
+            copy = cloneM.invoke( orig, new Object[0] );
+         }
+      }
+      catch ( Exception e ) {
+         // not Clonable
+      }
+
+      if ( copy instanceof ProjectComponent ) {
+         ( (ProjectComponent)copy ).setProject( newProject );
+      }
+      else {
+         try {
+            Method setProjectM =
+                  c.getMethod( "setProject", new Class[]{Project.class} );
+            if ( setProjectM != null ) {
+               setProjectM.invoke( copy, new Object[]{newProject} );
+            }
+         }
+         catch ( NoSuchMethodException e ) {
+            // ignore this if the class being referenced does not have
+            // a set project method.
+         }
+         catch ( Exception e2 ) {
+            String msg = "Error setting new project instance for "
+                   + "reference with id " + oldKey;
+            throw new BuildException( msg, e2, getLocation() );
+         }
+      }
+      newProject.addReference( newKey, copy );
+   }
+
+
+   /**
+    * The directory to use as a base directory for the new Ant project. Defaults
+    * to the current project's basedir, unless inheritall has been set to false,
+    * in which case it doesn't have a default value. This will override the
+    * basedir setting of the called project.
+    *
+    * @param d  The new dir value
+    */
+   public void setDir( File d ) {
+      this.dir = d;
+   }
+
+
+   /**
+    * The build file to use. Defaults to "build.xml". This file is expected to
+    * be a filename relative to the dir attribute given.
+    *
+    * @param s  The new antfile value
+    */
+   public void setAntfile( String s ) {
+      // @note: it is a string and not a file to handle relative/absolute
+      // otherwise a relative file will be resolved based on the current
+      // basedir.
+      this.antFile = s;
+   }
+
+
+   /**
+    * The target of the new Ant project to execute. Defaults to the new
+    * project's default target.
+    *
+    * @param s  The new target value
+    */
+   public void setTarget( String s ) {
+      this.target = s;
+   }
+
+
+   /**
+    * Filename to write the output to. This is relative to the value of the dir
+    * attribute if it has been set or to the base directory of the current
+    * project otherwise.
+    *
+    * @param s  The new output value
+    */
+   public void setOutput( String s ) {
+      this.output = s;
+   }
+
+
+   /**
+    * Property to pass to the new project. The property is passed as a 'user
+    * property'
+    *
+    * @return   Description of the Return Value
+    */
+   public Property createProperty() {
+      if ( newProject == null ) {
+         reinit();
+      }
+      /*
+       *  Property p = new Property( true, getProject() );
+       */
+      Property p = new Property();
+      p.setProject( newProject );
+      p.setTaskName( "property" );
+      properties.addElement( p );
+      return p;
+   }
+
+
+    /**
+     * Property to pass to the invoked target.
+     */
+    public Property createParam() {
+        return createProperty();
+    }
+
+   /**
+    * Set the property or properties that are set in the new project to be
+    * transfered back to the original project. As with all properties, if the
+    * property already exists in the original project, it will not be overridden
+    * by a different value from the new project.
+    *
+    * @param r  the name of a property in the new project to set in the original
+    *      project. This may be a comma separate list of properties.
+    */
+   public void setReturn( String r ) {
+      returnName = r;
+   }
+
+
+   /**
+    * Reference element identifying a data type to carry over to the new
+    * project.
+    *
+    * @param r  The feature to be added to the Reference attribute
+    */
+   public void addReference( Reference r ) {
+      references.addElement( r );
+   }
+
+
+   /**
+    * Helper class that implements the nested &lt;reference&gt; element of
+    * &lt;ant&gt; and &lt;antcall&gt;.
+    *
+    * @author   danson
+    */
+   public static class Reference
+          extends org.apache.tools.ant.types.Reference {
+
+      /** Creates a reference to be configured by Ant */
+      public Reference() {
+         super();
+      }
+
+
+      private String targetid = null;
+
+
+      /**
+       * Set the id that this reference to be stored under in the new project.
+       *
+       * @param targetid  the id under which this reference will be passed to
+       *      the new project
+       */
+      public void setToRefid( String targetid ) {
+         this.targetid = targetid;
+      }
+
+
+      /**
+       * Get the id under which this reference will be stored in the new project
+       *
+       * @return   the id of the reference in the new project.
+       */
+      public String getToRefid() {
+         return targetid;
+      }
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntFetch.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntFetch.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntFetch.java	(revision 15023)
@@ -0,0 +1,675 @@
+/*
+ *  The Apache Software License, Version 1.1
+ *
+ *  Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
+ *  reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *  notice, this list of conditions and the following disclaimer.
+ *
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in
+ *  the documentation and/or other materials provided with the
+ *  distribution.
+ *
+ *  3. The end-user documentation included with the redistribution, if
+ *  any, must include the following acknowlegement:
+ *  "This product includes software developed by the
+ *  Apache Software Foundation (http://www.apache.org/)."
+ *  Alternately, this acknowlegement may appear in the software itself,
+ *  if and wherever such third-party acknowlegements normally appear.
+ *
+ *  4. The names "The Jakarta Project", "Ant", and "Apache Software
+ *  Foundation" must not be used to endorse or promote products derived
+ *  from this software without prior written permission. For written
+ *  permission, please contact apache@apache.org.
+ *
+ *  5. Products derived from this software may not be called "Apache"
+ *  nor may "Apache" appear in their names without prior written
+ *  permission of the Apache Group.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *  SUCH DAMAGE.
+ *  ====================================================================
+ *
+ *  This software consists of voluntary contributions made by many
+ *  individuals on behalf of the Apache Software Foundation.  For more
+ *  information on the Apache Software Foundation, please see
+ *  <http://www.apache.org/>.
+ */
+package ise.antelope.tasks;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.ProjectHelper;
+
+import org.apache.tools.ant.Task;
+
+import org.apache.tools.ant.taskdefs.Property;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Identical (copy and paste, even) to the 'Ant' task, with the exception that
+ * properties from the new project can be copied back into the original project.
+ * Build a sub-project. <pre>
+ *  &lt;target name=&quot;foo&quot; depends=&quot;init&quot;&gt;
+ *    &lt;ant antfile=&quot;build.xml&quot; target=&quot;bar&quot; &gt;
+ *      &lt;property name=&quot;property1&quot; value=&quot;aaaaa&quot; /&gt;
+ *      &lt;property name=&quot;foo&quot; value=&quot;baz&quot; /&gt;
+ *    &lt;/ant&gt;</SPAN> &lt;/target&gt;</SPAN> &lt;target name=&quot;bar&quot;
+ * depends=&quot;init&quot;&gt; &lt;echo message=&quot;prop is ${property1}
+ * ${foo}&quot; /&gt; &lt;/target&gt; </pre>
+ *
+ * @author     costin@dnt.ro
+ * @author     Dale Anson, danson@germane-software.com
+ * @since      Ant 1.1
+ * @ant.task   category="control"
+ */
+public class AntFetch extends Task {
+
+   /** the basedir where is executed the build file */
+   private File dir = null;
+
+   /**
+    * the build.xml file (can be absolute) in this case dir will be ignored
+    */
+   private String antFile = null;
+
+   /** the target to call if any */
+   private String target = null;
+
+   /** the output */
+   private String output = null;
+
+   /** should we inherit properties from the parent ? */
+   private boolean inheritAll = true;
+
+   /** should we inherit references from the parent ? */
+   private boolean inheritRefs = false;
+
+   /** the properties to pass to the new project */
+   private Vector properties = new Vector();
+
+   /** the references to pass to the new project */
+   private Vector references = new Vector();
+
+   /** the temporary project created to run the build file */
+   private Project newProject;
+
+   /** The stream to which output is to be written. */
+   private PrintStream out = null;
+
+   /** the name of the property to fetch from the new project */
+   private String returnName = null;
+
+
+   /**
+    * If true, pass all properties to the new Ant project. Defaults to true.
+    *
+    * @param value  The new inheritAll value
+    */
+   public void setInheritAll( boolean value ) {
+      inheritAll = value;
+   }
+
+
+   /**
+    * If true, pass all references to the new Ant project. Defaults to false.
+    *
+    * @param value  The new inheritRefs value
+    */
+   public void setInheritRefs( boolean value ) {
+      inheritRefs = value;
+   }
+
+
+   /** Creates a Project instance for the project to call.  */
+   public void init() {
+      newProject = new Project();
+      newProject.setJavaVersionProperty();
+      newProject.addTaskDefinition( "property",
+            (Class)getProject().getTaskDefinitions()
+            .get( "property" ) );
+   }
+
+
+   /**
+    * Called in execute or createProperty if newProject is null. <p>
+    *
+    * This can happen if the same instance of this task is run twice as
+    * newProject is set to null at the end of execute (to save memory and help
+    * the GC).</p> <p>
+    *
+    * Sets all properties that have been defined as nested property elements.
+    * </p>
+    */
+   private void reinit() {
+      init();
+      final int count = properties.size();
+      for ( int i = 0; i < count; i++ ) {
+         Property p = (Property)properties.elementAt( i );
+         Property newP = (Property)newProject.createTask( "property" );
+         newP.setName( p.getName() );
+         if ( p.getValue() != null ) {
+            newP.setValue( p.getValue() );
+         }
+         if ( p.getFile() != null ) {
+            newP.setFile( p.getFile() );
+         }
+         if ( p.getResource() != null ) {
+            newP.setResource( p.getResource() );
+         }
+         if ( p.getPrefix() != null ) {
+            newP.setPrefix( p.getPrefix() );
+         }
+         if ( p.getRefid() != null ) {
+            newP.setRefid( p.getRefid() );
+         }
+         if ( p.getEnvironment() != null ) {
+            newP.setEnvironment( p.getEnvironment() );
+         }
+         if ( p.getClasspath() != null ) {
+            newP.setClasspath( p.getClasspath() );
+         }
+         properties.setElementAt( newP, i );
+      }
+   }
+
+
+   /**
+    * Attaches the build listeners of the current project to the new project,
+    * configures a possible logfile, transfers task and data-type definitions,
+    * transfers properties (either all or just the ones specified as user
+    * properties to the current project, depending on inheritall), transfers the
+    * input handler.
+    */
+   private void initializeProject() {
+      newProject.setInputHandler( getProject().getInputHandler() );
+
+      Vector listeners = getProject().getBuildListeners();
+      final int count = listeners.size();
+      for ( int i = 0; i < count; i++ ) {
+         newProject.addBuildListener( (BuildListener)listeners.elementAt( i ) );
+      }
+
+      if ( output != null ) {
+         File outfile = null;
+         if ( dir != null ) {
+            outfile = FileUtils.newFileUtils().resolveFile( dir, output );
+         }
+         else {
+            outfile = getProject().resolveFile( output );
+         }
+         try {
+            out = new PrintStream( new FileOutputStream( outfile ) );
+            DefaultLogger logger = new DefaultLogger();
+            logger.setMessageOutputLevel( Project.MSG_INFO );
+            logger.setOutputPrintStream( out );
+            logger.setErrorPrintStream( out );
+            newProject.addBuildListener( logger );
+         }
+         catch ( IOException ex ) {
+            log( "Ant: Can't set output to " + output );
+         }
+      }
+
+      Hashtable taskdefs = getProject().getTaskDefinitions();
+      Enumeration et = taskdefs.keys();
+      while ( et.hasMoreElements() ) {
+         String taskName = (String)et.nextElement();
+         if ( taskName.equals( "property" ) ) {
+            // we have already added this taskdef in #init
+            continue;
+         }
+         Class taskClass = (Class)taskdefs.get( taskName );
+         newProject.addTaskDefinition( taskName, taskClass );
+      }
+
+      Hashtable typedefs = getProject().getDataTypeDefinitions();
+      Enumeration e = typedefs.keys();
+      while ( e.hasMoreElements() ) {
+         String typeName = (String)e.nextElement();
+         Class typeClass = (Class)typedefs.get( typeName );
+         newProject.addDataTypeDefinition( typeName, typeClass );
+      }
+
+      // set user-defined properties
+      getProject().copyUserProperties( newProject );
+
+      if ( !inheritAll ) {
+         // set Java built-in properties separately,
+         // b/c we won't inherit them.
+         newProject.setSystemProperties();
+
+      }
+      else {
+         // set all properties from calling project
+
+         Hashtable props = getProject().getProperties();
+         e = props.keys();
+         while ( e.hasMoreElements() ) {
+            String arg = e.nextElement().toString();
+            if ( "basedir".equals( arg ) || "ant.file".equals( arg ) ) {
+               // basedir and ant.file get special treatment in execute()
+               continue;
+            }
+
+            String value = props.get( arg ).toString();
+            // don't re-set user properties, avoid the warning message
+            if ( newProject.getProperty( arg ) == null ) {
+               // no user property
+               newProject.setNewProperty( arg, value );
+            }
+         }
+      }
+   }
+
+
+   /**
+    * Pass output sent to System.out to the new project.
+    *
+    * @param line  Description of the Parameter
+    * @since       Ant 1.5
+    */
+   protected void handleOutput( String line ) {
+      if ( newProject != null ) {
+         newProject.demuxOutput( line, false );
+      }
+      else {
+         super.handleOutput( line );
+      }
+   }
+
+
+   /**
+    * Pass output sent to System.err to the new project.
+    *
+    * @param line  Description of the Parameter
+    * @since       Ant 1.5
+    */
+   protected void handleErrorOutput( String line ) {
+      if ( newProject != null ) {
+         newProject.demuxOutput( line, true );
+      }
+      else {
+         super.handleErrorOutput( line );
+      }
+   }
+
+
+   /**
+    * Do the execution.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   public void execute() throws BuildException {
+      File savedDir = dir;
+      String savedAntFile = antFile;
+      String savedTarget = target;
+      try {
+         if ( newProject == null ) {
+            reinit();
+         }
+
+         if ( ( dir == null ) && ( inheritAll ) ) {
+            dir = getProject().getBaseDir();
+         }
+
+         initializeProject();
+
+         if ( dir != null ) {
+            newProject.setBaseDir( dir );
+            if ( savedDir != null ) {   // has been set explicitly
+               newProject.setInheritedProperty( "basedir",
+                     dir.getAbsolutePath() );
+            }
+         }
+         else {
+            dir = getProject().getBaseDir();
+         }
+
+         overrideProperties();
+
+         if ( antFile == null ) {
+            antFile = "build.xml";
+         }
+
+         File file = FileUtils.newFileUtils().resolveFile( dir, antFile );
+         antFile = file.getAbsolutePath();
+
+         log( "calling target " + ( target != null ? target : "[default]" )
+                + " in build file " + antFile.toString(),
+               Project.MSG_VERBOSE );
+         newProject.setUserProperty( "ant.file", antFile );
+         ProjectHelper.getProjectHelper().parse( newProject, new File( antFile ) );
+
+         if ( target == null ) {
+            target = newProject.getDefaultTarget();
+         }
+
+         addReferences();
+
+         // Are we trying to call the target in which we are defined?
+         if ( newProject.getBaseDir().equals( getProject().getBaseDir() ) &&
+               newProject.getProperty( "ant.file" ).equals( getProject().getProperty( "ant.file" ) ) &&
+               getOwningTarget() != null &&
+               target.equals( this.getOwningTarget().getName() ) ) {
+
+            throw new BuildException( "ant task calling its own parent "
+                   + "target" );
+         }
+
+         newProject.executeTarget( target );
+
+         // copy back the props if possible
+         if ( returnName != null ) {
+            StringTokenizer st = new StringTokenizer( returnName, "," );
+            while ( st.hasMoreTokens() ) {
+               String name = st.nextToken().trim();
+               String value = newProject.getUserProperty( name );
+               if ( value != null ) {
+                  getProject().setUserProperty( name, value );
+               }
+               else {
+                  value = newProject.getProperty( name );
+                  if ( value != null ) {
+                     getProject().setProperty( name, value );
+                  }
+               }
+            }
+         }
+      }
+      finally {
+         // help the gc
+         newProject = null;
+         if ( output != null && out != null ) {
+            try {
+               out.close();
+            }
+            catch ( final Exception e ) {
+               //ignore
+            }
+         }
+         dir = savedDir;
+         antFile = savedAntFile;
+         target = savedTarget;
+      }
+   }
+
+
+   /**
+    * Override the properties in the new project with the one explicitly defined
+    * as nested elements here.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void overrideProperties() throws BuildException {
+      Enumeration e = properties.elements();
+      while ( e.hasMoreElements() ) {
+         Property p = (Property)e.nextElement();
+         p.setProject( newProject );
+         p.execute();
+      }
+      getProject().copyInheritedProperties( newProject );
+   }
+
+
+   /**
+    * Add the references explicitly defined as nested elements to the new
+    * project. Also copy over all references that don't override existing
+    * references in the new project if inheritrefs has been requested.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void addReferences() throws BuildException {
+      Hashtable thisReferences = (Hashtable)getProject().getReferences().clone();
+      Hashtable newReferences = newProject.getReferences();
+      Enumeration e;
+      if ( references.size() > 0 ) {
+         for ( e = references.elements(); e.hasMoreElements();  ) {
+            Reference ref = (Reference)e.nextElement();
+            String refid = ref.getRefId();
+            if ( refid == null ) {
+               throw new BuildException( "the refid attribute is required"
+                      + " for reference elements" );
+            }
+            if ( !thisReferences.containsKey( refid ) ) {
+               log( "Parent project doesn't contain any reference '"
+                      + refid + "'",
+                     Project.MSG_WARN );
+               continue;
+            }
+
+            thisReferences.remove( refid );
+            String toRefid = ref.getToRefid();
+            if ( toRefid == null ) {
+               toRefid = refid;
+            }
+            copyReference( refid, toRefid );
+         }
+      }
+
+      // Now add all references that are not defined in the
+      // subproject, if inheritRefs is true
+      if ( inheritRefs ) {
+         for ( e = thisReferences.keys(); e.hasMoreElements();  ) {
+            String key = (String)e.nextElement();
+            if ( newReferences.containsKey( key ) ) {
+               continue;
+            }
+            copyReference( key, key );
+         }
+      }
+   }
+
+
+   /**
+    * Try to clone and reconfigure the object referenced by oldkey in the parent
+    * project and add it to the new project with the key newkey. <p>
+    *
+    * If we cannot clone it, copy the referenced object itself and keep our
+    * fingers crossed.</p>
+    *
+    * @param oldKey  Description of the Parameter
+    * @param newKey  Description of the Parameter
+    */
+   private void copyReference( String oldKey, String newKey ) {
+      Object orig = getProject().getReference( oldKey );
+      Class c = orig.getClass();
+      Object copy = orig;
+      try {
+         Method cloneM = c.getMethod( "clone", new Class[0] );
+         if ( cloneM != null ) {
+            copy = cloneM.invoke( orig, new Object[0] );
+         }
+      }
+      catch ( Exception e ) {
+         // not Clonable
+      }
+
+      if ( copy instanceof ProjectComponent ) {
+         ( (ProjectComponent)copy ).setProject( newProject );
+      }
+      else {
+         try {
+            Method setProjectM =
+                  c.getMethod( "setProject", new Class[]{Project.class} );
+            if ( setProjectM != null ) {
+               setProjectM.invoke( copy, new Object[]{newProject} );
+            }
+         }
+         catch ( NoSuchMethodException e ) {
+            // ignore this if the class being referenced does not have
+            // a set project method.
+         }
+         catch ( Exception e2 ) {
+            String msg = "Error setting new project instance for "
+                   + "reference with id " + oldKey;
+            throw new BuildException( msg, e2, getLocation() );
+         }
+      }
+      newProject.addReference( newKey, copy );
+   }
+
+
+   /**
+    * The directory to use as a base directory for the new Ant project. Defaults
+    * to the current project's basedir, unless inheritall has been set to false,
+    * in which case it doesn't have a default value. This will override the
+    * basedir setting of the called project.
+    *
+    * @param d  The new dir value
+    */
+   public void setDir( File d ) {
+      this.dir = d;
+   }
+
+
+   /**
+    * The build file to use. Defaults to "build.xml". This file is expected to
+    * be a filename relative to the dir attribute given.
+    *
+    * @param s  The new antfile value
+    */
+   public void setAntfile( String s ) {
+      // @note: it is a string and not a file to handle relative/absolute
+      // otherwise a relative file will be resolved based on the current
+      // basedir.
+      this.antFile = s;
+   }
+
+
+   /**
+    * The target of the new Ant project to execute. Defaults to the new
+    * project's default target.
+    *
+    * @param s  The new target value
+    */
+   public void setTarget( String s ) {
+      this.target = s;
+   }
+
+
+   /**
+    * Filename to write the output to. This is relative to the value of the dir
+    * attribute if it has been set or to the base directory of the current
+    * project otherwise.
+    *
+    * @param s  The new output value
+    */
+   public void setOutput( String s ) {
+      this.output = s;
+   }
+
+
+   /**
+    * Property to pass to the new project. The property is passed as a 'user
+    * property'
+    *
+    * @return   Description of the Return Value
+    */
+   public Property createProperty() {
+      if ( newProject == null ) {
+         reinit();
+      }
+      /*
+       *  Property p = new Property( true, getProject() );
+       */
+      Property p = new Property();
+      p.setProject( newProject );
+      p.setTaskName( "property" );
+      properties.addElement( p );
+      return p;
+   }
+
+
+   /**
+    * Set the property or properties that are set in the new project to be
+    * transfered back to the original project. As with all properties, if the
+    * property already exists in the original project, it will not be overridden
+    * by a different value from the new project.
+    *
+    * @param r  the name of a property in the new project to set in the original
+    *      project. This may be a comma separate list of properties.
+    */
+   public void setReturn( String r ) {
+      returnName = r;
+   }
+
+
+   /**
+    * Reference element identifying a data type to carry over to the new
+    * project.
+    *
+    * @param r  The feature to be added to the Reference attribute
+    */
+   public void addReference( Reference r ) {
+      references.addElement( r );
+   }
+
+
+   /**
+    * Helper class that implements the nested &lt;reference&gt; element of
+    * &lt;ant&gt; and &lt;antcall&gt;.
+    *
+    * @author   danson
+    */
+   public static class Reference
+          extends org.apache.tools.ant.types.Reference {
+
+      /** Creates a reference to be configured by Ant */
+      public Reference() {
+         super();
+      }
+
+
+      private String targetid = null;
+
+
+      /**
+       * Set the id that this reference to be stored under in the new project.
+       *
+       * @param targetid  the id under which this reference will be passed to
+       *      the new project
+       */
+      public void setToRefid( String targetid ) {
+         this.targetid = targetid;
+      }
+
+
+      /**
+       * Get the id under which this reference will be stored in the new project
+       *
+       * @return   the id of the reference in the new project.
+       */
+      public String getToRefid() {
+         return targetid;
+      }
+   }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntScript.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntScript.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntScript.java	(revision 15023)
@@ -0,0 +1,94 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * Defines all tasks used in the AntScript set of tasks. As Ant uses a custom
+ * classloader, it is possible for a project to define tasks via different 
+ * classloaders, which can cause problem as many of these tasks are tightly
+ * coupled.
+ * @author Dale Anson
+ */
+public class AntScript extends Task {
+    /**
+     * Adds definitions for all AntScript tasks to the current project.
+     */
+    public void init() {
+        Project p = getProject();
+        p.addTaskDefinition( "assert", Assert.class );
+        p.addTaskDefinition( "bool", BooleanConditionTask.class );
+        p.addTaskDefinition( "break", Break.class );
+        p.addTaskDefinition( "case", Case.class );
+        p.addTaskDefinition( "catch", CatchTask.class );
+        p.addTaskDefinition( "default", DefaultCase.class );
+        p.addTaskDefinition( "else", ElseTask.class );
+        p.addTaskDefinition( "finally", FinallyTask.class );
+        p.addTaskDefinition( "if", IfTask.class );
+        p.addTaskDefinition( "math", MathTask.class );
+        p.addTaskDefinition( "post", PostTask.class );
+        p.addTaskDefinition( "switch", SwitchTask.class );
+        p.addTaskDefinition( "try", TryTask.class );
+        p.addTaskDefinition( "var", Variable.class );
+    }
+
+    /**
+     * Does nothing.    
+     */
+    public void execute() {
+        // no-op, only care about the init.
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntelopeTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntelopeTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AntelopeTask.java	(revision 15023)
@@ -0,0 +1,120 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * Defines all tasks used in the ise.antelope.tasks set package. As Ant uses a 
+ * custom classloader, it is possible for a project to define tasks via different 
+ * classloaders, which can cause problem as many of these tasks are tightly
+ * coupled. Ant 1.5's taskdef task introduced the "loaderRef" to get around this
+ * problem, but it is still handier to load just this task to load all the others
+ * at once.
+ * @author Dale Anson
+ */
+public class AntelopeTask extends Task {
+    /**
+     * Adds definitions for all Antelope tasks to the current project.
+     * Current definitions:<br>
+     * <ul>
+     * <li>antcallback
+     * <li>antfetch
+     * <li>assert
+     * <li>bool
+     * <li>break
+     * <li>case
+     * <li>catch
+     * <li>default
+     * <li>else
+     * <li>finally
+     * <li>if
+     * <li>limit
+     * <li>math
+     * <li>post
+     * <li>switch
+     * <li>try
+     * <li>var
+     * </ul>
+     */
+    public void init() {
+        Project p = getProject();
+        p.addTaskDefinition( "antcallback", AntCallBack.class);
+        p.addTaskDefinition( "antfetch", AntFetch.class );
+        p.addTaskDefinition( "assert", Assert.class );
+        p.addTaskDefinition( "bool", BooleanConditionTask.class );
+        p.addTaskDefinition( "break", Break.class );
+        p.addTaskDefinition( "case", Case.class );
+        p.addTaskDefinition( "catch", CatchTask.class );
+        p.addTaskDefinition( "default", DefaultCase.class );
+        p.addTaskDefinition( "else", ElseTask.class );
+        p.addTaskDefinition( "finally", FinallyTask.class );
+        p.addTaskDefinition( "if", IfTask.class );
+        p.addTaskDefinition( "limit", Limit.class); 
+        p.addTaskDefinition( "math", MathTask.class );
+        p.addTaskDefinition( "post", PostTask.class );
+        p.addTaskDefinition( "stopwatch", StopWatchTask.class );
+        p.addTaskDefinition( "switch", SwitchTask.class );
+        p.addTaskDefinition( "try", TryTask.class );
+        p.addTaskDefinition( "var", Variable.class );
+    }
+
+    /**
+     * Does nothing.    
+     */
+    public void execute() {
+        // no-op, only care about the init.
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Assert.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Assert.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Assert.java	(revision 15023)
@@ -0,0 +1,521 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+
+/**
+ * Based on the Sequential task. Similar to Java's 'assert' keyword, verifies
+ * that a given property has a given value. Throws a BuildException if the
+ * property value is not as expected or the property does not exist. <p>
+ *
+ * Also like Java's 'assert' keyword, the Assert task must be 'turned on' using
+ * the property "ant.enable.asserts". If not set, or is set to false, the Assert
+ * task works exactly like the Sequential task. <p>
+ *
+ * Can hold other tasks including Assert. Attributes:
+ * <ul>
+ *   <li> name - the name of a property. Required.</li>
+ *   <li> exists - boolean, if true, throws BuildException if the property does
+ *   not exist. Optional, default is true.</li>
+ *   <li> value - the expected value of a property. Implies 'exists'. Throws
+ *   BuildException if the actual value is not the same as this value. Optional.
+ *   </li>
+ *   <li> execute - boolean, if true, execute any contained tasks. Optional,
+ *   default is true. Can also be set globally by setting the value of
+ *   "assert.execute" to true or false. The local setting overrides the global
+ *   setting.</li> <p>
+ *
+ *   The assert task supports a single nested BooleanCondition task, otherwise,
+ *   the assert task does not support any nested elements apart from Ant tasks.
+ *   Any valid Ant task may be embedded within the assert task.</p>
+ *
+ * @author    Dale Anson, danson@germane-software.com
+ * @version   $Revision: 1.5 $
+ * @since     Ant 1.5
+ */
+public class Assert extends Task implements TaskContainer {
+
+    // attribute storage
+    private boolean failOnError = true;
+    private boolean failOnErrorSetByUser = false;
+    private String execute = null;
+    private boolean exists = true;
+    private String value = null;
+    private String name = null;
+    private String message = "";
+    private int level = AssertException.ERROR;
+
+    // to hold optional nested boolean task
+    private Task condition_task = null;
+
+    // vector to hold any nested tasks
+    private Vector tasks = new Vector();
+
+    /**
+     * Set the name of the property to test. Required.
+     *
+     * @param name  the name of the property to test.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Set the expected value of the property. Implies 'exists'. Throws
+     * BuildException if the actual value is not the same as this value.
+     * Optional.
+     *
+     * @param value  the expected value of the property.
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Set a specific message to include in the output in the event this assert
+     * fails.
+     *
+     * @param msg  the message to include
+     */
+    public void setMessage(String msg) {
+        if (msg == null)
+            return;
+        this.message = msg;
+    }
+    
+
+    /**
+     * Set the 'exists' attribute. If true, throws BuildException if the
+     * property does not exist. Optional, default is true.
+     *
+     * @param exists  Ant boolean, whether the value must exist.
+     */
+    public void setExists(String exists) {
+        this.exists = getProject().toBoolean(exists);
+    }
+
+    /**
+     * Ant boolean, if true, execute any contained tasks. Optional, default is
+     * true. Can also be set globally by setting the value of "assert.execute"
+     * to true or false. The local setting overrides the global setting.
+     *
+     * @param execute  Ant boolean, whether to execute contained tasks.
+     */
+    public void setExecute(String execute) {
+        this.execute = execute;
+    }
+
+    /**
+     * Ant boolean, stop the build process if the assertion fails. Defaults to
+     * true. Setting this to false is contrary to the intented use of
+     * assertions, but may be useful in certain situations.
+     *
+     * @param fail  Ant boolean, whether to stop the build on assertion error.
+     */
+    public void setFailonerror(boolean fail) {
+        failOnError = fail;
+        failOnErrorSetByUser = true;
+    }
+    
+	/**
+	 * Sets the assertion level.  This is like message level or debug level,
+	 * valid values are "error" (the default), "warning", "info", and "debug".
+	 * Setting the level to "warning", "info", or "debug" will force the
+	 * fail on error setting to false.
+	 * @param assertlevel one of "error", "warning", "info", or "debug" levels.
+	 */
+    public void setLevel(AssertLevel assertlevel) {
+        level = assertlevel.indexOfValue(assertlevel.getValue());  
+    }
+    
+    /**
+     * Override {@link org.apache.tools.ant.Task#maybeConfigure maybeConfigure}
+     * in a way that leaves the nested tasks unconfigured until they get
+     * executed.
+     *
+     * @exception BuildException  Description of Exception
+     * @since                     Ant 1.5
+     */
+    public void maybeConfigure() throws BuildException {
+        if (isInvalid()) {
+            super.maybeConfigure();
+        }
+        else {
+            getRuntimeConfigurableWrapper().maybeConfigure(getProject(), false);
+        }
+    }
+
+    /**
+     * Add a nested task to execute. <p>
+     *
+     * @param task  Nested task to execute. <p>
+     */
+    public void addTask(Task task) {
+        if (task instanceof BooleanConditionTask) {
+            if (condition_task == null) {
+                condition_task = task;
+                return;
+            }
+            else {
+                throw new BuildException("Only one <bool> or <condition> allowed per Assert.");
+            }
+        }
+        tasks.addElement(task);
+    }
+
+    /**
+     * Adds a feature to the Bool attribute of the Assert object
+     *
+     * @param boolTask  The feature to be added to the Bool attribute
+     */
+    public void addBool(BooleanConditionTask boolTask) {
+        addTask(boolTask);
+    }
+
+    /**
+     * Execute this task and all nested Tasks.
+     *
+     * @exception BuildException  Description of Exception
+     */
+    public void execute() throws BuildException {
+        // adjust failOnError depending on level and user setting
+        if (!failOnErrorSetByUser) {
+            switch (level) {
+                default:    // error
+                    failOnError = true;
+                    break;
+                case 2:     // warning
+                case 3:     // info
+                case 4:     // debug
+                    failOnError = false;
+                    break;
+            }
+        }
+        
+        // check for global 'ant.enable.asserts' property -- if this isn't set or
+        // is set to false, just run the nested tasks and skip the assertion
+        // testing.
+        String use_asserts = getProject().getProperty("ant.enable.asserts");
+        if (use_asserts == null || !getProject().toBoolean(use_asserts)) {
+            executeNestedTasks();
+            return;
+        }
+
+        if (condition_task == null) {
+            // check for the required name attribute
+            if (name == null || name.equals(""))
+                throw new BuildException("The 'name' attribute is required.");
+
+            // get the property value from the project
+            String prop_value = getProject().getProperty(name);
+
+            // check if the property exists
+            if (exists && prop_value == null) {
+                String msg = "Assertion failed: Property '" + name + "' doesn't exist in this project.\n" + message;
+                if (failOnError)
+                    throw new BuildException(msg);
+                else
+                    log(msg, Project.MSG_WARN);
+            }
+            else if (!exists && prop_value != null) {
+                String msg = "Assertion failed: Property '" + name + "' exists in this project, but shouldn't.\n" + message;
+                if (failOnError)
+                    throw new BuildException(msg);
+                else
+                    log(msg, Project.MSG_WARN);
+            }
+
+            // do the actual assert checks...
+            // check that the property has the right value
+            if (value != null) {
+                if (prop_value == null) {
+                    String msg = "Assertion failed: Expected '" + value + "', but was null\n" + message;
+                    if (failOnError)
+                        throw new AssertException(msg, level);
+                    else
+                        log(msg, Project.MSG_WARN);
+                }
+                else if (prop_value != null) {
+                    // check if this is a boolean value
+                    String b = prop_value.toLowerCase();
+                    boolean have_boolean = false;
+                    if (b.equals("on") || b.equals("yes") || b.equals("true") ||
+                            b.equals("off") || b.equals("no") || b.equals("false"))
+                        have_boolean = true;
+
+                    if (have_boolean) {
+                        // convert 'value' to boolean and compare
+                        boolean prop_bvalue = getProject().toBoolean(prop_value);
+                        boolean bvalue = getProject().toBoolean(value);
+                        if (prop_bvalue != bvalue) {
+                            String msg = "Assertion failed: Expected '" + bvalue + "', but was '" + prop_bvalue + "'.\n" + message;
+                            if (failOnError)
+                                throw new AssertException(msg, level);
+                            else
+                                log(msg, Project.MSG_WARN);
+                        }
+                    }
+                    else if (!prop_value.equals(value)) {
+                        // property values are different
+                        String msg = "Assertion failed: Expected '" + value + "', but was '" + prop_value + "'.\n" + message;
+                        if (failOnError)
+                            throw new AssertException(msg, level);
+                        else
+                            log(msg, Project.MSG_WARN);
+                    }
+                }
+            }
+        }
+        else {
+            // have nested condition
+            if (!((BooleanConditionTask) condition_task).eval()) {
+                if (message == null)
+                    message = "Assertion failed.";
+                if (failOnError)
+                    throw new AssertException(message, level);
+                else
+                    log(message, Project.MSG_WARN);
+            }
+        }
+
+        // execute all nested tasks
+        boolean do_execute = true;
+        if (execute == null) {
+            execute = getProject().getProperty("assert.execute");
+            if (execute != null)
+                do_execute = getProject().toBoolean(execute);
+        }
+        else {
+            do_execute = getProject().toBoolean(execute);
+        }
+        if (do_execute) {
+            executeNestedTasks();
+        }
+    }
+
+    /** Execute all nested tasks.  */
+    private void executeNestedTasks() {
+        for (Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+            Task task = (Task) e.nextElement();
+            task.perform();
+        }
+    }
+    
+    // testing
+    /**
+     * Description of the Method
+     *
+     * @return   Description of the Returned Value
+     */
+    public static int runTests() {
+        // set up a project
+        org.apache.tools.ant.Project p = new org.apache.tools.ant.Project();
+        Assert ass = new Assert();
+        ass.setProject(p);
+
+        // set up a property
+        String test_property = "test_property";
+        String test_value = "test_value";
+
+        // enable asserts so the tests can run
+        p.setProperty("ant.enable.asserts", "true");
+
+        // count the number of tests ran
+        int num_tests = 0;
+
+        // run some tests --
+        // 1. check that task fails if name is missing -- name is required
+        try {
+            ass.execute();
+            throw new RuntimeException("test 1 failed.");
+        }
+        catch (Exception e) {
+            ++num_tests;
+        }
+
+        // 2. check that task fails if name is given but is not in project --
+        // this is one of the main uses of Assert, to verify that a property exists.
+        // The default setting of 'exists' is true so doesn't need to be set
+        // explicitly.
+        try {
+            ass.setName(test_property);
+            ass.execute();
+            throw new RuntimeException("test 2 test failed.");
+        }
+        catch (Exception e) {
+            ++num_tests;
+        }
+
+        // 3. test that task passes if name is given and is in project -- again
+        // this is one of the main uses of Assert, to verify that a property exists.
+        // The default setting of 'exists' is true so doesn't need to be set
+        // explicitly.
+        try {
+            p.setProperty(test_property, test_value);
+            ass.setName(test_property);
+            ass.execute();
+            ++num_tests;
+        }
+        catch (Exception e) {
+            throw new RuntimeException("test 3 test failed:\n" + e.getMessage());
+        }
+
+        // 4. test that task passes if name is given, the property doesn't exist in
+        // the project, and exists is false. This is another main use case --
+        // checking that a property is not set.
+        try {
+            ass.setExists("false");
+            ass.execute();
+            throw new RuntimeException("test 4 failed");
+        }
+        catch (Exception e) {
+            ++num_tests;
+        }
+
+        // 5. test that task passes if property is set with the correct value --
+        // this is another main use case -- checking that a property exists with the
+        // right value.
+        try {
+            ass.setExists("true");   // true is default value
+            ass.setValue(test_value);
+            ass.execute();
+            ++num_tests;
+        }
+        catch (Exception e) {
+            throw new RuntimeException("test 5 failed\n" + e.getMessage());
+        }
+
+        // 6. test that task failed if property is incorrect -- this is the inverse
+        // test of #5.
+        try {
+            ass.setValue("blah");
+            ass.execute();
+            throw new RuntimeException("test 6 failed");
+        }
+        catch (Exception e) {
+            ++num_tests;
+        }
+
+        // 7, 8, 9. test that task passes if property is boolean -- make sure that
+        // the property can be set to 'true', 'on', or 'yes' and will evaluate
+        // correctly regardless.
+        try {
+            ass.setExists("true");   // true is default value
+
+            // set project propert to "true"
+            p.setProperty("boolean prop", "true");
+            ass.setName("boolean prop");
+
+            // test "true", "on", and "yes" all work. Ant doesn't care about case
+            // on these values
+            ass.setValue("tRue");
+            ass.execute();
+            ++num_tests;
+            ass.setValue("on");
+            ass.execute();
+            ++num_tests;
+            ass.setValue("Yes");
+            ass.execute();
+            ++num_tests;
+        }
+        catch (Exception e) {
+            throw new RuntimeException("test 7 failed\n" + e.getMessage());
+        }
+
+        // 10. test that failonerror works when false.
+        try {
+            ass.setValue("blah");
+            ass.setFailonerror(false);
+            ass.execute();
+            ++num_tests;
+        }
+        catch (Exception e) {
+            throw new RuntimeException("test 10 failed");
+        }
+
+        // 11. test that failonerror works when true.
+        try {
+            ass.setValue("blah");
+            ass.setFailonerror(true);
+            ass.execute();
+            throw new RuntimeException("test 11 failed");
+        }
+        catch (Exception e) {
+            ++num_tests;
+        }
+
+        return num_tests;
+    }
+
+    /**
+     * The main program for the Assert class
+     *
+     * @param args  The command line arguments
+     */
+    public static void main(String[] args) {
+        int num_tests = Assert.runTests();
+        System.out.println("Ran " + num_tests + " tests, all passed.");
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertException.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertException.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertException.java	(revision 15023)
@@ -0,0 +1,86 @@
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Location;
+
+public class AssertException extends BuildException {
+    
+    // !@#$%&* Ant has its own EnumeratedAttrbutes to implement the enumeration
+    // pattern, but it's all strings and ints, no real classes...
+    // These numbers MUST match up with the AssertLevel inner class in the
+    // Assert task.
+    public final static int ERROR = 0;
+    public final static int WARN = 1;
+    public final static int DEBUG = 2;
+    public final static int INFO = 3;
+    
+    private int assert_level = ERROR;
+    
+    public AssertException() {
+        super();   
+    }
+    public AssertException(String message) {
+        super(message);           
+    }                      
+    public AssertException(String message, Location location) {
+        super(message, location);           
+    }                      
+    public AssertException(String message, Throwable cause) {
+        super(message, cause);           
+    }                      
+    public AssertException(String message, Throwable cause, Location location) {
+        super(message, cause, location);           
+    }                      
+    public AssertException(Throwable cause) {
+        super(cause);           
+    }                      
+    public AssertException(Throwable cause, Location location) {
+        super(cause, location);   
+    }
+    public AssertException(int level) {
+        super();   
+        assert_level = level;
+    }
+    public AssertException(String message, int level) {
+        super(message);           
+        assert_level = level;
+    }                      
+    public AssertException(String message, Location location, int level) {
+        super(message, location);           
+        assert_level = level;
+    }                      
+    public AssertException(String message, Throwable cause, int level) {
+        super(message, cause);           
+        assert_level = level;
+    }                      
+    public AssertException(String message, Throwable cause, Location location, int level) {
+        super(message, cause, location);           
+        assert_level = level;
+    }                      
+    public AssertException(Throwable cause, int level) {
+        super(cause);           
+        assert_level = level;
+    }                      
+    public AssertException(Throwable cause, Location location, int level) {
+        super(cause, location);   
+        assert_level = level;
+    }
+
+    public void setLevel(int level ) {
+        switch(level) {
+            case ERROR:
+            case WARN:
+            case DEBUG:
+            case INFO:
+                assert_level = level;
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid assert level.");
+        }
+    }
+    
+    public int getLevel() {
+        return assert_level;   
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertLevel.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertLevel.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/AssertLevel.java	(revision 15023)
@@ -0,0 +1,13 @@
+
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+public class AssertLevel extends EnumeratedAttribute {
+    private String[] values = new String[] {"error", "warning", "info", "debug"};
+    public String[] getValues() {
+        return values;
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/BooleanConditionTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/BooleanConditionTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/BooleanConditionTask.java	(revision 15023)
@@ -0,0 +1,179 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+import java.util.Enumeration;
+
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskAdapter;
+import org.apache.tools.ant.taskdefs.ConditionTask;
+import org.apache.tools.ant.taskdefs.condition.*;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+import ise.antelope.tasks.condition.*;
+
+/**
+ * Wraps a ConditionBase so that the If task can use standard Ant Conditions as
+ * its evaluated boolean expression. Wrapping like this means that future
+ * additions to ConditionBase will automatically be picked up without modifying
+ * this class.
+ *
+ * @author     Dale Anson
+ * @version    $Revision: 1.4 $
+ * @ant.task   category="control"
+ */
+public class BooleanConditionTask extends TaskAdapter {
+
+    private BooleanConditionBase cb;
+
+    private String property = null;
+    private String value = "true";
+
+    /** Constructor for BooleanConditionTask  */
+    public BooleanConditionTask() {
+        cb  = new BooleanConditionBase();
+        super.setProxy(cb);
+        cb.setProject(getProject());
+    }
+
+    /**
+     * Gets the proxy attribute of the BooleanConditionTask object
+     *
+     * @return   The proxy value
+     */
+    public Object getProxy() {
+        return cb;
+    }
+
+    /**
+     * Sets the proxy attribute of the BooleanConditionTask object
+     *
+     * @param proxy  The new proxy value
+     */
+    public void setProxy(Object proxy) {
+        super.setProxy(cb);
+    }
+
+    /**
+     * The name of the property to set. Optional.
+     *
+     * @param p  The new property value
+     */
+    public void setProperty(String p) {
+        property = p;
+    }
+
+    /**
+     * The value for the property to set, if condition evaluates to true.
+     * Defaults to "true".
+     *
+     * @param v  The new value value
+     */
+    public void setValue(String v) {
+        value = v;
+    }
+
+    /**
+     * Override {@link org.apache.tools.ant.Task#maybeConfigure maybeConfigure}
+     * in a way that leaves the nested tasks unconfigured until they get
+     * executed.
+     *
+     * @exception BuildException  Description of Exception
+     * @since                     Ant 1.5
+     */
+    public void maybeConfigure() throws BuildException {
+        if (isInvalid()) {
+            super.maybeConfigure();
+        }
+        else {
+            getRuntimeConfigurableWrapper().maybeConfigure(getProject(), true);
+        }
+    }
+
+    /**
+     * Forwards to eval().
+     *
+     * @exception BuildException  Description of Exception
+     */
+    public void execute() throws BuildException {
+        eval();
+    }
+
+    /**
+     * Evaluates the condition object.
+     *
+     * @return   true or false, depending on the evaluation of the condition.
+     */
+    public boolean eval() {
+        maybeConfigure();
+        cb.setProject(getProject());
+        if (cb.getConditionCount() > 1) {
+            throw new BuildException("You must not nest more than one condition.");
+        }
+        if (cb.getConditionCount() < 1) {
+            throw new BuildException("You must nest one condition.");
+        }
+
+        boolean b = cb.getFirstCondition().eval();
+        if (b && property != null)
+            getProject().setNewProperty(property, value);
+        return b;
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Break.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Break.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Break.java	(revision 15023)
@@ -0,0 +1,79 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * This is a marker task that indicates to a Breakable that a break condition
+ * has occurred.
+ * @author Dale Anson
+ */
+public class Break extends Task implements Breakable {
+    public void setBreak(boolean b) {
+        
+    }
+    
+    public void addBreak(Break b) {
+        
+    }
+    
+    public void execute() {
+        doBreak();   
+    }
+    
+    public boolean doBreak() {
+        return true;   
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Breakable.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Breakable.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Breakable.java	(revision 15023)
@@ -0,0 +1,80 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+
+package ise.antelope.tasks;
+
+/**
+ * TaskContainers that implement this interface can set a break flag to indicate 
+ * to containers that a break condition has occurred. The break flag is set to
+ * true when the task executes a Break task.
+ * @author Dale Anson 
+ */
+public interface Breakable {
+    /**
+     * Set the break flag to the given value.
+     * @param b the value for the flag   
+     */
+    public void setBreak( boolean b );
+
+    /**
+     * Adds a nested Break.
+     * @param b the Break to add    
+     */
+    public void addBreak( Break b );
+
+    /**
+     * @return the value of the break flag.    
+     */
+    public boolean doBreak();
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Call.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Call.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Call.java	(revision 15023)
@@ -0,0 +1,19 @@
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+
+public class Call extends Task {
+   
+   private String target = null;
+   
+   public void setTarget(String target) {
+      this.target = target;  
+   }
+   
+   public void execute() {
+      if (target == null)
+         throw new BuildException("target is required");
+      getProject().executeTarget(target);
+   }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Case.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Case.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Case.java	(revision 15023)
@@ -0,0 +1,161 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+import java.util.Enumeration;
+
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+
+/**
+ * This TaskContainer is intended to be nested into the Switch task.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.2 $
+ */
+public class Case extends Task implements TaskContainer, Breakable {
+   private Vector tasks = new Vector();
+   private String value = null;
+   private boolean doBreak = false;
+   private Break _break = null;
+
+   /**
+    * Set the value for this case. This value is used by the Switch task to
+    * decide if this task should execute.
+    *
+    * @param value  the value.
+    */
+   public void setValue( String value ) {
+      this.value = value;
+   }
+
+   /**
+    * @return   the value for this case.
+    */
+   public String getValue() {
+      return value;
+   }
+
+   /**
+    * Required for Breakable interface.
+    *
+    * @param b  The new break value
+    * @see      Breakable
+    */
+   public void setBreak( boolean b ) {
+      doBreak = b;
+   }
+
+   /**
+    * Required for Breakable interface.
+    *
+    * @return   Description of the Returned Value
+    * @see      Breakable
+    */
+   public boolean doBreak() {
+      return doBreak;
+   }
+
+   /**
+    * Required for Breakable interface.
+    *
+    * @param b  The feature to be added to the Break attribute
+    * @see      Breakable
+    */
+   public void addBreak( Break b ) {
+      // Ant 1.5.x -- intentional no-op, this is a task container, so can only add items
+      // add items via the addTask method.
+      
+      // added for Ant 1.6
+      addTask(b);
+   }
+
+   /**
+    * Adds a feature to the Task attribute of the Case object
+    *
+    * @param task                The feature to be added to the Task attribute
+    * @exception BuildException  Description of Exception
+    */
+   public void addTask( Task task ) throws BuildException {
+      if ( task instanceof Break ) {
+         if ( _break == null )
+            _break = (Break)task;
+         else
+            throw new BuildException( "<case> can only have one <break>" );
+      }
+      tasks.addElement( task );
+   }
+
+   /**
+    * Execute all nested tasks, checking for Breakables.
+    *
+    * @exception BuildException  Description of Exception
+    */
+   public void execute() throws BuildException {
+      Enumeration en = tasks.elements();
+      while ( en.hasMoreElements() ) {
+         Task task = (Task)en.nextElement();
+         task.perform();
+         if ( task instanceof Breakable ) {
+            if ( ( (Breakable)task ).doBreak() ) {
+               setBreak( true );
+               return;
+            }
+         }
+      }
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/CatchTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/CatchTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/CatchTask.java	(revision 15023)
@@ -0,0 +1,68 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.taskdefs.Sequential;
+
+
+/**
+ * This is identical to Sequential and can be used on its own as a
+ * Sequential task. Its intended use is as a nested element of the TryTask.
+ *
+ * @author Dale Anson, danson@germane-software.com
+ * @since Ant 1.5
+ */
+public class CatchTask extends Sequential {
+    
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/DefaultCase.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/DefaultCase.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/DefaultCase.java	(revision 15023)
@@ -0,0 +1,62 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+
+package ise.antelope.tasks;
+
+/**
+ * Intended to be nested into the Switch task, this is the 'default' case for a switch.
+ * @author Dale Anson
+ */
+public class DefaultCase extends Case {}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ElseTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ElseTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ElseTask.java	(revision 15023)
@@ -0,0 +1,121 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.BuildException;
+
+
+/**
+ * This task is intended for nesting into the If task. This represents the 'else'
+ * clause in an if/else construct.
+ *
+ * @author Dale Anson, danson@germane-software.com
+ * @since Ant 1.5
+ */
+public class ElseTask extends Task implements TaskContainer, Breakable {
+
+    private Vector tasks = new Vector();
+    private boolean doBreak = false;
+
+    /**
+     * Add a task to execute.
+     * @param task a task to execute.    
+     */
+    public void addTask( Task task ) {
+        tasks.addElement( task );
+    }
+
+    /**
+     * Required by Breakable interface.    
+     */
+    public void setBreak( boolean b ) {
+        doBreak = b;
+    }
+
+    /**
+     * Required by Breakable interface.    
+     */
+    public void addBreak( Break b ) {
+        // intentional no-op
+    }
+
+    /**
+     * Required by Breakable interface.    
+     */
+    public boolean doBreak() {
+        return doBreak;
+    }
+
+    public void execute() throws BuildException {
+        // execute all nested tasks
+        for ( Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+            Task task = ( Task ) e.nextElement();
+            if ( task instanceof Breakable ) {
+                task.perform();
+                if ( ( ( Breakable ) task ).doBreak() ) {
+                    setBreak( true );
+                    return ;
+                }
+            }
+            else {
+                task.perform();
+            }
+        }
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FileUtilTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FileUtilTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FileUtilTask.java	(revision 15023)
@@ -0,0 +1,132 @@
+package ise.antelope.tasks;
+
+import ise.antelope.tasks.typedefs.file.*;
+
+import java.io.File;
+import java.util.*;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * A task to answer a bunch of questions about a file or directory.
+ *
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.3 $
+ */
+public class FileUtilTask extends Task {
+
+    private File file = null;
+
+    private String property = null;
+    
+    private Vector ops = new Vector();
+
+    /**
+     * @param f the file in question
+     */
+    public void setFile(File f) {
+        file = f;
+    }
+
+    /**
+     * @param name  where to put the answer
+     */
+    public void setProperty(String name) {
+        property = name;
+    }
+
+    public void addFileop(FileOp op) {
+        ops.add(op);
+    }
+
+	/**
+	 * Is the file readable?    
+	 */
+    public void addCanread(CanRead op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * Is the file writable?    
+	 */
+    public void addCanwrite(CanWrite op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * How many files are in the directory?    
+	 */
+    public void addFilecount(FileCount op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * Is the file a directory?    
+	 */
+    public void addIsdirectory(IsDirectory op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * Is the file a file?    
+	 */
+    public void addIsfile(IsFile op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * Is the file hidden?    
+	 */
+    public void addIshidden(IsHidden op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * What is the length of the file?    
+	 */
+    public void addFilelength(FileLength op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * When was the file last modified?    
+	 */
+    public void addLastmodified(LastModified op) {
+        ops.add(op);   
+    }
+
+	/**
+	 * What files are in the directory?    
+	 */
+    public void addListFiles(FileList op) {
+        ops.add(op);   
+    }
+    
+	/**
+	 * How many lines are in the file?    
+	 */
+    public void addLineCount(FileLineCount op) {
+        ops.add(op);   
+    }
+    
+    /** While multiple ops could be added, only the first one is executed. */
+    public void execute() {
+        if (file == null)
+            return;
+        if (ops.size() == 0)
+            return;
+        FileOp op = (FileOp)ops.get(0);
+        String value = op.execute(file);
+        if (property != null) {
+            Unset unset = new Unset();
+            unset.setProject(getProject());
+            unset.setName(property);
+            unset.execute();
+            getProject().setProperty(property, value);
+        }
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FinallyTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FinallyTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/FinallyTask.java	(revision 15023)
@@ -0,0 +1,67 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.taskdefs.Sequential;
+
+
+/**
+ * This is identical to Sequential and can be used on its own as a
+ * Sequential task. Its intended use is as a nested element of the TryTask.
+ *
+ * @author Dale Anson, danson@germane-software.com
+ * @since Ant 1.5
+ */
+public class FinallyTask extends Sequential {
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Find.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Find.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Find.java	(revision 15023)
@@ -0,0 +1,206 @@
+package ise.antelope.tasks;
+
+import java.util.regex.*;
+
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class Find extends Task {
+
+    private String findIn = null;
+    private String regex = null;
+    private String property = null;
+    private int group = 0;
+    private boolean dotall = false;
+    private boolean caseInsensitive = false;
+    private boolean multiLine = false;
+    private boolean unicodeCase = false;
+    private boolean canonEq = false;
+    private boolean comments = false;
+    private boolean unixLines = false;
+    private boolean allMatches = false;
+    private String separator = System.getProperty("line.separator");
+
+    /**
+     * Where to look.
+     *
+     * @param string  The new in value
+     */
+    public void setIn(String string) {
+        findIn = string;
+    }
+
+    /**
+     * What to look for.
+     *
+     * @param regex  The new regex value
+     */
+    public void setRegex(String regex) {
+        this.regex = regex;
+    }
+
+    /**
+     * Where to put the results of the search. If 'allmatches' is true, then
+     * a second property with this name plus "_count" will be created with the
+     * number of matches found.
+     *
+     * @param name  The new property value
+     */
+    public void setProperty(String name) {
+        property = name;
+    }
+
+    /**
+     * Set a specific group from the regex.
+     *
+     * @param g  The new group value
+     */
+    public void setGroup(int g) {
+        group = g;
+    }
+
+    /**
+     * Sets the dotall attribute for the regex.
+     *
+     * @param b  The new dotall value
+     */
+    public void setDotall(boolean b) {
+        dotall = b;
+    }
+
+    /**
+     * Sets the caseinsensitive attribute for the regex.
+     *
+     * @param b  The new caseinsensitive value
+     */
+    public void setCaseinsensitive(boolean b) {
+        caseInsensitive = b;
+    }
+
+    /**
+     * Sets the multiline attribute for the regex.
+     *
+     * @param b  The new multiline value
+     */
+    public void setMultiline(boolean b) {
+        multiLine = b;
+    }
+
+    /**
+     * Sets the unicodecase attribute for the regex.
+     *
+     * @param b  The new unicodecase value
+     */
+    public void setUnicodecase(boolean b) {
+        unicodeCase = b;
+    }
+
+    /**
+     * Sets the canoneq attribute for the regex.
+     *
+     * @param b  The new canoneq value
+     */
+    public void setCanoneq(boolean b) {
+        canonEq = b;
+    }
+
+    /**
+     * Sets the comments attribute for the regex.
+     *
+     * @param b  The new comments value
+     */
+    public void setComments(boolean b) {
+        comments = b;
+    }
+    
+    public void setUnixlines(boolean b) {
+        unixLines = b;   
+    }
+
+    /**
+     * If true, concatentates all matches into a single result, if false, only
+     * the first match is returned in the result.
+     *
+     * @param b  default is false, only show the first match.
+     */
+    public void setAllmatches(boolean b) {
+        allMatches = b;
+    }
+
+    /**
+     * Uses in conjunction with <code>setAllmatches</code>, this string will be
+     * placed between each match in the final result.
+     *
+     * @param s  the separator, default is "".
+     */
+    public void setSeparator(String s) {
+        separator = s;
+    }
+
+    /** Do the grep */
+    public void execute() {
+        // check attributes
+        if (findIn == null)
+            throw new BuildException("'in' is required");
+        if (regex == null)
+            throw new BuildException("'regex' is required");
+        if (property == null)
+            throw new BuildException("'property' is required");
+
+        // set flags for pattern
+        int flags = 0;
+        if (dotall)
+            flags += Pattern.DOTALL;
+        if (caseInsensitive)
+            flags += Pattern.CASE_INSENSITIVE;
+        if (multiLine)
+            flags += Pattern.MULTILINE;
+        if (unicodeCase)
+            flags += Pattern.UNICODE_CASE;
+        if (canonEq)
+            flags += Pattern.CANON_EQ;
+        if (comments)
+            flags += Pattern.COMMENTS;
+        if (unixLines)
+            flags += Pattern.UNIX_LINES;
+
+        try {
+            Pattern p = Pattern.compile(regex, flags);
+            Matcher m = p.matcher(findIn);
+            StringBuffer result = new StringBuffer();
+            int count = 0;
+            if (allMatches) {
+                while (m.find()) {
+                    String match = m.group(group);
+                    if (match != null) {
+                        result.append(match).append(separator);
+                        ++ count;   
+                    }
+                }
+            }
+            else if (m.find()) {
+                String match = m.group(group);
+                if (match != null)
+                    result.append(match);
+            }
+
+            if (result.length() > 0) {
+                getProject().setUserProperty(property, result.toString());
+                if (allMatches)
+                    getProject().setUserProperty(property + "_count", String.valueOf(count));
+            }
+            else
+                log("No match.");
+        }
+        catch (Exception e) {
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ForTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ForTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ForTask.java	(revision 15023)
@@ -0,0 +1,306 @@
+/*
+*  The Apache Software License, Version 1.1
+*
+*  Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+*  reserved.
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*  notice, this list of conditions and the following disclaimer.
+*
+*  2. Redistributions in binary form must reproduce the above copyright
+*  notice, this list of conditions and the following disclaimer in
+*  the documentation and/or other materials provided with the
+*  distribution.
+*
+*  3. The end-user documentation included with the redistribution, if
+*  any, must include the following acknowlegement:
+*  "This product includes software developed by the
+*  Apache Software Foundation (http://www.apache.org/)."
+*  Alternately, this acknowlegement may appear in the software itself,
+*  if and wherever such third-party acknowlegements normally appear.
+*
+*  4. The names "The Jakarta Project", "Ant", and "Apache Software
+*  Foundation" must not be used to endorse or promote products derived
+*  from this software without prior written permission. For written
+*  permission, please contact apache@apache.org.
+*
+*  5. Products derived from this software may not be called "Apache"
+*  nor may "Apache" appear in their names without prior written
+*  permission of the Apache Group.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+*  SUCH DAMAGE.
+*  ====================================================================
+*
+*  This software consists of voluntary contributions made by many
+*  individuals on behalf of the Apache Software Foundation.  For more
+*  information on the Apache Software Foundation, please see
+*  <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.Vector;
+import org.apache.tools.ant.TaskAdapter;
+import org.apache.tools.ant.IntrospectionHelper;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.RuntimeConfigurable;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.UnknownElement;
+
+/**
+ * @author     Dale Anson, danson@germane-software.com
+ * @version    $Revision: 1.3 $
+ * @since      Ant 1.5
+ * @ant.task   category="control"
+ */
+public class ForTask extends Task implements TaskContainer {
+
+   /** Vector to hold the nested tasks */
+   private Vector tasks = new Vector();
+   private String initName = null;
+   private int initValue = 0;
+   private int maxValue = 1;
+   private int inc = 1;
+
+   /**
+    * Sets the initName attribute of the ForTask object
+    *
+    * @param name  The new initName value
+    */
+   public void setInitName( String name ) {
+      initName = name;
+   }
+
+   /**
+    * Sets the initvalue attribute of the ForTask object
+    *
+    * @param i  The new initvalue value
+    */
+   public void setInitvalue( int i ) {
+      initValue = i;
+   }
+
+   /**
+    * Sets the maxvalue attribute of the ForTask object
+    *
+    * @param i  The new maxvalue value
+    */
+   public void setMaxvalue( int i ) {
+      maxValue = i;
+   }
+
+   /**
+    * Sets the inc attribute of the ForTask object
+    *
+    * @param i  The new inc value
+    */
+   public void setInc( int i ) {
+      inc = i;
+   }
+
+
+   /**
+    * Add a nested task
+    *
+    * @param task  Nested task
+    */
+   public void addTask( Task task ) {
+      //task.maybeConfigure();
+      tasks.addElement( task );
+   }
+
+   public void maybeConfigure() {
+      if ( isInvalid() ) {
+         super.maybeConfigure();
+      }
+      else {
+         getRuntimeConfigurableWrapper().maybeConfigure( getProject(), false );
+      }
+   }
+
+   /**
+    * Execute all tasks.
+    *
+    * @exception BuildException  Description of Exception
+    */
+   public void execute() throws BuildException {
+      for ( int i = initValue; i < maxValue; i += inc ) {
+         if ( initName != null ) {
+            getProject().setUserProperty( initName, String.valueOf( i ) );
+         }
+         Target target = new Target();
+         target.setName( "for.subtarget" );
+         getProject().addOrReplaceTarget( target );
+         for ( Enumeration e = tasks.elements(); e.hasMoreElements();  ) {
+            Task task = (Task)e.nextElement();
+            addTaskToTarget( target, task );
+         }
+         
+         target.execute();
+      }
+   }
+
+   private void addTaskToTarget( Target target, Task task ) {
+      UnknownElement replacement = new UnknownElement( taskType );  // shouldn't do taskType, for Ant 1.6 and later there is a getTaskType method
+      replacement.setProject( getProject() );
+      invokeMethod( replacement, "setTaskType", taskType );
+      replacement.setTaskName( task.getTaskName() );
+      replacement.setLocation( task.getLocation() );
+      replacement.setOwningTarget( target );
+      replacement.setRuntimeConfigurableWrapper( task.getRuntimeConfigurableWrapper() );
+      invokeMethod( task.getRuntimeConfigurableWrapper(), "setProxy", replacement );
+      replacement.maybeConfigure();
+      log("replacement is a " + replacement.getTaskName() + ", " + replacement.getClass().getName());
+      if (replacement instanceof TaskContainer) {
+         log("replacement is a TaskContainer");
+         invokeMethod(replacement, "handleChildren", new Object[]{this, this.getRuntimeConfigurableWrapper()});
+      }
+      target.addTask(replacement);
+   }
+
+   /**
+    * Calls a method on the given object instance with the given argument.
+    *
+    * @param instance    the object instance
+    * @param methodName  the name of the method to invoke
+    * @param arg         the argument to pass to the method
+    * @return            Description of the Returned Value
+    * @see               PrivilegedAccessor#invokeMethod(Object,String,Object[])
+    */
+   private Object invokeMethod( Object instance, String methodName, Object arg ) {
+      try {
+         Object[] args = new Object[1];
+         args[0] = arg;
+         return invokeMethod( instance, methodName, args );
+      }
+      catch ( Exception e ) {
+         e.printStackTrace();
+         return null;
+      }
+   }
+
+   /**
+    * Calls a method on the given object instance with the given arguments.
+    *
+    * @param instance    the object instance
+    * @param methodName  the name of the method to invoke
+    * @param args        an array of objects to pass as arguments
+    * @return            Description of the Returned Value
+    * @see               PrivilegedAccessor#invokeMethod(Object,String,Object)
+    */
+   private Object invokeMethod( Object instance, String methodName, Object[] args ) {
+      try {
+         Class[] classTypes = null;
+         if ( args != null ) {
+            classTypes = new Class[args.length];
+            for ( int i = 0; i < args.length; i++ ) {
+               if ( args[i] != null )
+                  classTypes[i] = args[i].getClass();
+            }
+         }
+         return getMethod( instance, methodName, classTypes ).invoke( instance, args );
+      }
+      catch ( Exception e ) {
+         return null;
+      }
+   }
+
+   /**
+    * @param instance    the object instance
+    * @param methodName  the
+    * @param classTypes
+    * @return            The method value
+    */
+   private Method getMethod( Object instance, String methodName, Class[] classTypes ) {
+      try {
+         Method accessMethod = getMethod( instance.getClass(), methodName, classTypes );
+         accessMethod.setAccessible( true );
+         return accessMethod;
+      }
+      catch ( Exception e ) {
+         return null;
+      }
+   }
+
+   /**
+    * Return the named method with a method signature matching classTypes from
+    * the given class.
+    *
+    * @param thisClass
+    * @param methodName
+    * @param classTypes
+    * @return                           The method value
+    * @exception NoSuchMethodException  Description of Exception
+    */
+   private Method getMethod( Class thisClass, String methodName, Class[] classTypes ) throws NoSuchMethodException {
+      if ( thisClass == null )
+         throw new NoSuchMethodException( "Invalid method : " + methodName );
+      try {
+         return thisClass.getDeclaredMethod( methodName, classTypes );
+      }
+      catch ( NoSuchMethodException e ) {
+         return getMethod( thisClass.getSuperclass(), methodName, classTypes );
+      }
+   }
+
+   /**
+    * Gets the value of the named field and returns it as an object.
+    *
+    * @param instance   the object instance
+    * @param fieldName  the name of the field
+    * @return           an object representing the value of the field
+    */
+   private Object getValue( Object instance, String fieldName ) {
+      try {
+         Field field = getField( instance.getClass(), fieldName );
+         field.setAccessible( true );
+         return field.get( instance );
+      }
+      catch ( Exception e ) {
+         return null;
+      }
+   }
+
+   /**
+    * Return the named field from the given class.
+    *
+    * @param thisClass
+    * @param fieldName
+    * @return           The field value
+    */
+   private Field getField( Class thisClass, String fieldName ) {
+      try {
+         if ( thisClass == null )
+            throw new NoSuchFieldException( "Invalid field : " + fieldName );
+         try {
+            return thisClass.getDeclaredField( fieldName );
+         }
+         catch ( NoSuchFieldException e ) {
+            return getField( thisClass.getSuperclass(), fieldName );
+         }
+      }
+      catch ( Exception e ) {
+         return null;
+      }
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Foreach.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Foreach.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Foreach.java	(revision 15023)
@@ -0,0 +1,198 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.util.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+
+/**
+ * Task container that iterates through a list of values, puts each value into a
+ * property, then executes all nested tasks.
+ *
+ * @author    Dale Anson, danson@germane-software.com
+ * @version   $Revision: 1.1 $
+ * @since     Ant 1.5
+ */
+public class Foreach extends Task implements TaskContainer {
+
+    // attribute storage
+    private boolean failOnError = true;
+
+    // vector to hold any nested tasks
+    private Vector tasks = new Vector();
+
+    private String values = "";
+    private String separator = ",";
+    private String name = null;
+    private boolean trim = false;
+
+
+    /**
+     * Ant boolean, stop the build process if any nested task fails. Defaults to
+     * true.
+     *
+     * @param fail  Ant boolean, whether to stop the build on error.
+     */
+    public void setFailonerror(boolean fail) {
+        failOnError = fail;
+    }
+
+    /**
+     * Sets the values to iterate through.
+     *
+     * @param values  The new values value
+     */
+    public void setValues(String values) {
+        this.values = values;
+    }
+
+    /**
+     * Sets the separator for the values string, defaults to comma.
+     *
+     * @param separator  The new separator value
+     */
+    public void setSeparator(String separator) {
+        this.separator = separator;
+    }
+
+
+    /**
+     * Sets the name of the property to set the value in.
+     *
+     * @param name  The new property value
+     */
+    public void setProperty(String name) {
+        this.name = name;
+    }
+
+
+    /**
+     * If true, will trim whitespace from both ends of the value. Default is
+     * false, do not trim.
+     *
+     * @param trim  The new trim value
+     */
+    public void setTrim(boolean trim) {
+        this.trim = trim;
+    }
+
+    /**
+     * Override {@link org.apache.tools.ant.Task#maybeConfigure maybeConfigure}
+     * in a way that leaves the nested tasks unconfigured until they get
+     * executed.
+     *
+     * @exception BuildException  Description of Exception
+     * @since                     Ant 1.5
+     */
+    public void maybeConfigure() throws BuildException {
+        if (isInvalid()) {
+            super.maybeConfigure();
+        }
+        else {
+            getRuntimeConfigurableWrapper().maybeConfigure(getProject(), false);
+        }
+    }
+
+    /**
+     * Add a nested task to execute. <p>
+     *
+     *
+     *
+     * @param task  Nested task to execute. <p>
+     *
+     *
+     */
+    public void addTask(Task task) {
+        if (task != null)
+            tasks.addElement(task);
+    }
+
+
+    /**
+     * Execute this task and all nested Tasks.
+     *
+     * @exception BuildException  Description of Exception
+     */
+    public void execute() throws BuildException {
+        Unset unset = new Unset();
+        StringTokenizer st = new StringTokenizer(values, separator);
+        while (st.hasMoreTokens()) {
+            String value = st.nextToken();
+            value = trim ? value.trim() : value;
+            if (name != null) {
+                unset.setName(name);
+                unset.execute();
+                getProject().setProperty(name, value);
+            }
+            for (Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+                try {
+                    Task task = (Task) e.nextElement();
+                    task.perform();
+                }
+                catch (Exception ex) {
+                    if (failOnError)
+                        throw new BuildException(ex.getMessage());
+                    else
+                        log(ex.getMessage());
+                }
+            }
+        }
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Grep.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Grep.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Grep.java	(revision 15023)
@@ -0,0 +1,224 @@
+package ise.antelope.tasks;
+
+import java.util.*;
+import java.util.regex.*;
+
+
+/**
+ * Borrowed from Antelope, modified to be a general purpose class instead of
+ * an Ant task. 
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class Grep  {
+
+    private String findIn = null;
+    private String regex = null;
+    private int group = 0;
+    private boolean dotall = false;
+    private boolean caseInsensitive = false;
+    private boolean multiLine = false;
+    private boolean unicodeCase = false;
+    private boolean canonEq = false;
+    private boolean comments = false;
+    private boolean unixLines = false;
+    private boolean allMatches = false;
+    private String separator = System.getProperty("line.separator");
+    
+    private String grep_match = null;
+    private int count = 0;
+    
+    private List matches = new ArrayList();
+
+    /**
+     * Where to look.
+     *
+     * @param string  The new in value
+     */
+    public void setIn(String string) {
+        findIn = string;
+    }
+
+    /**
+     * What to look for.
+     *
+     * @param regex  The new regex value
+     */
+    public void setRegex(String regex) {
+        this.regex = regex;
+    }
+
+    /**
+     * Set a specific group from the regex.
+     *
+     * @param g  The new group value
+     */
+    public void setGroup(int g) {
+        group = g;
+    }
+
+    /**
+     * Sets the dotall attribute for the regex.
+     *
+     * @param b  The new dotall value
+     */
+    public void setDotall(boolean b) {
+        dotall = b;
+    }
+
+    /**
+     * Sets the caseinsensitive attribute for the regex.
+     *
+     * @param b  The new caseinsensitive value
+     */
+    public void setCaseinsensitive(boolean b) {
+        caseInsensitive = b;
+    }
+
+    /**
+     * Sets the multiline attribute for the regex.
+     *
+     * @param b  The new multiline value
+     */
+    public void setMultiline(boolean b) {
+        multiLine = b;
+    }
+
+    /**
+     * Sets the unicodecase attribute for the regex.
+     *
+     * @param b  The new unicodecase value
+     */
+    public void setUnicodecase(boolean b) {
+        unicodeCase = b;
+    }
+
+    /**
+     * Sets the canoneq attribute for the regex.
+     *
+     * @param b  The new canoneq value
+     */
+    public void setCanoneq(boolean b) {
+        canonEq = b;
+    }
+
+    /**
+     * Sets the comments attribute for the regex.
+     *
+     * @param b  The new comments value
+     */
+    public void setComments(boolean b) {
+        comments = b;
+    }
+    
+    public void setUnixlines(boolean b) {
+        unixLines = b;   
+    }
+
+    /**
+     * If true, concatentates all matches into a single result, if false, only
+     * the first match is returned in the result.
+     *
+     * @param b  default is false, only show the first match.
+     */
+    public void setAllmatches(boolean b) {
+        allMatches = b;
+    }
+    
+	/**
+	 * @return the count of the matches found by the regular expression in 
+	 * the string
+	 */
+    public int getCount() {
+        return matches.size();   
+    }
+
+	/**
+	 * @return the match found by the regular expression in the string.  If
+	 * 'all matches' was set to true, then each match will be contained in
+	 * this string, separated by the separator specified in <code>setSeparator</code>
+	 */
+    public String getMatch() {
+        return grep_match;   
+    }
+    
+	/**
+	 * @return an Iterator over all matches found by the regular expression.    
+	 */
+    public Iterator getMatches() {
+        return matches.iterator();      
+    }
+    
+	/**
+	 * @return if there are multiple matches, return the <code>i</code><sup>th</sup> match.    
+	 */
+    public String getMatch(int i) {
+        return (i < 0 || i >= matches.size()) ? null : (String)matches.get(i);
+    }
+
+    /**
+     * Used in conjunction with <code>setAllmatches</code>, this string will be
+     * placed between each match in the final result.
+     *
+     * @param s  the separator, default is "".
+     */
+    public void setSeparator(String s) {
+        separator = s;
+    }
+
+    /** Do the grep */
+    public String grep() {
+        // check attributes
+        if (findIn == null)
+            throw new IllegalArgumentException("'in' is required");
+        if (regex == null)
+            throw new IllegalArgumentException("'regex' is required");
+
+        // set flags for pattern
+        int flags = 0;
+        if (dotall)
+            flags += Pattern.DOTALL;
+        if (caseInsensitive)
+            flags += Pattern.CASE_INSENSITIVE;
+        if (multiLine)
+            flags += Pattern.MULTILINE;
+        if (unicodeCase)
+            flags += Pattern.UNICODE_CASE;
+        if (canonEq)
+            flags += Pattern.CANON_EQ;
+        if (comments)
+            flags += Pattern.COMMENTS;
+        if (unixLines)
+            flags += Pattern.UNIX_LINES;
+
+        try {
+            Pattern p = Pattern.compile(regex, flags);
+            Matcher m = p.matcher(findIn);
+            StringBuffer result = new StringBuffer();
+            matches = new ArrayList();
+            if (allMatches) {
+                while (m.find()) {
+                    String match = m.group(group);
+                    if (match != null) {
+                        result.append(match).append(separator);
+                        matches.add(match);
+                    }
+                }
+            }
+            else if (m.find()) {
+                String match = m.group(group);
+                if (match != null) {
+                    result.append(match);
+                    matches.add(match);   
+                }
+            }
+
+            grep_match = result.length() > 0 ? result.toString() : null;
+            return grep_match;
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/HostnameTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/HostnameTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/HostnameTask.java	(revision 15023)
@@ -0,0 +1,159 @@
+package ise.antelope.tasks;
+
+import java.io.IOException;
+import java.net.*;
+import java.util.Enumeration;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+/**
+ * A task to put hostname or IP in a property. The default property is
+ * 'hostname'. <p>
+ *
+ * I updated this task in Apr 2005 to be able to show all hostnames and IP's for
+ * the local machine, which is sometimes handy for machines with dual cards,
+ * like maybe an ethernet card and a wireless card. <p>
+ *
+ * Dale Anson, May 2001
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class HostnameTask extends Task {
+
+    private String property = "hostname";
+    private boolean useIp = false;
+    private String host = null;
+    private String nIC = null;
+    private boolean failOnError = false;
+    private boolean showAll = false;
+    private boolean canonical = true;
+    private int outputType = 0;
+    public static final int HOST = 0;
+    public static final int IP = 1;
+    public static final int CANON = 2;
+
+    /**
+     * @param p  The name of the property to hold the hostname or IP address.
+     */
+    public void setProperty(String p) {
+        property = p;
+    }
+    
+    /**
+     * Should this task get the IP address of the local host instead of the
+     * hostname? Default is no, get the hostname, not the IP address.
+     *
+     * @param b  The new ip value
+     */
+    public void setShowip(boolean b) {
+        useIp = b;
+        outputType = IP;
+    }
+
+    /**
+     * Should the build fail if this task fails? Default is no.
+     *
+     * @param b  The new failonerror value
+     */
+    public void setFailonerror(boolean b) {
+        failOnError = b;
+    }
+
+    /**
+     * Set a specific network interface to get info for.
+     *
+     * @param n  The new nic value
+     */
+    public void setNic(String n) {
+        nIC = n;
+    }
+
+    /**
+     * Show all network interfaces, hostnames and IPs for the local host.
+     * Default is false. If used, output will be something like:<br>
+     * lo:127.0.0.1, eth0:mycomputer.somewhere.com, eth1:wireless.somwhere.com
+     *
+     * @param b  if true, show all hostnames and IPs
+     */
+    public void setShowall(boolean b) {
+        showAll = b;
+    }
+    
+    public void setShowcanonical(boolean b) {
+        canonical = b;
+        outputType = CANON;
+    }   
+
+    /** Description of the Method */
+    public void execute() {
+        try {
+            if (showAll) {
+                StringBuffer hostnames = new StringBuffer();
+                Enumeration nics = NetworkInterface.getNetworkInterfaces();
+                while (nics.hasMoreElements()) {
+                    NetworkInterface nic = (NetworkInterface) nics.nextElement();
+                    hostnames.append(nic.getName() + ":");
+                    Enumeration addrs = nic.getInetAddresses();
+                    while (addrs.hasMoreElements()) {
+                        InetAddress addr = (InetAddress) addrs.nextElement();
+                        String hostname = getAddress(addr);
+                        if (hostname != null && hostname.trim().length() > 0)
+                            hostnames.append(hostname);
+                        if (addrs.hasMoreElements())
+                            hostnames.append(", ");
+                    }
+                    if (nics.hasMoreElements())
+                        hostnames.append(", ");
+                }
+                getProject().setProperty(property, hostnames.toString());
+            }
+            else if (nIC != null) {
+                StringBuffer hostnames = new StringBuffer();
+                Enumeration nics = NetworkInterface.getNetworkInterfaces();
+                while (nics.hasMoreElements()) {
+                    NetworkInterface nic = (NetworkInterface) nics.nextElement();
+                    if (nIC.equals(nic.getName())) {
+                        hostnames.append(nic.getName() + ":");
+                        Enumeration addrs = nic.getInetAddresses();
+                        while (addrs.hasMoreElements()) {
+                            InetAddress addr = (InetAddress) addrs.nextElement();
+                            String hostname = getAddress(addr);
+                            if (hostname != null && hostname.trim().length() > 0)
+                                hostnames.append(hostname);
+                            if (addrs.hasMoreElements())
+                                hostnames.append(", ");
+                        }
+                    }
+                }
+                getProject().setProperty(property, hostnames.toString());
+            }
+            else {
+                InetAddress addr = InetAddress.getLocalHost();
+                String hostname = getAddress(addr);
+                getProject().setProperty(property, hostname);
+            }
+        }
+        catch (IOException e) {
+            if (failOnError)
+                throw new BuildException(e.getMessage());
+            else
+                log(e.getMessage());
+        }
+    }
+    
+    private String getAddress(InetAddress addr) {
+        String hostname = "";
+        switch (outputType) {
+            case IP:
+                hostname = addr.getHostAddress();
+                break;
+            case CANON:
+                hostname = addr.getCanonicalHostName();
+                break;
+            default:
+                hostname = addr.getHostName();
+        }
+        return hostname;
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/IfTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/IfTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/IfTask.java	(revision 15023)
@@ -0,0 +1,316 @@
+/*
+*  The Apache Software License, Version 1.1
+*
+*  Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+*  reserved.
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*  notice, this list of conditions and the following disclaimer.
+*
+*  2. Redistributions in binary form must reproduce the above copyright
+*  notice, this list of conditions and the following disclaimer in
+*  the documentation and/or other materials provided with the
+*  distribution.
+*
+*  3. The end-user documentation included with the redistribution, if
+*  any, must include the following acknowlegement:
+*  "This product includes software developed by the
+*  Apache Software Foundation (http://www.apache.org/)."
+*  Alternately, this acknowlegement may appear in the software itself,
+*  if and wherever such third-party acknowlegements normally appear.
+*
+*  4. The names "The Jakarta Project", "Ant", and "Apache Software
+*  Foundation" must not be used to endorse or promote products derived
+*  from this software without prior written permission. For written
+*  permission, please contact apache@apache.org.
+*
+*  5. Products derived from this software may not be called "Apache"
+*  nor may "Apache" appear in their names without prior written
+*  permission of the Apache Group.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+*  SUCH DAMAGE.
+*  ====================================================================
+*
+*  This software consists of voluntary contributions made by many
+*  individuals on behalf of the Apache Software Foundation.  For more
+*  information on the Apache Software Foundation, please see
+*  <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+import java.util.Enumeration;
+
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskAdapter;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.taskdefs.Available;
+import org.apache.tools.ant.taskdefs.Checksum;
+import org.apache.tools.ant.taskdefs.Sequential;
+import org.apache.tools.ant.taskdefs.UpToDate;
+import org.apache.tools.ant.taskdefs.condition.*;
+
+
+/**
+ * Similar to Java's 'if' keyword, verifies that a given property has a given
+ * value and executes embedded tasks if it does. Does nothing if the property
+ * value is not as expected or the property does not exist. <p>
+ *
+ * <p>
+ *
+ * Can hold other tasks including IfTask, in particular, an ElseTask and a
+ * Break.
+ *
+ * @author   Dale Anson, danson@germane-software.com
+ * @since    Ant 1.5
+ */
+public class IfTask extends Task implements TaskContainer, Breakable {
+
+   // attribute storage
+   private boolean exists = true;
+   private String value = null;
+   private String name = null;
+
+   private Task else_task = null;
+   private Task condition_task = null;
+
+   // vector to hold any nested tasks
+   private Vector tasks = new Vector();
+
+   // break condition
+   private boolean doBreak = false;
+
+
+   /** Automatically define dependent tasks.  */
+   public void init() {
+      // may need to do this differently for Ant 1.6, need to check when 1.6
+      // is final
+      getProject().addTaskDefinition( "else", ElseTask.class );
+      getProject().addTaskDefinition( "bool", BooleanConditionTask.class );
+      getProject().addTaskDefinition( "break", Break.class );
+   }
+
+
+   /**
+    * Set the name of the property to test. Required unless nested condition is
+    * used.
+    *
+    * @param name  the name of the property to test.
+    */
+   public void setName( String name ) {
+      this.name = name;
+   }
+
+
+   /**
+    * Set the expected value of the property. Implies 'exists'. <code>execute</code>
+    * method throws BuildException if the actual value is not the same as this value.
+    * Optional.
+    *
+    * @param value  the expected value of the property.
+    */
+   public void setValue( String value ) {
+      this.value = value;
+   }
+
+
+   /**
+    * Set the 'exists' attribute. If true, throws BuildException if the property
+    * does not exist. Optional, default is true.
+    *
+    * @param exists  Ant boolean, whether the value must exist.
+    */
+   public void setExists( String exists ) {
+      this.exists = getProject().toBoolean( exists );
+   }
+
+
+   /**
+    * Required by Breakable.
+    *
+    * @param b  The new break value
+    */
+   public void setBreak( boolean b ) {
+      doBreak = b;
+   }
+
+
+   /**
+    * Required by Breakable.
+    *
+    * @param b  The feature to be added to the Break attribute
+    */
+   public void addBreak( Break b ) {
+      // does nothing for Ant 1.5, next line is for Ant 1.6
+      addTask( b );
+   }
+
+   public void addElse( ElseTask elseTask ) {
+      addTask( elseTask );
+   }
+
+   public void addBool( BooleanConditionTask boolTask ) {
+      addTask( boolTask );
+   }
+
+   /**
+    * Required by Breakable.
+    *
+    * @return   Description of the Return Value
+    */
+   public boolean doBreak() {
+      return doBreak;
+   }
+
+
+   /**
+    * Override {@link org.apache.tools.ant.Task#maybeConfigure maybeConfigure}
+    * in a way that leaves the nested tasks unconfigured until they get
+    * executed.
+    *
+    * @exception BuildException  Description of the Exception
+    * @since                     Ant 1.5
+    */
+   public void maybeConfigure() throws BuildException {
+      if ( isInvalid() ) {
+         super.maybeConfigure();
+      }
+      else {
+         getRuntimeConfigurableWrapper().maybeConfigure( getProject(), false );
+      }
+   }
+
+
+   /**
+    * Add a nested task to execute. <p>
+    *
+    * @param task  Nested task to execute. <p>
+    */
+   public void addTask( Task task ) {
+      if ( task instanceof ElseTask ) {
+         if ( else_task == null ) {
+            else_task = task;
+            return ;
+         }
+         else {
+            throw new BuildException( "Only one <else> allowed per If." );
+         }
+      }
+      else if ( task instanceof BooleanConditionTask ) {
+         if ( condition_task == null ) {
+            condition_task = task;
+            return ;
+         }
+         else {
+            throw new BuildException( "Only one <bool> allowed per If." );
+         }
+      }
+      tasks.addElement( task );
+   }
+
+
+   /**
+    * Execute this task and all nested Tasks, checking for Breaks and
+    * Breakables.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   public void execute() throws BuildException {
+      if ( condition_task == null ) {
+         // no conditions, so property name is required
+         if ( name == null || name.equals( "" ) ) {
+            throw new BuildException( "The 'name' attribute is required." );
+         }
+
+         // get the property value from the project
+         String prop_value = getProject().getProperty( name );
+
+         // check if the property exists
+         if ( exists && prop_value == null ) {
+            doElse();
+            return ;
+         }
+         else if ( !exists && prop_value != null ) {
+            doElse();
+            return ;
+         }
+
+         // check that the property has the right value
+         if ( value != null ) {
+            if ( prop_value == null ) {
+               doElse();
+               return ;
+            }
+            else if ( prop_value != null && !prop_value.equals( value ) ) {
+               doElse();
+               return ;
+            }
+         }
+
+         // all is well, so do the if
+         doIf();
+      }
+      else {
+         // have nested condition
+         if ( ( ( BooleanConditionTask ) condition_task ).eval() ) {
+            doIf();
+         }
+         else {
+            doElse();
+         }
+      }
+   }
+
+
+   /**
+    * Do the 'if' part of the if/else.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void doIf() throws BuildException {
+      // execute all nested tasks
+      for ( Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+         Task task = ( Task ) e.nextElement();
+         if ( task instanceof Breakable ) {
+            task.perform();
+            if ( ( ( Breakable ) task ).doBreak() ) {
+               setBreak( true );
+               return ;
+            }
+         }
+         else {
+            task.perform();
+         }
+      }
+   }
+
+
+   /**
+    * Do the 'else' part of the if/else.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   private void doElse() throws BuildException {
+      if ( else_task == null ) {
+         return ;
+      }
+      else_task.perform();
+   }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Limit.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Limit.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Limit.java	(revision 15023)
@@ -0,0 +1,323 @@
+
+/*
+* Copyright (c) 2001-2004 Ant-Contrib project.  All rights reserved.
+*
+* Licensed 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.
+*/
+package ise.antelope.tasks;
+
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+import ise.antelope.tasks.typedefs.TimeUnit;
+
+
+/**
+ * Limits the amount of time that a task or set of tasks can run. This is useful
+ * for tasks that may "hang" or otherwise not complete in a timely fashion. This
+ * task is done when either the maxwait time has expired or all nested tasks are
+ * complete, whichever is first.
+ *
+ * <p>Developed for use with Antelope, migrated to ant-contrib Oct 2003.
+ *
+ * @author    Dale Anson
+ * @author    Robert D. Rice
+ * @version   $Revision: 1.4 $
+ * @since Ant 1.5
+ */
+public class Limit extends Task implements TaskContainer {
+
+
+   // storage for nested tasks
+   private Vector tasks = new Vector();
+
+
+   // time units, default value is 3 minutes.
+   private long maxwait = 180;
+   protected TimeUnit unit = TimeUnit.SECOND_UNIT;
+
+   // property to set if time limit is reached
+   private String timeoutProperty = null;
+   private String timeoutValue = "true";
+
+
+   // storage for task currently executing
+   private Task currentTask = null;
+
+
+   // used to control thread stoppage
+   private Thread taskRunner = null;
+
+
+   // should the build fail if the time limit has expired? Default is no.
+   private boolean failOnError = false;
+
+
+   private Exception exception = null;
+
+
+
+
+   /**
+    * Add a task to wait on.
+    *
+    * @param task                A task to execute
+    * @exception BuildException  won't happen
+    */
+   public void addTask( Task task ) throws BuildException {
+      tasks.addElement( task );
+   }
+
+
+
+
+   /**
+    * How long to wait for all nested tasks to complete, in units. 
+    * Default is to wait 3 minutes.
+    *
+    * @param wait  time to wait, set to 0 to wait forever.
+    */
+   public void setMaxwait( int wait ) {
+      maxwait = wait;
+   }
+
+   /**
+    * Sets the unit for the max wait. Default is minutes.
+
+    * @param unit valid values are "millisecond", "second", "minute", "hour", "day", and "week".
+
+    */
+   public void setUnit( String unit ) {
+      if ( unit == null )
+         return ;
+      if ( unit.equals( TimeUnit.SECOND ) ) {
+         setMaxWaitUnit( TimeUnit.SECOND_UNIT );
+         return ;
+      }
+      if ( unit.equals( TimeUnit.MILLISECOND ) ) {
+         setMaxWaitUnit( TimeUnit.MILLISECOND_UNIT );
+         return ;
+      }
+      if ( unit.equals( TimeUnit.MINUTE ) ) {
+         setMaxWaitUnit( TimeUnit.MINUTE_UNIT );
+         return ;
+      }
+      if ( unit.equals( TimeUnit.HOUR ) ) {
+         setMaxWaitUnit( TimeUnit.HOUR_UNIT );
+         return ;
+      }
+      if ( unit.equals( TimeUnit.DAY ) ) {
+         setMaxWaitUnit( TimeUnit.DAY_UNIT );
+         return ;
+      }
+      if ( unit.equals( TimeUnit.WEEK ) ) {
+         setMaxWaitUnit( TimeUnit.WEEK_UNIT );
+         return ;
+      }
+
+   }
+
+   /**
+    * Set a millisecond wait value.
+    * @param value the number of milliseconds to wait.
+    */
+   public void setMilliseconds( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.MILLISECOND_UNIT );
+   }
+
+   /**
+    * Set a second wait value.
+    * @param value the number of seconds to wait.
+    */
+   public void setSeconds( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.SECOND_UNIT );
+   }
+
+   /**
+    * Set a minute wait value.
+    * @param value the number of milliseconds to wait.
+    */
+   public void setMinutes( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.MINUTE_UNIT );
+   }
+
+   /**
+    * Set an hours wait value.
+    * @param value the number of hours to wait.
+    */
+   public void setHours( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.HOUR_UNIT );
+   }
+
+   /**
+    * Set a day wait value.
+    * @param value the number of days to wait.
+    */
+   public void setDays( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.DAY_UNIT );
+   }
+
+   /**
+    * Set a week wait value.
+    * @param value the number of weeks to wait.
+    */
+   public void setWeeks( int value ) {
+      setMaxwait( value );
+      setMaxWaitUnit( TimeUnit.WEEK_UNIT );
+   }
+
+   /**
+    * Set the max wait time unit, default is minutes.
+    */
+   public void setMaxWaitUnit( TimeUnit unit ) {
+      this.unit = unit;
+   }
+
+
+   /**
+    * Determines whether the build should fail if the time limit has
+    * expired on this task.
+    * Default is no.
+    *
+    * @param fail  if true, fail the build if the time limit has been reached.
+    */
+   public void setFailonerror( boolean fail ) {
+      failOnError = fail;
+   }
+
+
+   /**
+    * Name the property to set after a timeout.
+    *
+    * @param p of property to set if the time limit has been reached.
+    */
+   public void setProperty( String p ) {
+      timeoutProperty = p;
+   }
+
+
+   /**
+    * The value for the property to set after a timeout, defaults to true.
+    *
+    * @param v for the property to set if the time limit has been reached.
+    */
+   public void setValue( String v ) {
+      timeoutValue = v;
+   }
+
+
+   /**
+    * Execute all nested tasks, but stopping execution of nested tasks after
+    * maxwait or when all tasks are done, whichever is first.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   public void execute() throws BuildException {
+      try {
+         // start executing nested tasks
+         final Thread runner =
+            new Thread() {
+               public void run() {
+                  Enumeration e = tasks.elements();
+                  while ( e.hasMoreElements() ) {
+                     if ( taskRunner != this ) {
+                        break;
+                     }
+                     currentTask = ( Task ) e.nextElement();
+                     try {
+                        currentTask.perform();
+                     }
+                     catch ( Exception ex ) {
+                        if ( failOnError ) {
+                           exception = ex;
+                           return ;
+                        }
+                        else {
+                           exception = ex;
+                        }
+                     }
+                  }
+               }
+            };
+         taskRunner = runner;
+         runner.start();
+         runner.join( unit.toMillis( maxwait ) );
+
+
+         // stop executing the nested tasks
+         if ( runner.isAlive() ) {
+            taskRunner = null;
+            runner.interrupt();
+            int index = tasks.indexOf( currentTask );
+            StringBuffer not_ran = new StringBuffer();
+            for ( int i = index + 1; i < tasks.size(); i++ ) {
+               not_ran.append( '<' ).append( ( ( Task ) tasks.get( i ) ).getTaskName() ).append( '>' );
+               if ( i < tasks.size() - 1 ) {
+                  not_ran.append( ", " );
+               }
+            }
+
+
+            // maybe set timeout property
+            if ( timeoutProperty != null ) {
+               getProject().setNewProperty( timeoutProperty, timeoutValue );
+            }
+
+
+            // create output message
+            StringBuffer msg = new StringBuffer();
+            msg.append( "Interrupted task <" )
+            .append( currentTask.getTaskName() )
+            .append( ">. Waited " )
+            .append( ( maxwait ) ).append( " " ).append( unit.getValue() )
+            .append( ", but this task did not complete." )
+            .append( ( not_ran.length() > 0 ?
+                  " The following tasks did not execute: " + not_ran.toString() + "." :
+                  "" ) );
+
+
+            // deal with it
+            if ( failOnError ) {
+               throw new BuildException( msg.toString() );
+            }
+            else {
+               log( msg.toString() );
+            }
+         }
+         else if ( failOnError && exception != null ) {
+            throw new BuildException( exception );
+         }
+      }
+      catch ( Exception e ) {
+         throw new BuildException( e );
+      }
+   }
+
+
+}
+
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Math.java_
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Math.java_	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Math.java_	(revision 15023)
@@ -0,0 +1,667 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Array;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ * Provides access to java.lang.Math and java.lang.StrictMath for Ant. Provides
+ * add, subtract, multiply, divide and mod methods as well as access to all methods
+ * java.lang.Math and java.lang.StrictMath via reflection. 
+ * @author Dale Anson, danson@germane-software.com
+ */
+public class Math {
+
+   private boolean strict = false;
+
+   public Math() {}
+
+   public Math( boolean strict ) {
+      this.strict = strict;
+   }
+
+   public void setStrict( boolean strict ) {
+      this.strict = strict;
+   }
+
+   public boolean isStrict() {
+      return strict;
+   }
+
+   public static double add( double a, double b ) {
+      return a + b;
+   }
+   public static float add( float a, float b ) {
+      return a + b;
+   }
+   public static long add( long a, long b ) {
+      return a + b;
+   }
+   public static int add( int a, int b ) {
+      return a + b;
+   }
+   public static double add( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static float add( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static long add( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static int add( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+
+   public static double subtract( double a, double b ) {
+      return a - b;
+   }
+   public static float subtract( float a, float b ) {
+      return a - b;
+   }
+   public static long subtract( long a, long b ) {
+      return a - b;
+   }
+   public static int subtract( int a, int b ) {
+      return a - b;
+   }
+   public static double subtract( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static float subtract( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static long subtract( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static int subtract( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+
+   public static double multiply( double a, double b ) {
+      return a * b;
+   }
+   public static float multiply( float a, float b ) {
+      return a * b;
+   }
+   public static long multiply( long a, long b ) {
+      return a * b;
+   }
+   public static int multiply( int a, int b ) {
+      return a * b;
+   }
+   public static double multiply( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static float multiply( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static long multiply( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static int multiply( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+
+   public static double divide( double a, double b ) {
+      return a / b;
+   }
+   public static float divide( float a, float b ) {
+      return a / b;
+   }
+   public static long divide( long a, long b ) {
+      return a / b;
+   }
+   public static int divide( int a, int b ) {
+      return a / b;
+   }
+   public static double divide( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b /= a[ i ];
+      return b;
+   }
+   public static float divide( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b /= a[ i ];
+      return b;
+   }
+   public static long divide( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b /= a[ i ];
+      return b;
+   }
+   public static int divide( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b /= a[ i ];
+      return b;
+   }
+
+   public static double mod( double a, double b ) {
+      return a % b;
+   }
+   public static float mod( float a, float b ) {
+      return a % b;
+   }
+   public static long mod( long a, long b ) {
+      return a % b;
+   }
+   public static int mod( int a, int b ) {
+      return a % b;
+   }
+   public static double mod( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static float mod( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static long mod( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static int mod( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+
+   /**
+    * Do a mathematical calculation. The allowed operations are all 
+    * operations supported by java.lang.Math and this class. Assumes data 
+    * type is "double".
+    * @param op the name of a mathematical operation to perform
+    * @param the operands for the operation, these strings must parse to numbers.  
+    */
+   public Number calculate( String op, String[] operands ) {
+      return calculate( op, "double", operands );
+   }
+
+   /**
+    * Do a mathematical calculation. The allowed operations are all 
+    * operations supported by java.lang.Math.
+    * @param op the name of a mathematical operation to perform
+    * @param type the data type of the operands
+    * @param the operands for the operation  
+    */
+   public Number calculate( String op, String type, String[] operands ) {
+      try {
+         if ( operands.length > 2 ) {
+            if ( op.equals( "add" ) ||
+                    op.equals( "subtract" ) ||
+                    op.equals( "multiply" ) ||
+                    op.equals( "divide" ) ||
+                    op.equals( "mod" ) ) {
+               return calculateArray( op, type, operands );
+            }
+            else
+               throw new IllegalArgumentException( "too many operands" );
+         }
+
+         Class c;
+         if ( strict )
+            c = Class.forName( "java.lang.StrictMath" );
+         else
+            c = Class.forName( "java.lang.Math" );
+
+         // check if op is 'random'. Random is a special case in that it is
+         // the only method in Math that takes no parameters.
+         if ( op.equals( "random" ) ) {
+            Method m = c.getDeclaredMethod( op, new Class[] {} );
+            Object result = m.invoke( c, null );
+            return ( Number ) result;
+         }
+
+         // find candidate methods for the requested operation
+         Vector candidates = new Vector();
+         Method[] methods = c.getDeclaredMethods();
+         for ( int i = 0; i < methods.length; i++ ) {
+            String name = methods[ i ].getName();
+            if ( name.equals( op ) ) {
+               candidates.addElement( methods[ i ] );
+            }
+         }
+
+         if ( candidates.size() == 0 ) {
+            // try the other Math
+            //c = Class.forName( "ise.antelope.tasks.Math" );
+            c = this.getClass();
+            methods = c.getDeclaredMethods();
+            for ( int i = 0; i < methods.length; i++ ) {
+               String name = methods[ i ].getName();
+               if ( name.equals( op ) ) {
+                  candidates.addElement( methods[ i ] );
+               }
+            }
+         }
+
+         if ( candidates.size() == 0 )
+            throw new RuntimeException( "Unknown operation: " + op );
+
+         // get the desired data type for the operation, default is
+         // Double.TYPE if no other match is found
+         Class wantTypeClass = getDataType( type );
+
+         // get the parameter count for the candidate methods -- in Math,
+         // all like named methods have the same number of parameters, just
+         // the data types are different. (Fix for bug # 724812 -- the above
+         // statement is true of java.lang.Math, but not of this class.)
+         //int paramCount = ( ( Method ) candidates.elementAt( 0 ) ).getParameterTypes().length;
+         int paramCount = -1;
+         try {
+            for (int i = 0; i <= candidates.size(); i++) {
+               Method candidate = (Method)candidates.elementAt(i);
+               paramCount = candidate.getParameterTypes().length;
+               if (paramCount == operands.length)
+                  break;
+            }
+         }
+         catch(Exception e) {
+            throw new RuntimeException("Wrong number of arguments, have " +
+               operands.length + ", but can't find corresponding method.");            
+         }
+
+         // make sure there are enough arguments to pass to the method
+         // see bug fix above, this is no longer necessary
+         //if ( operands.length != paramCount )
+         //   throw new RuntimeException( "Wrong number of arguments, have " +
+         //         operands.length + ", expected " + paramCount );
+
+         // determine the actual type class for the method to invoke.
+         // Some methods have only one implementation so determine the
+         // typeClass from the method itself, not the desired.
+         Class typeClass = null;
+         if ( candidates.size() == 1 ) {
+            Method m = ( Method ) candidates.elementAt( 0 );
+            typeClass = m.getParameterTypes() [ 0 ];
+         }
+         else {
+            // check each candidate to find one with the desired type
+            Enumeration en = candidates.elements();
+            while ( en.hasMoreElements() ) {
+               Method m = ( Method ) en.nextElement();
+               if ( m.getParameterTypes() [ 0 ].equals( wantTypeClass ) ) {
+                  typeClass = wantTypeClass;
+                  break;
+               }
+            }
+            if ( typeClass == null )
+               throw new RuntimeException( "Can't find a method with parameters of type " + type );
+         }
+
+         // get the method to invoke
+         Class[] paramTypes = new Class[ paramCount ];
+         for ( int i = 0; i < paramCount; i++ ) {
+            paramTypes[ i ] = typeClass;
+         }
+         Method m = c.getDeclaredMethod( op, paramTypes );
+         
+         // load the parameters and invoke the method
+         Object[] params = getParams( typeClass, operands );
+         Object result = m.invoke( c, params );
+
+         return ( Number ) result;
+
+      }
+      catch ( Exception e ) {
+         e.printStackTrace();
+      }
+      return null;
+   }
+
+   /**
+    * Performs a calculation on an array of numbers. The mathematical methods
+    * in this class will accept an array of numbers, so 
+    * <code>add(new int[]{1, 2, 3})</code>
+    * is equivalent to 
+    * <code>add(add(1, 2), 3)</code> 
+    * which is equivalent to 1 + 2 + 3.
+    * @param op the operation to perform
+    * @type the data type of the operands. All operands will be cast to the same
+    * data type
+    * @param operands these strings must parse to numbers.   
+    */
+   private Number calculateArray( String op, String type, String[] operands ) {
+      try {
+         Class c = this.getClass();
+
+         // find candidate methods for the requested operation
+         Vector candidates = new Vector();
+         Method[] methods = c.getDeclaredMethods();
+         for ( int i = 0; i < methods.length; i++ ) {
+            String name = methods[ i ].getName();
+            if ( name.equals( op ) ) {
+               if ( methods[ i ].getParameterTypes().length == 1 ) {
+                  if ( methods[ i ].getParameterTypes() [ 0 ].isArray() )
+                     candidates.addElement( methods[ i ] );
+               }
+            }
+         }
+         if ( candidates.size() == 0 )
+            throw new RuntimeException( "Unknown operation: " + op );
+
+         // get the desired data type for the operation, default is
+         // Double.TYPE if no other match is found
+         Object wantTypeClass = getDataTypeArray( type, operands.length );
+
+         // find the actual method to invoke and invoke it immediately once
+         // it is found
+         Class typeClass = null;
+         Enumeration en = candidates.elements();
+         while ( en.hasMoreElements() ) {
+            Method m = ( Method ) en.nextElement();
+            if ( m.getParameterTypes() [ 0 ].equals( wantTypeClass.getClass() ) ) {
+               typeClass = getDataType( type );
+               Object[] params = getParamsArray( typeClass, operands );
+               Object result = m.invoke( c, params );
+               return ( Number ) result;
+            }
+         }
+      }
+      catch ( Exception e ) {
+         e.printStackTrace();
+      }
+      return null;
+   }
+
+   /**
+    * Converts a string representing a data type into the actual type.
+    * @param type one of "int", "long", "float", or "double"
+    * @return one of Integer.TYPE, Long.TYPE, Float.TYPE, or Double.TYPE. If the 
+    * given type is null or not one of the allowed types, Double.TYPE will be
+    * returned.   
+    */
+   private Class getDataType( String type ) {
+      if ( type == null )
+         return Double.TYPE;
+      if ( type.equals( "int" ) ) {
+         return Integer.TYPE;
+      }
+      else if ( type.equals( "long" ) ) {
+         return Long.TYPE;
+      }
+      else if ( type.equals( "float" ) ) {
+         return Float.TYPE;
+      }
+      else {
+         return Double.TYPE;
+      }
+   }
+
+   /**
+    * Converts a string representing a data type into an Array.
+    * @param type one of "int", "long", "float", or "double"
+    * @param length how long to make the array
+    * @return an Array representing the data type   
+    */
+   private Object getDataTypeArray( String type, int length ) {
+      if ( type == null )
+         return Array.newInstance( Double.TYPE, length );
+      if ( type.equals( "int" ) ) {
+         return Array.newInstance( Integer.TYPE, length );
+      }
+      else if ( type.equals( "long" ) ) {
+         return Array.newInstance( Long.TYPE, length );
+      }
+      else if ( type.equals( "float" ) ) {
+         return Array.newInstance( Float.TYPE, length );
+      }
+      else {
+         return Array.newInstance( Double.TYPE, length );
+      }
+   }
+
+   /**
+    * @returns the given operands as an array of the given type.   
+    */
+   private Object[] getParams( Class typeClass, String[] operands ) {
+      int paramCount = operands.length;
+      Object[] params = new Object[ paramCount ];
+      if ( typeClass == Double.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Double( operands[ i ] );
+         }
+      }
+      else if ( typeClass == Long.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Long( operands[ i ] );
+         }
+      }
+      else if ( typeClass == Float.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Float( operands[ i ] );
+         }
+      }
+      else {
+         // Integer.TYPE is only other choice
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Integer( operands[ i ] );
+         }
+      }
+      if ( paramCount > 2 )
+         params = new Object[] {params};
+      return params;
+   }
+
+   /**
+    * Converts the given operands into an array of the given type.   
+    */
+   private Object[] getParamsArray( Class typeClass, String[] operands ) {
+      int paramCount = operands.length;
+      if ( typeClass == Double.TYPE ) {
+         double[] array = ( double[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setDouble( array, i, new Double( operands[ i ] ).doubleValue() );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == Long.TYPE ) {
+         long[] array = ( long[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setLong( array, i, new Long( operands[ i ] ).longValue() );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == Float.TYPE ) {
+         float[] array = ( float[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setFloat( array, i, new Float( operands[ i ] ).floatValue() );
+         }
+         return new Object[] {array};
+      }
+      else {
+         // Integer.TYPE is only other choice
+         Object array = Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setInt( array, i, new Integer( operands[ i ] ).intValue() );
+         }
+         return new Object[] {array};
+      }
+   }
+
+   public static void main ( String[] args ) {
+      Math math = new Math();
+      System.out.println( math.calculate( "add", new String[] {"6", "5", "4"} ) );
+   }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/MathTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/MathTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/MathTask.java	(revision 15023)
@@ -0,0 +1,194 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import java.util.Vector;
+import java.util.Enumeration;
+
+import ise.antelope.tasks.util.math.*;
+
+/**
+ * Provides basic math functions. Simple calculations can be done via attributes
+ * only, more complex formulas can be set up via nested Ops.
+ * @author Dale Anson, danson@germane-software.com
+ */
+public class MathTask extends Task {
+
+   // storage for result
+   private String result = null;
+
+   // storage for operation -- only one allowed
+   private Op op = null;
+
+   // storage for operation passed as attribute
+   private String operation = null;
+
+   // storage for an operand passed as an attribute
+   private String operand1 = null;
+
+   // storage for an operand passed as an attribute
+   private String operand2 = null;
+
+   // datatype for the result
+   private String datatype = null;
+
+   // should the StrictMath library be used?
+   private boolean strict = false;
+
+   /**
+    * Sets the name of the property to store the result in. This is stored 
+    * in a user property, so is reusable.
+    * @param name the name of a property to set for a result.   
+    */
+   public void setResult( String name ) {
+      result = name;
+   }
+
+   /**
+    * Sets the datatype of this calculation. Allowed values are
+    * "int", "long", "float", or "double". Optional, if
+    * used, will be applied to all numbers in this math operation.
+    */
+   public void setDatatype( String type ) {
+      if ( type.equals( "int" ) )
+         datatype = "int";
+      else if ( type.equals( "long" ) )
+         datatype = "long";
+      else if ( type.equals( "float" ) )
+         datatype = "float";
+      else if ( type.equals( "double" ) )
+         datatype = "double";
+      else
+         throw new BuildException( "Invalid datatype: " + type +
+               ". Must be one of int, long, float, or double." );
+   }
+
+   /**
+    * Set an operand as an attribute. This is for convenience, if used,
+    * it overrides any nested Ops. Must parse to a number. 
+    */
+   public void setOperand1( String op ) throws BuildException {
+      operand1 = op;
+   }
+
+   /**
+    * Set an operand as an attribute. This is for convenience, if used,
+    * it overrides any nested Ops. Must parse to a number. 
+    */
+   public void setOperand2( String op ) throws BuildException {
+      operand2 = op;
+   }
+
+   /**
+    * Set an operation as an attribute. This is for convenience, if used, it
+    * overrides any nested Ops. 
+    * @param op any operation allowed by Op.   
+    */
+   public void setOperation( String op ) {
+      operation = op;
+   }
+
+   /**
+    * Add a nested operation. Only one operation is allowed at a time.
+    * @param op the operation to add.
+    */
+   public void addConfiguredOp( Op op ) {
+      if ( this.op != null )
+         throw new BuildException( "Only one operation allowed at a time!" );
+      if ( datatype != null )
+         op.setDatatype( datatype );
+      this.op = op;
+   }
+
+   /**
+    * Use the StrictMath library.   
+    */
+   public void setStrict( boolean b ) {
+      strict = b;
+   }
+
+   public void execute() {
+      if ( result == null )
+         throw new BuildException( "Property name for result is null." );
+      if ( datatype == null )
+         datatype = "double";
+      if ( operation != null ) {
+         // operation as attribute overrides nested Op
+         op = new Op();
+         if ( datatype == null )
+            datatype = "double";
+         op.setDatatype( datatype );
+         op.setOp( operation );
+         if ( operand1 != null ) {
+            Num num = new Num();
+            num.setValue( operand1 );
+            op.addConfiguredNum( num );
+         }
+         if ( operand2 != null ) {
+            Num num = new Num();
+            num.setValue( operand2 );
+            op.addConfiguredNum( num );
+         }
+      }
+      if ( op == null )
+         throw new BuildException( "Nothing to do!" );
+      op.setDatatype( datatype );
+      op.setStrict( strict );
+      Num num = op.calculate();
+      getProject().setUserProperty( result, num.getValue().toString() );
+   }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/NetworkUtilTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/NetworkUtilTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/NetworkUtilTask.java	(revision 15023)
@@ -0,0 +1,61 @@
+package ise.antelope.tasks;
+
+import ise.antelope.tasks.typedefs.net.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * A task to answer a bunch of questions about network interfaces.
+ *
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class NetworkUtilTask extends Task {
+
+
+    private String property = null;
+    private boolean failOnError = false;
+    
+    private Vector ops = new Vector();
+
+    /**
+     * @param name  where to put the answer
+     */
+    public void setProperty(String name) {
+        property = name;
+    }
+
+    public void addNetop(NetOp op) {
+        ops.add(op);
+    }
+
+	/**
+	 * hostname    
+	 */
+    public void addHostname(Hostname op) {
+        ops.add(op);   
+    }
+
+    /** While multiple ops could be added, only the first one is executed. */
+    public void execute() {
+        if (ops.size() == 0)
+            return;
+        NetOp op = (NetOp)ops.get(0);
+        String value = op.execute();
+        if (property != null) {
+            Unset unset = new Unset();
+            unset.setProject(getProject());
+            unset.setName(property);
+            unset.execute();
+            getProject().setProperty(property, value);
+        }
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/New.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/New.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/New.java	(revision 15023)
@@ -0,0 +1,170 @@
+
+/*
+* Copyright (c) 2001-2004 Ant-Contrib project.  All rights reserved.
+*
+* Licensed 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.
+*/
+package ise.antelope.tasks;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import ise.library.PrivilegedAccessor;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * @author    Dale Anson
+ * @version   $Revision: 1.6 $
+ * @since     Ant 1.6
+ */
+public class New extends Task implements TaskContainer {
+
+    // storage for nested tasks
+    private Vector tasks = new Vector();
+
+    // should the build fail if any subtasks fail? Default is no.
+    private boolean failOnError = false;
+
+
+    /**
+     * Add a task.
+     *
+     * @param task                A task to execute
+     * @exception BuildException  won't happen
+     */
+    public void addTask(Task task) throws BuildException {
+        if (task != null) {
+            tasks.addElement(task);
+        }
+    }
+
+
+    /**
+     * Determines whether the build should fail if the time limit has expired on
+     * this task. Default is no.
+     *
+     * @param fail  if true, fail the build if the time limit has been reached.
+     */
+    public void setFailonerror(boolean fail) {
+        failOnError = fail;
+    }
+
+
+    /**
+     * Execute all nested tasks, using a newly configured task each time.
+     *
+     * @exception BuildException  only if failOnError is true
+     */
+    public void execute() throws BuildException {
+        log("+++ CAUTION: <new> is experimental and does not work in all situations.");
+        try {
+            for (int i = 0; i < tasks.size(); i++) {
+                Task currentTask = (Task)tasks.get(i);
+                Task replacementTask = getReplacement(currentTask);
+                if (replacementTask == null)
+                    replacementTask = currentTask;
+                try {
+                    replacementTask.perform();
+                }
+                catch (Exception ex) {
+                    if (failOnError)
+                        throw ex;
+                    else {
+                        log(ex.getMessage());
+                        ex.printStackTrace();
+                    }
+                }
+            }
+        }
+        catch (Exception e) {
+            if (failOnError) {
+                throw new BuildException(e.getMessage());
+            }
+            else {
+                log(e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    /**
+     * Creates a new task from the given task.
+     *
+     * @param ue
+     * @return    a new copy of the task
+     */
+    private Task getReplacement(Task task) {
+        try {
+            String taskname = task.getTaskName();
+            //if (taskname.indexOf(":") > -1)
+            //    taskname = taskname.substring(taskname.indexOf(":") + 1);
+            UnknownElement replacement = new UnknownElement(taskname);
+            replacement.setProject(getProject());
+            replacement.setTaskType(task.getTaskType());
+            replacement.setTaskName(taskname);
+            replacement.setLocation(task.getLocation());
+            replacement.setOwningTarget(getOwningTarget());
+            RuntimeConfigurable wrapper = (RuntimeConfigurable)PrivilegedAccessor.invokeMethod(task, "getWrapper", new Object[]{});
+            replacement.setRuntimeConfigurableWrapper(wrapper);
+            wrapper.setProxy(replacement);
+            replaceChildren(wrapper, replacement);
+            try {
+                replacement.maybeConfigure();
+            }
+            catch (Exception e) {
+                //e.printStackTrace();
+            }
+            if (replacement.getTask() != null) {
+                Target target = (Target) PrivilegedAccessor.getValue(task, "target");
+                PrivilegedAccessor.invokeMethod(target, "replaceChild", new Object[]{task, replacement.getTask()});
+            }
+            return replacement.getTask();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Recursively adds an UnknownElement instance for each child element of
+     * replacement.
+     *
+     * @param wrapper
+     * @param parentElement
+     * @since                Ant 1.5.1
+     */
+    private void replaceChildren(RuntimeConfigurable wrapper, UnknownElement parentElement) {
+        Enumeration e = wrapper.getChildren();
+        while (e.hasMoreElements()) {
+            RuntimeConfigurable childWrapper =
+                    (RuntimeConfigurable) e.nextElement();
+            UnknownElement childElement =
+                    new UnknownElement(childWrapper.getElementTag());
+            parentElement.addChild(childElement);
+            childElement.setProject(getProject());
+            childElement.setRuntimeConfigurableWrapper(childWrapper);
+            childWrapper.setProxy(childElement);
+            replaceChildren(childWrapper, childElement);
+        }
+    }
+
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Num.java_
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Num.java_	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Num.java_	(revision 15023)
@@ -0,0 +1,123 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Represents a number. 
+ * @author Dale Anson, danson@germane-software.com  
+ */
+public class Num {
+
+   // the value of this number
+   private String value = null;
+
+   private String datatype = null;
+
+   /**
+    * Set the value for this number. This string must parse to the set
+    * datatype, for example, setting value to "7.992" and datatype to INT
+    * will cause a number format exception to be thrown. Supports two special
+    * numbers, "E" and "PI".
+    * @param value the value for this number   
+    */
+   public void setValue( String value ) {
+      if (value.equals("E"))
+         value = String.valueOf(java.lang.Math.E);
+      else if (value.equals("PI"))
+         value = String.valueOf(java.lang.Math.PI);
+      this.value = value;
+   }
+
+   /**
+    * @return the value for this number as a Number. Cast as appropriate to
+    * Integer, Long, Float, or Double.
+    */
+   public Number getValue() {
+      if (datatype == null)
+         datatype = "double";
+      if ( datatype.equals("int") )
+         return new Integer( value );
+      if ( datatype.equals("long" ))
+         return new Long( value );
+      if ( datatype.equals("float" ))
+         return new Float( value );
+      if ( datatype.equals("double" ))
+         return new Double( value );
+      throw new BuildException( "Invalid datatype." );
+   }
+
+   /**
+    * Sets the datatype of this number. Allowed values are
+    * "int", "long", "float", or "double".    
+    */
+   public void setDatatype( String p ) {
+      datatype = p;
+   }
+
+   /**
+    * @return the datatype as one of the defined types.   
+    */
+   public String getDatatype() {
+      if (datatype == null)
+         datatype = "double";
+      return datatype;
+   }
+   
+   public String toString() {
+      return getValue().toString();  
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Op.java_
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Op.java_	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Op.java_	(revision 15023)
@@ -0,0 +1,178 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import org.apache.tools.ant.BuildException;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ * Represents a mathematical operation.
+ * @author Dale Anson, danson@germane-software.com   
+ */
+public class Op {
+   // datatype for the result of this operation
+   private String datatype = null;
+
+   // storage for the numbers to execute the operation on
+   Vector nums = new Vector();
+
+   // storage for nested Ops
+   Vector ops = new Vector();
+
+   // storage for operation
+   String operation = null;
+
+   // should the StrictMath library be used?
+   private boolean _strict = false;
+   
+  /**
+    * Set the operation.
+    */
+   public void setOp( String op ) {
+      if (op.equals("+"))
+         operation = "add";
+      else if (op.equals("-"))
+         operation = "subtract";
+      else if (op.equals("*"))
+         operation = "multiply";
+      else if (op.equals("/"))
+         operation = "divide";
+      else if (op.equals("%"))
+         operation = "mod";
+      else 
+         operation = op;
+   }
+
+   /**
+    * Add a number to this operation. An operation can hold any number of
+    * numbers to support formulas like 5 + 4 + 3 + 2 + 1.
+    * @param num a number to use in this operation   
+    */
+   public void addNum( Num num ) {
+      nums.addElement( num );
+   }
+
+   /**
+    * Sets the datatype of this calculation. Allowed values are
+    * "int", "long", "float", or "double".    
+    */
+   public void setDatatype( String p ) {
+      if ( p.equals( "int" ) ||
+              p.equals( "long" ) ||
+              p.equals( "float" ) ||
+              p.equals( "double" ) )
+         datatype = p;
+      else
+         throw new BuildException( "Invalid datatype: " + p +
+               ". Must be one of int, long, float, or double." );
+   }
+
+   /**
+    * Add a nested operation.
+    * @param the operation to add.
+    */
+   public void addConfiguredOp( Op op ) {
+      if ( datatype != null )
+         op.setDatatype( datatype );
+      ops.addElement( op );
+   }
+   
+   /**
+    * Use the StrictMath library.   
+    */
+   public void setStrict( boolean b ) {
+      _strict = b;
+   }
+
+   /**
+    * Perform this operation.
+    * @return the value resulting from the calculation as a Num.   
+    */
+   public Num calculate() {
+      if ( operation == null )
+         throw new BuildException( "Operation not specified." );
+
+      // calculate nested Ops
+      Enumeration en = ops.elements();
+      while ( en.hasMoreElements() ) {
+         Op op = ( Op ) en.nextElement();
+         if ( datatype != null )
+            op.setDatatype( datatype );
+         nums.addElement( op.calculate() );
+      }
+
+      // make an array of operands
+      String[] operands = new String[ nums.size() ];
+      en = nums.elements();
+      int i = 0;
+      while ( en.hasMoreElements() ) {
+         Num num = (Num)en.nextElement();
+         if (datatype != null)
+            num.setDatatype(datatype);
+         operands[ i++ ] = num.toString();
+      }
+
+      Math math = new Math(_strict);
+
+      Number number = math.calculate( operation, datatype, operands );
+      Num num = new Num();
+      num.setValue(number.toString());
+      num.setDatatype(datatype);
+      return num;
+
+   }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PasswordHandlerTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PasswordHandlerTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PasswordHandlerTask.java	(revision 15023)
@@ -0,0 +1,90 @@
+package ise.antelope.tasks;
+
+import java.util.regex.*;
+
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+import ise.antelope.tasks.password.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.3 $
+ */
+public class PasswordHandlerTask extends Task {
+
+    private String in = null;
+    private String out = null;
+    private String mode = null;
+    private String seed = null;
+
+    /**
+     * Sets the name of a property containing the password to encrypt or decrypt.
+     *
+     * @param string  The new in value
+     */
+    public void setIn(String string) {
+        in = string;
+    }
+
+    /**
+     * Sets the name of a property to receive the encrypted or decrypted password.
+     *
+     * @param string out the property name
+     */
+    public void setOut(String string) {
+        out = string;
+    }
+
+    /**
+     * One of "encrypt" or "decrypt", if not explicitly set, assumes "decrypt".
+     *
+     * @param mode  one of "encrypt" or "decrypt".
+     */
+    public void setMode(String mode) {
+        if (mode == null || (!mode.equals("encrypt") && !mode.equals("decrypt")))
+            throw new BuildException("Invalid mode, must be either 'encrypt' or 'decrypt'");
+        this.mode = mode;
+    }
+    
+    public void setSeed(String seed) {
+        this.seed = seed;   
+    }
+    
+
+    /** Description of the Method */
+    public void execute() {
+        if (in == null)
+            throw new BuildException("'in' is required");
+        if (out == null)
+            throw new BuildException("'out' is required");
+        if (mode == null)
+            mode = "decrypt";
+
+        try {
+            PasswordHandler ph = null;
+            if (seed != null)
+                ph = new PasswordHandler(seed);
+            else
+                ph = new PasswordHandler();
+            
+            String answer = "";
+            if (mode.equals("encrypt")) {
+                answer = ph.encrypt(in);
+            }
+            else if (mode.equals("decrypt")) {
+                answer = ph.decrypt(in);
+            }
+            else {
+                throw new BuildException("Invalid mode, must be either 'encrypt' or 'decrypt'");
+            }
+            getProject().setUserProperty(out, answer);
+        }
+        catch(Exception e) {
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PostTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PostTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/PostTask.java	(revision 15023)
@@ -0,0 +1,841 @@
+/*
+*  The Apache Software License, Version 1.1
+*
+*  Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+*  reserved.
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*  notice, this list of conditions and the following disclaimer.
+*
+*  2. Redistributions in binary form must reprodconnectione the above copyright
+*  notice, this list of conditions and the following disclaimer in
+*  the documentation and/or other materials provided with the
+*  distribution.
+*
+*  3. The end-user documentation included with the redistribution, if
+*  any, must include the following acknowlegement:
+*  "This prodconnectiont includes software developed by the
+*  Apache Software Foundation (http://www.apache.org/)."
+*  Alternately, this acknowlegement may appear in the software itself,
+*  if and wherever sconnectionh third-party acknowlegements normally appear.
+*
+*  4. The names "The Jakarta Project", "Ant", and "Apache Software
+*  Foundation" must not be used to endorse or promote prodconnectionts derived
+*  from this software without prior written permission. For written
+*  permission, please contact apache@apache.org.
+*
+*  5. Prodconnectionts derived from this software may not be called "Apache"
+*  nor may "Apache" appear in their names without prior written
+*  permission of the Apache Group.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+*  SUCH DAMAGE.
+*  ====================================================================
+*
+*  This software consists of voluntary contributions made by many
+*  individuals on behalf of the Apache Software Foundation.  For more
+*  information on the Apache Software Foundation, please see
+*  <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.HttpURLConnection;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+
+import java.rmi.server.UID;
+
+import java.util.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+
+import ise.antelope.tasks.typedefs.Prop;
+
+/**
+ * This task does an http post. Name/value pairs for the post can be set in
+ * either or both of two ways, by nested Prop elements and/or by a file
+ * containing properties. Nested Prop elements are automatically configured by
+ * Ant. Properties from a file are configured by code borrowed from Property so
+ * all Ant property constructs (like ${somename}) are resolved prior to the
+ * post. This means that a file can be set up in advance of running the build
+ * and the appropriate property values will be filled in at run time.
+ *
+ * @author    Dale Anson, danson@germane-software.com
+ * @version   $Revision: 1.11 $
+ */
+public class PostTask extends Task {
+
+    /** Storage for name/value pairs to send. */
+    private Hashtable props = new Hashtable();
+    /** URL to send the name/value pairs to. */
+    private URL to = null;
+    /** File to read name/value pairs from. */
+    private File propsFile = null;
+    /** storage for Ant properties */
+    private String textProps = null;
+    /** encoding to use for the name/value pairs */
+    private String encoding = "UTF-8";
+    /** where to store the server response */
+    private File log = null;
+    /** append to the log? */
+    private boolean append = true;
+    /** verbose? */
+    private boolean verbose = true;
+    /** want to keep the server response? */
+    private boolean wantResponse = true;
+    /** store output in this property */
+    private String property = null;
+    /** where to write downloads */
+    private File outdir = null;
+
+    /** how long to wait for a response from the server */
+    private long maxwait = 180000;   // units for maxwait is milliseconds
+    /** fail on error? */
+    private boolean failOnError = false;
+
+    // storage for cookies, static so that cookies are shared between instances
+    // of Post. This allows a <post> to follow a previous <post> and use the
+    // cookies that may have been set in the first post.
+    private static Hashtable cookieStorage = new Hashtable();
+
+    /** connection to the server */
+    private URLConnection connection = null;
+    
+    /** for thread handling */
+    private Thread currentRunner = null;
+
+
+
+    /**
+     * Set the url to post to. Required.
+     *
+     * @param name  the url to post to.
+     */
+    public void setTo( URL name ) {
+        to = name;
+    }
+
+    
+	/**
+	 * Set a directory to store files that may be returned from the post.
+	 * @param dir the directory
+	 */
+    public void setOutdir( File dir) {
+        outdir = dir;
+        if (outdir != null && outdir.isFile()) {
+            outdir = outdir.getParentFile();
+        }
+    }
+
+
+    /**
+     * Set the name of a file to read a set of properties from.
+     *
+     * @param f  the file
+     */
+    public void setFile( File f ) {
+        propsFile = f;
+    }
+
+
+    /**
+     * Set the name of a file to save the response to. Optional. Ignored if
+     * "want response" is false.
+     *
+     * @param f  the file
+     */
+    public void setLogfile( File f ) {
+        log = f;
+    }
+
+    
+    /**
+     * Should the log file be appended to or overwritten? Default is true,
+     * append to the file.
+     *
+     * @param b  append or not
+     */
+    public void setAppend( boolean b ) {
+        append = b;
+    }
+
+
+    /**
+     * If true, progress messages and returned data from the post will be
+     * displayed. Default is true.
+     *
+     * @param b  true = verbose
+     */
+    public void setVerbose( boolean b ) {
+        verbose = b;
+    }
+
+
+    /**
+     * Default is true, get the response from the post. Can be set to false for
+     * "fire and forget" messages.
+     *
+     * @param b  print/log server response
+     */
+    public void setWantresponse( boolean b ) {
+        wantResponse = b;
+    }
+
+    /**
+     * Set the name of a property to save the response to. Optional. Ignored if
+     * "wantResponse" is false.
+     * @param name the name to use for the property
+     */
+    public void setProperty( String name ) {
+        property = name;
+    }
+
+    /**
+     * Sets the encoding of the outgoing properties, default is UTF-8.
+     *
+     * @param encoding  The new encoding value
+     */
+    public void setEncoding( String encoding ) {
+        this.encoding = encoding;
+    }
+
+
+    /**
+     * How long to wait on the remote server. As a post is generally a two part
+     * process (sending and receiving), maxwait is applied separately to each
+     * part, that is, if 180 is passed as the wait parameter, this task will
+     * spend at most 3 minutes to connect to the remote server and at most
+     * another 3 minutes waiting on a response after the post has been sent.
+     * This means that the wait period could total as much as 6 minutes (or 360
+     * seconds). <p>
+     *
+     * The default wait period is 3 minutes (180 seconds).
+     *
+     * @param wait  time to wait in seconds, set to 0 to wait forever.
+     */
+    public void setMaxwait( int wait ) {
+        maxwait = wait * 1000;
+    }
+
+
+    /**
+     * Should the build fail if the post fails?
+     *
+     * @param fail  true = fail the build, default is false
+     */
+    public void setFailonerror( boolean fail ) {
+        failOnError = fail;
+    }
+
+    /**
+     * Adds a name/value pair to post. Optional.
+     *
+     * @param p                   A property pair to send as part of the post.
+     * @exception BuildException  When name and/or value are missing.
+     */
+    public void addConfiguredProp( Prop p ) throws BuildException {
+        String name = p.getName();
+        if ( name == null ) {
+            throw new BuildException( "name is null", getLocation() );
+        }
+        String value = p.getValue();
+        if ( value == null ) {
+            value = getProject().getProperty( name );
+        }
+        if ( value == null ) {
+            throw new BuildException( "value is null", getLocation() );
+        }
+        props.put( name, value );
+    }
+
+
+    /**
+     * Adds a feature to the Text attribute of the PostTask object
+     *
+     * @param text  The feature to be added to the Text attribute
+     */
+    public void addText( String text ) {
+        textProps = text;
+    }
+
+
+    /**
+     * Do the post.
+     *
+     * @exception BuildException  On any error.
+     */
+    public void execute() throws BuildException {
+        if ( to == null ) {
+            throw new BuildException( "'to' attribute is required", getLocation() );
+        }
+        final String content = getContent();
+        try {
+            if ( verbose )
+                log( "Opening connection for post to " + to.toString() + "..." );
+
+            // do the POST
+            Thread runner =
+                new Thread() {
+                    public void run() {
+                        DataOutputStream out = null;
+                        try {
+                            // set the url connection properties
+                            connection = to.openConnection();
+                            connection.setDoInput( true );
+                            connection.setDoOutput( true );
+                            connection.setUseCaches( false );
+                            connection.setRequestProperty(
+                                "Content-Type",
+                                "application/x-www-form-urlencoded" );
+
+                            // check if there are cookies to be included
+                            for ( Iterator it = cookieStorage.keySet().iterator(); it.hasNext(); ) {
+                                StringBuffer sb = new StringBuffer();
+                                Object name = it.next();
+                                if ( name != null ) {
+                                    String key = name.toString();
+                                    Cookie cookie = ( Cookie ) cookieStorage.get( name );
+                                    if ( to.getPath().startsWith( cookie.getPath() ) ) {
+                                        connection.addRequestProperty( "Cookie", cookie.toString() );
+                                        if (verbose)
+                                            log("Added cookie: " + cookie.toString());
+                                    }
+                                }
+                            }
+
+                            // do the post
+                            if ( verbose ) {
+                                log( "Connected, sending data..." );
+                            }
+                            out = new DataOutputStream( connection.getOutputStream() );
+                            if ( verbose ) {
+                                log( content );
+                            }
+                            out.writeBytes( content );
+                            out.flush();
+                            if ( verbose ) {
+                                log( "Data sent." );
+                            }
+                        }
+                        catch ( Exception e ) {
+                            if ( failOnError ) {
+                                throw new BuildException( e, getLocation() );
+                            }
+                        }
+                        finally {
+                            try {
+                                out.close();
+                            }
+                            catch ( Exception e ) {
+                                // ignored
+                            }
+                        }
+                    }
+                }
+                ;
+            runner.start();
+            runner.join( maxwait );
+            if ( runner.isAlive() ) {
+                runner.interrupt();
+                if ( failOnError ) {
+                    throw new BuildException( "maxwait exceeded, unable to send data", getLocation() );
+                }
+                return ;
+            }
+
+            // read the response, if any, optionally writing it to a file
+            if ( wantResponse ) {
+                if ( verbose ) {
+                    log( "Waiting for response..." );
+                }
+                runner =
+                    new Thread() {
+                        public void run() {
+                            PrintWriter fw = null;
+                            StringWriter sw = null;
+                            PrintWriter pw = null;
+                            FileOutputStream dw = null;
+                            BufferedInputStream in = null;
+                            byte[] buffer = new byte[8192];
+                            File downloadFile = null;
+                            try {
+                                if ( connection instanceof HttpURLConnection ) {
+                                    // read and store cookies
+                                    Map map = ( ( HttpURLConnection ) connection ).getHeaderFields();
+                                    for ( Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+                                        String name = ( String ) it.next();
+                                        if ( name != null && name.equals( "Set-Cookie" ) ) {
+                                            List cookies = ( List ) map.get( name );
+                                            for ( Iterator c = cookies.iterator(); c.hasNext(); ) {
+                                                String raw = ( String ) c.next();
+                                                Cookie cookie = new Cookie( raw );
+                                                cookieStorage.put( cookie.getId(), cookie );
+                                            }
+                                        }
+                                    }
+
+                                    // maybe log response headers
+                                    if ( verbose ) {
+                                        log( String.valueOf( ( ( HttpURLConnection ) connection ).getResponseCode() ) );
+                                        log( ( ( HttpURLConnection ) connection ).getResponseMessage() );
+                                        map = ( ( HttpURLConnection ) connection ).getHeaderFields();
+                                        StringBuffer sb = new StringBuffer();
+                                        for ( Iterator it = map.keySet().iterator(); it.hasNext(); ) {
+                                            String name = ( String ) it.next();
+                                            sb.append( name ).append( "=" );
+                                            List values = ( List ) map.get( name );
+                                            if ( values != null ) {
+                                                if ( values.size() == 1 )
+                                                    sb.append( values.get( 0 ) );
+                                                else if ( values.size() > 1 ) {
+                                                    sb.append( "[" );
+                                                    for ( Iterator v = values.iterator(); v.hasNext(); ) {
+                                                        sb.append( v.next() ).append( "," );
+                                                    }
+                                                    sb.append( "]" );
+                                                }
+                                            }
+                                            sb.append( "\n" );
+                                            log( sb.toString() );
+                                        }
+                                    }
+                                    
+                                    // might have a download
+                                    map = ( ( HttpURLConnection ) connection ).getHeaderFields();
+                                    List values = (List)map.get("Content-Type");
+                                    String content_type = null;
+                                    if (values != null)
+                                        content_type = (String)values.get(0);
+                                    if (content_type != null && content_type.equals("application/download")) {
+                                        if (outdir == null) {
+                                            outdir = new File(getProject().getProperty("basedir"));   
+                                        }
+                                        String cd = (String)(((List)map.get("Content-Disposition")).get(0));
+                                        int index = cd.indexOf("filename=");
+                                        if (index >= 0) {
+                                            String filename = cd.substring(index + "filename=".length());
+                                            filename = filename.replaceAll("\"", "");
+                                            downloadFile = new File(outdir, filename);
+                                        }
+                                    }
+                                }
+                                in = new BufferedInputStream( connection.getInputStream() );
+                                if ( log != null ) {
+                                    // user wants output stored to a file
+                                    fw = new PrintWriter( new FileWriter( log, append ) );
+                                }
+                                if ( property != null ) {
+                                    // user wants output stored in a property
+                                    sw = new StringWriter();
+                                    pw = new PrintWriter( sw );
+                                }
+                                if (downloadFile != null) {
+                                    dw = new FileOutputStream( downloadFile );
+                                }
+                                int byte_count = in.read(buffer, 0, buffer.length);
+                                while ( byte_count > -1 ) {
+                                    String line = new String( buffer, 0, byte_count );
+                                    if ( currentRunner != this ) {
+                                        break;
+                                    }
+                                    if ( verbose ) {
+                                        log( line );
+                                    }
+                                    if ( fw != null ) {
+                                        // write response to a file
+                                        fw.print( line );
+                                    }
+                                    if ( pw != null ) {
+                                        // write response to a property
+                                        pw.print( line );
+                                    }
+                                    if (dw != null) {
+                                        dw.write( buffer, 0, byte_count );   
+                                    }
+                                    byte_count = in.read(buffer, 0, buffer.length);
+                                }
+                            }
+                            catch ( Exception e ) {
+                                e.printStackTrace();
+                                if ( failOnError ) {
+                                    throw new BuildException( e, getLocation() );
+                                }
+                            }
+                            finally {
+                                try {
+                                    in.close();
+                                }
+                                catch ( Exception e ) {
+                                    // ignored
+                                }
+                                try {
+                                    if ( fw != null ) {
+                                        fw.flush();
+                                        fw.close();
+                                    }
+                                }
+                                catch ( Exception e ) {
+                                    // ignored
+                                }
+                            }
+                            if ( property != null && sw != null ) {
+                                // save property
+                                getProject().setProperty( property, sw.toString() );
+                            }
+                        }
+                    };
+                currentRunner = runner;
+                runner.start();
+                runner.join( maxwait );
+                if ( runner.isAlive() ) {
+                    currentRunner = null;
+                    runner.interrupt();
+                    if ( failOnError ) {
+                        throw new BuildException( "maxwait exceeded, unable to receive data", getLocation() );
+                    }
+                }
+            }
+            if ( verbose )
+                log( "Post complete." );
+        }
+        catch ( Exception e ) {
+            if ( failOnError ) {
+                throw new BuildException( e );
+            }
+        }
+    }
+
+
+    /**
+     * Borrowed from Property -- load variables from a file
+     *
+     * @param file                file to load
+     * @exception BuildException  Description of the Exception
+     */
+    private void loadFile( File file ) throws BuildException {
+        Properties fileprops = new Properties();
+        try {
+            if ( file.exists() ) {
+                FileInputStream fis = new FileInputStream( file );
+                try {
+                    fileprops.load( fis );
+                }
+                finally {
+                    if ( fis != null ) {
+                        fis.close();
+                    }
+                }
+                addProperties( fileprops );
+            }
+            else {
+                log( "Unable to find property file: " + file.getAbsolutePath(),
+                     Project.MSG_VERBOSE );
+            }
+            log( "Post complete." );
+        }
+        catch ( Exception e ) {
+            if ( failOnError ) {
+                throw new BuildException( e );
+            }
+        }
+    }
+
+
+    /**
+     * Builds and formats the message to send to the server. Message is UTF-8
+     * encoded unless encoding has been explicitly set.
+     *
+     * @return   the message to send to the server.
+     */
+    private String getContent() {
+        if ( propsFile != null ) {
+            loadFile( propsFile );
+        }
+
+        if ( textProps != null ) {
+            loadTextProps( textProps );
+        }
+
+        StringBuffer content = new StringBuffer();
+        try {
+            Enumeration en = props.keys();
+            while ( en.hasMoreElements() ) {
+                String name = ( String ) en.nextElement();
+                String value = ( String ) props.get( name );
+                content.append( URLEncoder.encode( name, encoding ) );
+                content.append( "=" );
+                content.append( URLEncoder.encode( value, encoding ) );
+                if ( en.hasMoreElements() ) {
+                    content.append( "&" );
+                }
+            }
+        }
+        catch ( IOException ex ) {
+            if ( failOnError ) {
+                throw new BuildException( ex, getLocation() );
+            }
+        }
+        return content.toString();
+    }
+
+
+    /**
+     * Description of the Method
+     *
+     * @param tp
+     */
+    private void loadTextProps( String tp ) {
+        Properties p = new Properties();
+        Project project = getProject();
+        StringTokenizer st = new StringTokenizer( tp, "$" );
+        while ( st.hasMoreTokens() ) {
+            String token = st.nextToken();
+            int start = token.indexOf( "{" );
+            int end = token.indexOf( "}" );
+            if ( start > -1 && end > -1 && end > start ) {
+                String name = token.substring( start + 1, end - start );
+                String value = project.getProperty( name );
+                if ( value != null )
+                    p.setProperty( name, value );
+            }
+        }
+        addProperties( p );
+    }
+
+
+    /**
+     * Borrowed from Property -- iterate through a set of properties, resolve
+     * them, then assign them
+     *
+     * @param fileprops  The feature to be added to the Properties attribute
+     */
+    private void addProperties( Properties fileprops ) {
+        resolveAllProperties( fileprops );
+        Enumeration e = fileprops.keys();
+        while ( e.hasMoreElements() ) {
+            String name = ( String ) e.nextElement();
+            String value = fileprops.getProperty( name );
+            props.put( name, value );
+        }
+    }
+
+
+    /**
+     * Borrowed from Property -- resolve properties inside a properties
+     * hashtable
+     *
+     * @param fileprops           Description of the Parameter
+     * @exception BuildException  Description of the Exception
+     */
+    private void resolveAllProperties( Properties fileprops ) throws BuildException {
+        for ( Enumeration e = fileprops.keys(); e.hasMoreElements(); ) {
+            String name = ( String ) e.nextElement();
+            String value = fileprops.getProperty( name );
+
+            boolean resolved = false;
+            while ( !resolved ) {
+                Vector fragments = new Vector();
+                Vector propertyRefs = new Vector();
+                /// this is the Ant 1.5 way of doing it. The Ant 1.6 PropertyHelper
+                /// should be used -- eventually.
+                ProjectHelper.parsePropertyString( value, fragments,
+                        propertyRefs );
+
+                resolved = true;
+                if ( propertyRefs.size() != 0 ) {
+                    StringBuffer sb = new StringBuffer();
+                    Enumeration i = fragments.elements();
+                    Enumeration j = propertyRefs.elements();
+                    while ( i.hasMoreElements() ) {
+                        String fragment = ( String ) i.nextElement();
+                        if ( fragment == null ) {
+                            String propertyName = ( String ) j.nextElement();
+                            if ( propertyName.equals( name ) ) {
+                                throw new BuildException( "Property " + name
+                                        + " was circularly "
+                                        + "defined." );
+                            }
+                            fragment = getProject().getProperty( propertyName );
+                            if ( fragment == null ) {
+                                if ( fileprops.containsKey( propertyName ) ) {
+                                    fragment = fileprops.getProperty( propertyName );
+                                    resolved = false;
+                                }
+                                else {
+                                    fragment = "${" + propertyName + "}";
+                                }
+                            }
+                        }
+                        sb.append( fragment );
+                    }
+                    value = sb.toString();
+                    fileprops.put( name, value );
+                }
+            }
+        }
+    }
+
+    /**
+     * Represents a cookie.  See RFC 2109 and 2965.
+     */
+    public class Cookie {
+        private String name;
+        private String value;
+        private String domain;
+        private String path = "/";
+        private String id;
+
+        /**
+         * @param raw the raw string abstracted from the header of an http response
+         * for a single cookie.
+         */
+        public Cookie( String raw ) {
+            String[] args = raw.split( "[;]" );
+            for ( int i = 0; i < args.length; i++ ) {
+                String part = args[ i ];
+                int eq_index = part.indexOf("=");
+                if (eq_index == -1)
+                    continue;
+                String first_part = part.substring(0, eq_index).trim();
+                String second_part = part.substring(eq_index + 1);
+                if ( i == 0 ) {
+                    name = first_part;
+                    value = second_part;
+                }
+                else if ( first_part.equalsIgnoreCase( "Path" ) )
+                    path = second_part;
+                else if ( first_part.equalsIgnoreCase( "Domain" ) )
+                    domain = second_part;
+            }
+            if (name == null)
+                throw new IllegalArgumentException("Raw cookie does not contain a cookie name.");
+            if (path == null)
+                path = "/";
+            setId(path, name);
+        }
+
+        /**
+         * @param name name of the cookie
+         * @param value the value of the cookie
+         */
+        public Cookie( String name, String value ) {
+            if (name == null)
+                throw new IllegalArgumentException("Cookie name may not be null.");
+            
+            this.name = name;
+            this.value = value;
+            setId(name);
+        }
+
+        /**
+         * @return the id of the cookie, used internally by Post to store the cookie
+         * in a hashtable.
+         */
+        public String getId() {
+            if (id == null)
+                setId(path, name);
+            return id.toString();
+        }
+        
+        private void setId(String name) {
+            setId(path, name);    
+        }
+        
+        private void setId(String path, String name) {
+            if (name == null)
+                name = "";
+            id = path + name;   
+        }
+
+        /**
+         * @return the name of the cookie        
+         */
+        public String getName() {
+            return name;
+        }
+
+        /**
+         * @return the value of the cookie
+         */
+        public String getValue() {
+            return value;
+        }
+
+        /**
+         * @param domain the domain of the cookie        
+         */
+        public void setDomain( String domain ) {
+            this.domain = domain;
+        }
+
+        /**
+         * @return the domain of the cookie        
+         */
+        public String getDomain() {
+            return domain;
+        }
+
+        /**
+         * @param path the path of the cookie        
+         */
+        public void setPath( String path ) {
+            this.path = path;
+        }
+
+        /**
+         * @return the path of the cookie        
+         */
+        public String getPath() {
+            return path;
+        }
+
+        /**
+         * @return a Cookie formatted as a Cookie Version 1 string.  The returned
+         * string is suitable for including with an http request.
+         */
+        public String toString() {
+            StringBuffer sb = new StringBuffer();
+            sb.append( name ).append( "=" ).append( value ).append( ";" );
+            if ( domain != null )
+                sb.append( "Domain=" ).append( domain ).append( ";" );
+            if ( path != null )
+                sb.append( "Path=" ).append( path ).append( ";" );
+            sb.append( "Version=\"1\";" );
+            return sb.toString();
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ReadLog.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ReadLog.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/ReadLog.java	(revision 15023)
@@ -0,0 +1,124 @@
+package ise.antelope.tasks;
+
+import java.net.URL;
+import java.text.*;
+import java.util.*;
+import java.util.regex.*;
+
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * Not an antelope task, this is for Cobalt, but put it in the same package
+ * for easier use.
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class ReadLog extends Task {
+
+    private URL logURL = null;
+    private String property = null;
+    private int minutes = 2;
+    
+    public void setUrl(URL url) {
+        logURL = url;   
+    }
+    
+    /**
+     * Where to put the log contents.
+     *
+     * @param name  The new property value
+     */
+    public void setProperty(String name) {
+        property = name;
+    }
+
+    /**
+     * Set the number of minutes to read, so, for example, 2 would read the most
+     * recent 2 minutes from the log.
+     *
+     * @param m the number of minutes.  Use -1 to read the complete log.  
+     * Default setting is to read 2 minutes.
+     */
+    public void setMinutes(int m) {
+        minutes = m;
+    }
+
+
+    public void execute() {
+        // check attributes
+        if (property == null)
+            throw new BuildException("Property is null.");
+        if (logURL == null)
+            throw new BuildException("URL is null.");
+        if (minutes < -1)
+            minutes = -1;
+        
+        try {
+            // fetch the log
+            PostTask post = new PostTask();
+            post.setProject(getProject());
+            post.setTo(logURL);
+            Date now = new Date();
+            String temp_property = property + now.getTime(); 
+            post.setProperty(temp_property);
+            post.setVerbose(false);
+            post.execute();
+            String log = getProject().getProperty(temp_property);
+    
+            if (minutes == -1) {
+                // save the complete log
+                getProject().setProperty(property, log);
+            }
+            else {
+                // calculate how much of log to save into property
+                long end_time = now.getTime() - (minutes * 1000 * 60);
+                
+                // split up the log to parse the dates
+                String[] msgs = log.split("<hr>");
+                
+                int i = 1;
+                for (; i < msgs.length; i++) {
+                    Grep grep = new Grep();
+                    grep.setIn(msgs[i]);
+                    grep.setRegex("(.*?[:].*?[:].*?)[:].*?");
+                    grep.setGroup(1);
+                    String start = grep.grep();
+                    if (start == null) {
+                        continue;
+                    }
+                    SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z");
+                    try {
+                        Date start_date = sdf.parse(start);
+                        if (start_date.getTime() < end_time)
+                            break;
+                    }
+                    catch(Exception e) {
+                        e.printStackTrace();
+                        continue;
+                    }
+                }
+                
+                // build a string out of the appropriate pieces
+                StringBuffer sb = new StringBuffer();
+                for (int j = 1; j < i; j++) {
+                    sb.append(msgs[j]).append("\n");   
+                }
+                
+                // set the property with the log contents
+                getProject().setProperty(property, sb.toString());
+            }
+        
+            Unset unset = new Unset();
+            unset.setProject(getProject());
+            unset.setName(temp_property);
+            unset.execute();
+        }
+        catch(Exception e) {
+            e.printStackTrace();   
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Repeat.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Repeat.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Repeat.java	(revision 15023)
@@ -0,0 +1,326 @@
+
+/*
+* Copyright (c) 2001-2004 Ant-Contrib project.  All rights reserved.
+*
+* Licensed 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.
+*/
+package ise.antelope.tasks;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import ise.library.PrivilegedAccessor;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+import ise.antelope.tasks.typedefs.TimeUnit;
+
+/**
+ * Repeatedly executes a set of tasks. Borrowed most of the code from the Limit
+ * task.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.3 $
+ * @since     Ant 1.5
+ */
+public class Repeat extends Task implements TaskContainer {
+
+    // storage for nested tasks
+    private Vector tasks = new Vector();
+
+    // time units, default value is 10 seconds.
+    private long repeatInterval = 10;
+    protected TimeUnit unit = TimeUnit.SECOND_UNIT;
+
+    // property to set if time limit is reached
+    private String timeoutProperty = null;
+    private String timeoutValue = "true";
+
+    // should the build fail if any subtasks fail? Default is no.
+    private boolean failOnError = false;
+
+    private int repeatCount = 1;
+
+    private BooleanConditionTask condition = null;
+
+    /**
+     * Add a task to repeat.
+     *
+     * @param task                A task to execute
+     * @exception BuildException  won't happen
+     */
+    public void addTask(Task task) throws BuildException {
+        tasks.addElement(task);
+    }
+
+    /**
+     * "until" is the same as a "bool" as used in assert and if. If used, this
+     * task will repeat until either this condition is met or the maximum number
+     * of repetitions has been met, whichever is first.
+     *
+     * @param c                   The feature to be added to the Until attribute
+     * @exception BuildException  Description of Exception
+     */
+    public void addUntil(BooleanConditionTask c) throws BuildException {
+        if (condition == null)
+            condition = c;
+        else
+            throw new BuildException("Can only add one condition.");
+    }
+
+
+    /**
+     * How long to wait between repeating the nested tasks, default is 10 sec.
+     *
+     * @param wait  time between repeats
+     */
+    public void setInterval(int wait) {
+        repeatInterval = wait;
+    }
+
+    /**
+     * Sets the unit for the time between repeats. Default is seconds.
+     *
+     * @param unit  valid values are "millisecond", "second", "minute", "hour",
+     *      "day", and "week".
+     */
+    public void setUnit(String unit) {
+        if (unit == null)
+            return;
+        if (unit.equals(TimeUnit.SECOND)) {
+            setRepeatunit(TimeUnit.SECOND_UNIT);
+            return;
+        }
+        if (unit.equals(TimeUnit.MILLISECOND)) {
+            setRepeatunit(TimeUnit.MILLISECOND_UNIT);
+            return;
+        }
+        if (unit.equals(TimeUnit.MINUTE)) {
+            setRepeatunit(TimeUnit.MINUTE_UNIT);
+            return;
+        }
+        if (unit.equals(TimeUnit.HOUR)) {
+            setRepeatunit(TimeUnit.HOUR_UNIT);
+            return;
+        }
+        if (unit.equals(TimeUnit.DAY)) {
+            setRepeatunit(TimeUnit.DAY_UNIT);
+            return;
+        }
+        if (unit.equals(TimeUnit.WEEK)) {
+            setRepeatunit(TimeUnit.WEEK_UNIT);
+            return;
+        }
+
+    }
+
+    /**
+     * Set a number of milliseconds between repeats.
+     *
+     * @param value  the number of milliseconds between repeats.
+     */
+    public void setMilliseconds(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.MILLISECOND_UNIT);
+    }
+
+    /**
+     * Set a number of seconds between repeats.
+     *
+     * @param value  the number of seconds to wait.
+     */
+    public void setSeconds(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.SECOND_UNIT);
+    }
+
+    /**
+     * Set a number of minutes between repeats.
+     *
+     * @param value  the number of milliseconds to wait.
+     */
+    public void setMinutes(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.MINUTE_UNIT);
+    }
+
+    /**
+     * Set a number of hours between repeats.
+     *
+     * @param value  the number of hours to wait.
+     */
+    public void setHours(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.HOUR_UNIT);
+    }
+
+    /**
+     * Set a number of days between repeats.
+     *
+     * @param value  the number of days to wait.
+     */
+    public void setDays(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.DAY_UNIT);
+    }
+
+    /**
+     * Set a number of weeks between repeats.
+     *
+     * @param value  the number of weeks to wait.
+     */
+    public void setWeeks(int value) {
+        setInterval(value);
+        setRepeatunit(TimeUnit.WEEK_UNIT);
+    }
+
+    /**
+     * Set the max wait time unit, default is minutes.
+     *
+     * @param unit  The new repeatUnit value
+     */
+    public void setRepeatunit(TimeUnit unit) {
+        this.unit = unit;
+    }
+
+
+    /**
+     * Determines whether the build should fail if the time limit has expired on
+     * this task. Default is no.
+     *
+     * @param fail  if true, fail the build if the time limit has been reached.
+     */
+    public void setFailonerror(boolean fail) {
+        failOnError = fail;
+    }
+    
+
+
+    /**
+     * Name the property to set after all repeats are complete.
+     *
+     * @param p  name of property
+     */
+    public void setProperty(String p) {
+        timeoutProperty = p;
+    }
+
+
+    /**
+     * The value for the property to set after all repeats are complete,
+     * defaults to true.
+     *
+     * @param v  value for the property
+     */
+    public void setValue(String v) {
+        timeoutValue = v;
+    }
+
+    /**
+     * Sets the number of times to repeat, default is 1. Use -1 to repeat
+     * forever.
+     *
+     * @param count  The new repeatCount value
+     */
+    public void setCount(int count) {
+        repeatCount = count;
+    }
+
+
+    /**
+     * Execute all nested tasks, repeating.
+     *
+     * @exception BuildException  Description of the Exception
+     */
+    public void execute() throws BuildException {
+        try {
+            long repeat_interval = repeatInterval * unit.getMultiplier();
+            if (repeat_interval <= 0) {
+                log("Interval is set to 0, will only execute tasks 1 time.");
+                repeatCount = 1;
+            }
+
+            if (repeatCount >= 1) {
+                for (int i = 0; i < repeatCount; i++) {
+                    repeatTasks();
+                    if (condition != null && condition.eval()) {
+                        break;
+                    }
+                    if (i + 1 < repeatCount)
+                        Thread.currentThread().sleep(repeat_interval);
+                }
+            }
+            else if (repeatCount == -1) {
+                while (true) {
+                    repeatTasks();
+                    if (condition != null && condition.eval())
+                        break;
+                    Thread.currentThread().sleep(repeat_interval);
+                }
+            }
+            else if (repeatCount != 0 && repeat_interval == 0) {
+                repeatTasks();
+            }
+            else {
+                // do nothing. To get here, either the repeatCount must be 0, so
+                // don't execute any of the nested tasks, or the repeat_interval
+                // must be less than 0, which is invalid.
+            }
+
+            if (timeoutProperty != null) {
+                if (timeoutValue == null)
+                    timeoutValue = "true";
+                getProject().setUserProperty(timeoutProperty, timeoutValue);
+            }
+        }
+        catch (InterruptedException ie) {
+            throw new BuildException(ie.getMessage());
+        }
+    }
+
+    /**
+     * Description of the Method
+     *
+     * @exception BuildException  Description of Exception
+     */
+    private void repeatTasks() throws BuildException {
+        try {
+            // executing nested tasks
+            for (int i = 0; i < tasks.size(); i++) {
+                Task currentTask = (Task) tasks.get(i);
+                try {
+                    currentTask.perform();
+                }
+                catch (Exception ex) {
+                    if (failOnError) {
+                        throw ex;
+                    }
+                }
+            }
+        }
+        catch (Exception e) {
+            if (failOnError) {
+                throw new BuildException(e.getMessage());
+            }
+            else {
+                log(e.getMessage());
+            }
+        }
+    }
+
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SplitTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SplitTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SplitTask.java	(revision 15023)
@@ -0,0 +1,368 @@
+
+package ise.antelope.tasks;
+
+import java.io.*;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+
+/**
+ * This task is similar to the Unix/Linux split utility, it splits a file into
+ * a number of smaller pieces.  It will also split a property value or a string.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.3 $
+ * @since     Ant 1.6
+ */
+public class SplitTask extends Task {
+
+    private String prefix = "x";
+    private int bytes = -1;
+    private int lines = 1000;
+    private String value = null;
+    private File file = null;
+    private File outputDir = null;
+    private boolean failOnError = true;
+
+    /**
+     * Buffer size for read and write operations, default is 1 MB, but this is
+     * a user setting.
+     */
+    public int BUFFER_SIZE = 1024 * 1024;
+
+
+    /**
+     * The start of the file names to write.  Files are named using this string,
+     * followed by a "." and a number, e.g. x.0, x.1, etc.  The Unix/Linux split
+     * uses a letter scheme for the suffix, that is not supported here.
+     *
+     * Should the dot go away? If the user wants a dot, it could be part of this
+     * attribute.  Right now, the dot is there, and there is no way for the user
+     * to make it go away.
+     *
+     * @param x  The new prefix value
+     */
+    public void setPrefix( String x ) {
+        prefix = x;
+    }
+
+    /**
+     * Set the number of bytes per part.  This is not a required parameter,
+     * the default is to use lines rather than bytes.
+     *
+     * Use bytes or lines, not both. In general, use bytes or size for binary
+     * files, lines for text files.
+     *
+     * @param b  number of bytes per part.
+     */
+    public void setBytes( int b ) {
+        bytes = b;
+        lines = -1;
+    }
+
+    /**
+     * The linux split command allows modifiers: b for 512, k for 1K, m for 1
+     * Meg.  Use this method for a similar effect.  This is not a required
+     * parameter, the default is to use lines rather than size.
+     *
+     * Use bytes or lines, not both. In general, use bytes or size for binary
+     * files, lines for text files.
+     *
+     * @param b  the number of bytes per part, with an optional modifier. If
+     *      there is no modifier, treat same as setBytes(int).  For example,
+     *      setSize("100k") is the same as setBytes(100 * 1024).  Note that the
+     *      maximum size must be smaller than Integer.MAX_VALUE (2147483647).
+     */
+    public void setSize( String b ) {
+        try {
+            int size = calcSize(b);;
+            setBytes( size );
+        }
+        catch ( NumberFormatException e ) {
+            throw new BuildException( "Invalid size parameter: " + b );
+        }
+    }
+
+
+    /**
+     * Set how much memory to use as an internal buffer.  The default internal
+     * buffer size is 1 MB.
+     *
+     * @param b  the number of bytes per part, with an optional modifier. If
+     *      there is no modifier, treat same as setBytes(int).  For example,
+     *      setSize("100k") is the same as setBytes(100 * 1024).  Note that the
+     *      maximum size must be smaller than Integer.MAX_VALUE (2147483647).
+     */
+    public void setBuffersize(String b) {
+        try {
+            int size = calcSize(b);;
+            BUFFER_SIZE = size;
+        }
+        catch ( NumberFormatException e ) {
+            throw new BuildException( "Invalid buffer size parameter: " + b );
+        }
+    }
+
+    /**
+     * Set the number of lines per part, default is 1000.  This is not a required
+     * parameter, but is the default setting for splitting.
+     *
+     * Use bytes or lines, not both. In general, use bytes or size for binary
+     * files, lines for text files.
+     *
+     * @param x  The number of lines per part.
+     */
+    public void setLines( int x ) {
+        lines = x;
+        bytes = -1;
+    }
+
+    /**
+     * Split the text value of the given property.
+     *
+     * One of property, value, or file are required.
+     *
+     * @param p  the name of the property whose value will be split.
+     */
+    public void setProperty( String p ) {
+        String v = getProject().getProperty( p );
+        if ( v == null || v.equals( "" ) )
+            throw new BuildException( "Property " + p + " has no value." );
+        setValue( v );
+    }
+
+    /**
+     * Split the given string.
+     *
+     * One of property, value, or file are required.
+     *
+     * @param v  a string
+     */
+    public void setValue( String v ) {
+        if ( v == null || v.equals( "" ) )
+            throw new BuildException( "Value is null or empty." );
+        value = v;
+    }
+
+    /**
+     * Split the contents of the given file.
+     *
+     * One of property, value, or file are required.
+     *
+     * @param f  the name of the file
+     */
+    public void setFile( File f ) {
+        file = f;
+    }
+
+    /**
+     * Where to put the parts. If file has been set and output directory has not
+     * been set, output to directory containing file.
+     *
+     * @param d  the output directory
+     */
+    public void setOutputdir( File d ) {
+        outputDir = d;
+    }
+
+    /**
+     * Determines whether the build should fail if there is an error. Default is
+     * true.
+     *
+     * @param fail  true or false
+     */
+    public void setFailonerror( boolean fail ) {
+        failOnError = fail;
+    }
+
+
+    /**
+     * Split the given property, value, or file into pieces.
+     *
+     * @exception BuildException  only if failOnError is true
+     */
+    public void execute() throws BuildException {
+        // check params --
+        // must have value or file
+        if ( value == null && file == null )
+            throw new BuildException( "Must have property, value, or file." );
+        // if no file, must have outputDir
+        if ( file == null && outputDir == null )
+            throw new BuildException( "Must have output directory." );
+        // must have only one of value or file
+        if ( value != null && file != null )
+            throw new BuildException( "Must not have more than one of property, value, or file." );
+
+        try {
+            if ( value != null )
+                splitValue();
+            else
+                splitFile();
+        }
+        catch ( Exception e ) {
+            if ( failOnError )
+                throw new BuildException( e.getMessage() );
+            else
+                log( e.getMessage() );
+        }
+    }
+
+    /**
+     * Split a string value into several files.  Since the length of a String
+     * can be no more than Integer.MAX_VALUE, no special handling of the split
+     * sizes is required.
+     *
+     * @exception IOException  if there is an i/o problem
+     */
+    private void splitValue() throws Exception {
+        if ( !outputDir.exists() && !outputDir.mkdirs() ) {
+            throw new IOException( "Unable to create output directory." );
+        }
+
+        StringReader reader = new StringReader( value );
+        int bytes_read = 0;
+        int suffix = 0;
+        if ( bytes > 0 ) {
+            // make files all the same number of bytes
+            char[] buffer = new char[ bytes ];
+            while ( bytes_read > -1 ) {
+                bytes_read = reader.read( buffer, 0, bytes );
+                if ( bytes_read == -1 )
+                    break;
+                FileWriter fw = new FileWriter( new File( outputDir, prefix + "." + String.valueOf( suffix ) ) );
+                fw.write( buffer, 0, bytes_read );
+                fw.flush();
+                fw.close();
+                ++suffix;
+            }
+        }
+        else {
+            // make files all the same number of lines
+            splitByLines( reader );
+        }
+    }
+
+    /**
+     * Split a file into several files.  Need some special handling here since
+     * a file could be larger than Integer.MAX_VALUE, in fact, a file can be at
+     * most Long.MAX_VALUE.
+     *
+     * @exception IOException  if there is an i/o problem
+     */
+    private void splitFile() throws IOException {
+        if ( !file.exists() )
+            throw new FileNotFoundException( file.toString() );
+        if ( file.length() == 0 )
+            throw new BuildException( "Zero length file." );
+        if ( outputDir == null )
+            outputDir = file.getParentFile();
+        if ( !outputDir.exists() && !outputDir.mkdirs() ) {
+            throw new IOException( "Unable to create output directory." );
+        }
+
+        if ( bytes > 0 ) {
+            int suffix = 0;
+            int num_parts = ( int ) ( file.length() / ( long ) bytes );
+            int last_part_size = ( int ) ( file.length() % ( long ) bytes );
+            boolean one_more = last_part_size > 0;
+            BufferedInputStream bis = new BufferedInputStream( new FileInputStream( file ) );
+            for ( int i = 0; i < num_parts; i++ ) {
+                // make files all the same number of bytes
+                FileOutputStream fos = new FileOutputStream( new File( outputDir, prefix + "." + String.valueOf( suffix ) ) );
+                copyToStream( bis, fos, bytes );
+                fos.flush();
+                fos.close();
+                ++suffix;
+            }
+            if ( one_more ) {
+                FileOutputStream fos = new FileOutputStream( new File( outputDir, prefix + "." + String.valueOf( suffix ) ) );
+                copyToStream( bis, fos, last_part_size );
+                fos.flush();
+                fos.close();
+            }
+            bis.close();
+        }
+        else {
+            // make files all the same number of lines
+            splitByLines( new FileReader( file ) );
+        }
+    }
+
+    private void splitByLines( Reader reader ) throws IOException {
+        int suffix = 0;
+        LineNumberReader lnr = new LineNumberReader( reader );
+        String line = lnr.readLine();
+        BufferedWriter writer = new BufferedWriter( new FileWriter( new File( outputDir, prefix + "." + String.valueOf( suffix ) ) ) );
+        while ( line != null ) {
+            writer.write( line );
+            writer.newLine();
+            if ( lnr.getLineNumber() % lines == 0 ) {
+                writer.flush();
+                writer.close();
+                ++suffix;
+                writer = new BufferedWriter( new FileWriter( new File( outputDir, prefix + "." + String.valueOf( suffix ) ) ) );
+            }
+            line = lnr.readLine();
+        }
+        writer.flush();
+        writer.close();
+    }
+
+    private int calcSize(String b) throws NumberFormatException {
+        if ( b == null || b.length() == 0 )
+            return 0;
+        b = b.toLowerCase();
+        String modifier = b.substring( b.length() - 1 );
+        int multiplier = 1;
+        b = b.substring( 0, b.length() - 1 );
+        if ( modifier.equals( "b" ) ) {
+            multiplier = 512;
+        }
+        else if ( modifier.equals( "k" ) ) {
+            multiplier = 1024;
+        }
+        else if ( modifier.equals( "m" ) ) {
+            multiplier = 1024 * 1024;
+        }
+        else {
+            // modifier is not recognized, so put it back, maybe it's a number
+            b = b + modifier;
+        }
+        int size = Integer.parseInt( b ) * multiplier;
+        if (size <= 0) {
+            throw new NumberFormatException();
+        }
+        return size;
+    }
+
+
+    /**
+     * Copies a stream to another stream.
+     *
+     * @param from           stream to copy from
+     * @param to             file to write
+     * @param size           number of bytes to copy from 'from' to 'to'
+     * @return               actual number of bytes copied from 'from' to 'to'
+     * @exception IOException  on any file error
+     */
+    private int copyToStream( InputStream from, OutputStream to, int size ) throws IOException {
+        int buffer_size = BUFFER_SIZE;
+        if ( size <= BUFFER_SIZE ) {
+            buffer_size = size;
+        }
+        byte[] buffer = new byte[ Math.min( BUFFER_SIZE, size ) ];
+        int bytes_read;
+        int total = 0;
+        int offset = 0;
+        while ( total < size ) {
+            bytes_read = from.read( buffer, 0, Math.min( buffer_size, size - offset ) );
+            if ( bytes_read == -1 )
+                break;
+            to.write( buffer, 0, bytes_read );
+            total += bytes_read;
+            offset += bytes_read;
+        }
+        to.flush();
+        return total;
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatch.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatch.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatch.java	(revision 15023)
@@ -0,0 +1,230 @@
+/*
+*  The Apache Software License, Version 1.1
+*
+*  Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
+*  reserved.
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*  notice, this list of conditions and the following disclaimer.
+*
+*  2. Redistributions in binary form must reproduce the above copyright
+*  notice, this list of conditions and the following disclaimer in
+*  the documentation and/or other materials provided with the
+*  distribution.
+*
+*  3. The end-user documentation included with the redistribution, if
+*  any, must include the following acknowlegement:
+*  "This product includes software developed by the
+*  Apache Software Foundation (http://www.apache.org/)."
+*  Alternately, this acknowlegement may appear in the software itself,
+*  if and wherever such third-party acknowlegements normally appear.
+*
+*  4. The names "The Jakarta Project", "Ant", and "Apache Software
+*  Foundation" must not be used to endorse or promote products derived
+*  from this software without prior written permission. For written
+*  permission, please contact apache@apache.org.
+*
+*  5. Products derived from this software may not be called "Apache"
+*  nor may "Apache" appear in their names without prior written
+*  permission of the Apache Group.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+*  SUCH DAMAGE.
+*  ====================================================================
+*
+*  This software consists of voluntary contributions made by many
+*  individuals on behalf of the Apache Software Foundation.  For more
+*  information on the Apache Software Foundation, please see
+*  <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+/**
+ * A stopwatch, useful for 'quick and dirty' performance testing. Typical usage:
+ * <pre>
+ * StopWatch sw = new StopWatch();  // automatically starts
+ * // do something here...
+ * sw.stop();
+ * System.out.println(sw.toString());   // print the total
+ * sw.start();  // restart the stopwatch
+ * // do some more things...
+ * sw.stop();
+ * System.out.println(sw.format(sw.elapsed()); // print the time since the last start
+ * System.out.println(sw.toString()); // print the cumulative total
+ * 
+ * </pre>
+ * @author Dale Anson
+ * @version   $Revision: 1.2 $
+ */
+public class StopWatch {
+
+    /** an identifying name for this stopwatch */
+    private String name = "";
+
+    /** storage for start time */
+    private long startTime = 0;
+
+    /** storage for stop time */
+    private long stopTime = 0;
+
+    /** cumulative elapsed time */
+    private long totalTime = 0;
+
+    /** is the stopwatch running? */
+    private boolean running = false;
+
+    /**
+     * Starts the stopwatch.
+     */
+    public StopWatch() {
+        this( "" );
+    }
+
+    /**
+     * Starts the stopwatch.
+     * @param name an identifying name for this StopWatch
+     */
+    public StopWatch( String name ) {
+        this.name = name;
+        start();
+    }
+
+    /**
+     * Starts/restarts the stopwatch. <code>stop</code> must be called prior
+     * to restart.
+     *
+     * @return   the start time, the long returned System.currentTimeMillis().
+     */
+    public long start() {
+        if ( !running )
+            startTime = System.currentTimeMillis();
+        running = true;
+        return startTime;
+    }
+
+    /**
+     * Stops the stopwatch.
+     *
+     * @return   the stop time, the long returned System.currentTimeMillis().
+     */
+    public long stop() {
+        stopTime = System.currentTimeMillis();
+        if ( running ) {
+            totalTime += stopTime - startTime;
+        }
+        startTime = stopTime;
+        running = false;
+        return stopTime;
+    }
+
+    /**
+     * Total cumulative elapsed time, stops the stopwatch.
+     *
+     * @return   the total time
+     */
+    public long total() {
+        stop();
+        long rtn = totalTime;
+        totalTime = 0;
+        return rtn;
+    }
+
+    /**
+     * Elapsed time, difference between the last start time and now.
+     *
+     * @return   the elapsed time
+     */
+    public long elapsed() {
+        return System.currentTimeMillis() - startTime;
+    }
+
+    /**
+     * @return the name of this StopWatch
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Formats the given time into decimal seconds.    
+     * @return the time formatted as mm:ss.ddd
+     */
+    public String format( long ms ) {
+        String total = String.valueOf( ms );
+        String frontpad = "000";
+        int pad_length = 3 - total.length();
+        if ( pad_length >= 0 )
+            total = "0." + frontpad.substring( 0, pad_length ) + total;
+        else {
+            String dec = total.substring( total.length() - 3 );
+            total = "";
+            int min = 0, sec = 0;
+            min = ( int ) ( ms / 60000 );
+            sec = min > 0 ? ( int ) ( ( ms - ( min * 60000 ) ) / 1000 ) : ( int ) ( ms / 1000 );
+            if ( min > 0 ) {
+                total = String.valueOf( min ) + ":" + ( sec < 10 ? "0" : "" ) + String.valueOf( sec ) + "." + dec;
+            }
+            else {
+                total = String.valueOf( sec ) + "." + dec;
+            }
+        }
+        return total + " sec";
+    }
+
+    /**
+     * Returns the total elapsed time of the stopwatch formatted in decimal seconds.
+     * @return [name: mm:ss.ddd]
+     */
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append( "[" );
+        if ( name != null )
+            sb.append( name ).append( ": " );
+        sb.append( format( totalTime ) );
+        sb.append( "]" );
+        return sb.toString();
+    }
+
+    public static void main ( String[] args ) {
+        StopWatch sw = new StopWatch( "test" );
+        
+        // test the formatter
+        System.out.println( sw.format( 1 ) );
+        System.out.println( sw.format( 10 ) );
+        System.out.println( sw.format( 100 ) );
+        System.out.println( sw.format( 1000 ) );
+        System.out.println( sw.format( 100000 ) );
+        System.out.println( sw.format( 1000000 ) );
+        
+        // test the stopwatch
+        try {
+            System.out.println( "StopWatch: " + sw.getName() );
+            Thread.currentThread().sleep( 2000 );
+            sw.stop();
+            System.out.println( sw.toString() );
+            sw.start();
+            Thread.currentThread().sleep( 2000 );
+            sw.stop();
+            System.out.println( "elapsed: " + sw.format( sw.elapsed() ) );
+            System.out.println( "total: " + sw.format( sw.total() ) );
+        }
+        catch ( Exception e ) {
+            e.printStackTrace();
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatchTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatchTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StopWatchTask.java	(revision 15023)
@@ -0,0 +1,149 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.util.Hashtable;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+/**
+ * Assists in timing tasks and/or targets.
+ *
+ * @author    Dale Anson, danson@germane-software.com
+ * @version   $Revision: 1.3 $
+ */
+public class StopWatchTask extends Task {
+
+    // storage for stopwatch name
+    private String name = null;
+
+    // storage for action
+    private String action = null;
+
+    // storage for watches
+    private static Hashtable watches = null;
+
+    // action definitions
+    private final static String STOP = "stop";
+    private final static String START = "start";
+    private final static String ELAPSED = "elapsed";
+    private final static String TOTAL = "total";
+
+
+    /**
+     * Sets the name attribute of the StopWatchTask object
+     *
+     * @param name  The new name value
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Sets the action attribute of the StopWatchTask object
+     *
+     * @param action  The new action value
+     */
+    public void setAction(String action) {
+        action = action.toLowerCase();
+        if (action.equals(STOP) ||
+                action.equals(START) ||
+                action.equals(ELAPSED) ||
+                action.equals(TOTAL)) {
+            this.action = action;
+        }
+        else {
+            throw new BuildException("invalid action: " + action);
+        }
+    }
+
+    /** Description of the Method */
+    public void execute() {
+        if (name == null)
+            throw new BuildException("name is null");
+        if (action == null)
+            action = START;
+        if (watches == null)
+            watches = new Hashtable();
+        StopWatch sw = (StopWatch) watches.get(name);
+        if (sw == null && action.equals(START)) {
+            sw = new StopWatch(name);
+            watches.put(name, sw);
+            return;
+        }
+        if (sw == null)
+            return;
+        if (action.equals(START)) {
+            sw.start();
+            return;
+        }
+        if (action.equals(STOP)) {
+            sw.stop();
+            return;
+        }
+        if (action.equals(TOTAL)) {
+            String time = sw.format(sw.total());
+            log("[" + name + ": " + time + "]");
+            getProject().setProperty(name, time);
+            return;
+        }
+        if (action.equals(ELAPSED)) {
+            String time = sw.format(sw.elapsed());
+            log("[" + name + ": " + time + "]");
+            getProject().setProperty(name, time);
+            return;
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StringUtilTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StringUtilTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/StringUtilTask.java	(revision 15023)
@@ -0,0 +1,107 @@
+package ise.antelope.tasks;
+
+import ise.antelope.tasks.typedefs.string.*;
+
+import java.util.*;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class StringUtilTask extends Task {
+
+    private String string = null;
+
+    private String property = null;
+
+    private Vector ops = new Vector();
+
+    /**
+     * Sets the string attribute of the StringUtilTask object
+     *
+     * @param string  The new string value
+     */
+    public void setString(String string) {
+        this.string = string;
+    }
+
+    /**
+     * Sets the property attribute of the StringUtilTask object
+     *
+     * @param name  The new property value
+     */
+    public void setProperty(String name) {
+        property = name;
+    }
+
+    /**
+     * Adds a feature to the StringOp attribute of the StringUtilTask object
+     *
+     * @param op  The feature to be added to the StringOp attribute
+     */
+    public void addStringOp(StringOp op) {
+        ops.add(op);
+    }
+    
+    public void addLowercase(LowerCase op) {
+        ops.add(op);   
+    }
+    
+    public void addUppercase(UpperCase op) {
+        ops.add(op);   
+    }
+    
+    public void addTrim(Trim op) {
+        ops.add(op);   
+    }
+    
+    public void addSubstring(Substring op) {
+        ops.add(op);   
+    }
+    
+    public void addReplace(Replace op) {
+        ops.add(op);   
+    }
+    
+    public void addIndexOf(IndexOf op) {
+        ops.add(op);   
+    }
+    
+    public void addLastIndexOf(LastIndexOf op) {
+        ops.add(op);   
+    }
+    
+    public void addLength(Length op) {
+        ops.add(op);   
+    }
+    
+    public void addSort(Sort op) {
+        ops.add(op);   
+    }
+    
+    public void addMessagebox(MessageBox op) {
+        ops.add(op);   
+    }
+
+
+    /** Description of the Method */
+    public void execute() {
+        Enumeration en = ops.elements();
+        while (en.hasMoreElements()) {
+            string = ((StringOp) en.nextElement()).execute(string);
+        }
+        if (property != null) {
+            Unset unset = new Unset();
+            unset.setProject(getProject());
+            unset.setName(property);
+            unset.execute();
+            getProject().setProperty(property, string);
+        }
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Suite.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Suite.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Suite.java	(revision 15023)
@@ -0,0 +1,321 @@
+package ise.antelope.tasks;
+
+import java.io.File;
+import java.util.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+
+import ise.library.ascii.MessageBox;
+
+/**
+ * Modeled after the TestSuite provided by jUnit.
+ *
+ * @author Dale Anson
+ */
+public class Suite extends Task implements TaskContainer, TestStatisticAccumulator {
+
+    // name for the suite
+    private String name = null;
+
+    // vector to hold nested testcases
+    private Vector tasks = null;
+
+    // vector to hold filesets
+    private Vector filesets = null;
+
+    // stats accumulators
+    private int totalTestCount = 0;
+    private int totalRanCount = 0;
+    private int totalPassedCount = 0;
+    private int totalFailedCount = 0;
+    private int totalWarningCount = 0;
+    private Vector failures = new Vector();
+
+    // should the results be shown?
+    private boolean showSummary = true;
+
+    // should the tests be ran?
+    private boolean enabled = true;
+
+    // should Asserts be enabled?
+    private boolean assertEnabled = true;
+    
+    // should the suite throw a build exception on error?
+    private boolean failonerror = false;
+
+    public void init() {
+        super.init();
+        setTaskName( "suite" );
+    }
+
+    /**
+     * Add a testcase to the suite.
+     * @param tc the testcase to add
+     */
+    public void addTestCase( TestCase tc ) {
+        addTask( tc );
+    }
+
+    /**
+     * Add a stuie to the suite.
+     * @param s the suite to add
+     */
+    public void addSuite( Suite s ) {
+        addTask( s );
+    }
+
+    /**
+     * Add a task to execute, most likely a testcase, but really can be any task. <p>
+     *
+     * @param task  Nested task to execute. <p>
+     */
+    public void addTask( Task task ) {
+        if ( tasks == null )
+            tasks = new Vector();
+        tasks.addElement( task );
+    }
+
+    /**
+     * Add a fileset to the suite.  For each file in the fileset, a testcase
+     * will be created.
+     */
+    public void addFileset( FileSet fs ) {
+        if ( tasks == null )
+            tasks = new Vector();
+        tasks.addElement( fs );
+    }
+
+    /**
+     * Set a name for the suite, optional attribute.
+     * @param s the name for the suite.
+     */
+    public void setName( String s ) {
+        name = s;
+    }
+
+    /**
+     * @return the name of the suite, may be null.    
+     */
+    public String getName() {
+        return name;
+    }
+    
+    public void setFailonerror(boolean f) {
+        failonerror = f;   
+    }
+    
+    public boolean getFailonerror() {
+        return failonerror;   
+    }
+
+    /**
+     * Set to true if the test should be allowed to run.
+     * @param b if true, execute the test.  This is handy for enabling or disabling
+     * groups of tests by setting a single property.  Optional, default
+     * is true, the suite should run.
+     */
+    public void setEnabled( boolean b ) {
+        enabled = b;
+    }
+
+    /**
+     * Should asserts be enabled? Asserts are enabled by default.
+     * @param b if false, disable asserts
+     */
+    public void setAssertsenabled( boolean b ) {
+        assertEnabled = b;
+    }
+
+    /**
+     * Should the results be shown?
+     * @param b show the results if true
+     */
+    public void setShowsummary( boolean b ) {
+        showSummary = b;
+    }
+
+    public int getTestCaseCount() {
+        return totalTestCount;
+    }
+
+    public int getRanCount() {
+        return totalRanCount;
+    }
+
+    public int getPassedCount() {
+        return totalPassedCount;
+    }
+
+    public int getFailedCount() {
+        return totalFailedCount;
+    }
+    
+    /**
+     * @return   an Enumeration of the failures. Individual elements are Strings
+     *      containing the name of the failed target and the reason why it
+     *      failed.
+     */
+    public Enumeration getFailures() {
+        return failures.elements();
+    }
+
+    public int getWarningCount() {
+        return totalWarningCount;   
+    }
+
+    /** Run tests. */
+    public void execute() {
+        if ( !enabled )
+            return ;
+
+        String ae = assertEnabled ? "true" : "false";
+        if ( assertEnabled )
+            getProject().setProperty( "ant.enable.asserts", ae );
+
+        try {
+            // get the setUp and tearDown targets
+            Target setUp = null;
+            Target tearDown = null;
+            Hashtable targets = getProject().getTargets();
+            Enumeration en = targets.keys();
+            while ( en.hasMoreElements() ) {
+                String target_name = ( String ) en.nextElement();
+                if ( target_name.equals( "setUp" ) )
+                    setUp = ( Target ) targets.get( target_name );
+                else if ( target_name.equals( "tearDown" ) )
+                    tearDown = ( Target ) targets.get( target_name );
+            }
+
+            // run the setUp target
+            if ( setUp != null )
+                setUp.execute();
+
+            // create testcases out of any filesets, maintaining order with
+            // testcases already added.
+            Vector testcases = new Vector();
+            if ( tasks != null && tasks.size() > 0 ) {
+                for ( Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+                    Object o = e.nextElement();
+                    if ( o instanceof FileSet ) {
+                        loadTestFiles( ( FileSet ) o, testcases );
+                    }
+                    else {
+                        testcases.addElement( o );
+                    }
+                }
+
+                // actually execute the testcases
+                for ( Enumeration e = testcases.elements(); e.hasMoreElements(); ) {
+                    Task task = ( Task ) e.nextElement();
+                    task.perform();
+                }
+            }
+
+            // run the tearDown target
+            if ( tearDown != null )
+                tearDown.execute();
+
+            // tabulate the results.  The individual testcases contain their
+            // own stats, so it is just a matter of reading them and accumulating
+            // the totals.
+            for ( Enumeration e = testcases.elements(); e.hasMoreElements(); ) {
+                Task task = ( Task ) e.nextElement();
+                if ( task instanceof TestStatisticAccumulator ) {
+                    TestStatisticAccumulator acc = ( TestStatisticAccumulator ) task;
+                    totalTestCount += acc.getTestCaseCount();
+                    totalRanCount += acc.getRanCount();
+                    totalPassedCount += acc.getPassedCount();
+                    totalFailedCount += acc.getFailedCount();
+                    totalWarningCount += acc.getWarningCount();
+                    for (Enumeration fen = acc.getFailures(); fen.hasMoreElements(); ) {
+                        failures.add(fen.nextElement());   
+                    }
+                }
+            }
+            if ( showSummary ) {
+                log( getSummary() );
+            }
+
+            if (failonerror && totalFailedCount > 0)
+                throw new BuildException("+++++ FAILED +++++\n" + getSummary());
+        }
+        catch ( Exception ex ) {
+            ex.printStackTrace();
+            throw new BuildException( ex.getMessage() );
+        }
+    }
+
+    public String getSummary() {
+        String title = (name == null ? "Suite" : name ) + " Totals";
+        StringBuffer msg = new StringBuffer();
+        String ls = System.getProperty( "line.separator" );
+
+        // log the failures
+        if (failures.size() > 0) {
+            String error_title = "Errors";
+            StringBuffer error_msg = new StringBuffer();
+            Enumeration en = failures.elements();
+            while (en.hasMoreElements()) {
+                error_msg.append((String) en.nextElement()).append(ls);
+            }
+            int box_width = MessageBox.getMaxWidth();
+            MessageBox.setMaxWidth(box_width - 8);
+            msg.append(MessageBox.box(error_title, error_msg));
+            MessageBox.setMaxWidth(box_width);
+            msg.append(ls);
+        }
+
+        msg.append( "Total Ran:      " ).append( totalRanCount ).append( " out of " ).append( totalTestCount ).append( " tests." ).append( ls );
+        msg.append( "Total Passed:   " ).append( totalPassedCount ).append( ls );
+        msg.append( "Total Warnings: " ).append( totalWarningCount ).append( ls );
+        msg.append( "Total Failed:   " ).append( totalFailedCount ).append( ls );
+        return MessageBox.box(title, msg);
+    }
+
+    /**
+     * Create TestCases from the files specified in a FileSet.
+     * @param fs the fileset to use for testcases
+     * @param destination where to store the newly created TestCases.
+     */
+    protected void loadTestFiles( FileSet fs, Vector destination ) {
+        File d = fs.getDir( getProject() );
+        DirectoryScanner ds = fs.getDirectoryScanner( getProject() );
+        String[] files = ds.getIncludedFiles();
+        String[] dirs = ds.getIncludedDirectories();
+        if ( files.length > 0 ) {
+            for ( int j = 0; j < files.length; j++ ) {
+                File f = new File( d, files[ j ] );
+                TestCase tc = createTestCase( f );
+                destination.addElement( tc );
+            }
+        }
+
+        if ( dirs.length > 0 ) {
+            for ( int j = dirs.length - 1; j >= 0; j-- ) {
+                File dir = new File( d, dirs[ j ] );
+                String[] dirFiles = dir.list();
+                if ( dirFiles != null && dirFiles.length > 0 ) {
+                    for ( int i = 0; i < dirFiles.length; i++ ) {
+                        File f = new File( dir, dirFiles[ i ] );
+                        TestCase tc = createTestCase( f );
+                        destination.addElement( tc );
+                    }
+                }
+            }
+        }
+    }
+
+    private TestCase createTestCase( File f ) {
+        TestCase tc = new TestCase();
+        tc.init();
+        tc.setFile( f );
+        tc.setProject( getProject() );
+        return tc;
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SuiteOriginal.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SuiteOriginal.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SuiteOriginal.java	(revision 15023)
@@ -0,0 +1,157 @@
+package ise.antelope.tasks;
+
+import java.util.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.Task;
+
+/**
+ * Modeled after the TestSuite provided by jUnit, this class is an Ant task that
+ * looks through the build file that contains this task, calls a 'setUp' target
+ * (if it exists), then all targets whose names start with 'test', and last calls
+ * a target named 'tearDown' (if it exists).  Both 'setUp' and 'tearDown' are
+ * optional targets in the build file. <p>
+ * Ant stores targets in a hashtable, so there is no guaranteed order in which
+ * the 'test*' classes will be called.  If order is important, use the 'depends'
+ * attribue of a target to enforce order, and do not name dependent targets with
+ * a name starting with 'test'. <p>
+ * Test targets may also be imported with the import task.  Imported files should
+ * not have a "suite" task in the implicit target as such a task would rerun
+ * all test targets in all files.
+ *
+ * @author Dale Anson
+ */
+public class SuiteOriginal extends Task {
+
+    private Target setUp = null;
+    private Target tearDown = null;
+    private Vector testTargets = new Vector();
+    private Vector failures = new Vector();
+    private boolean showSummary = true;
+    private boolean showOutput = true;
+
+    private int tests_passed = 0;
+    private int tests_failed = 0;
+
+    public int getTestCaseCount() {
+        return testTargets.size();
+    }
+
+    public int getRanCount() {
+        return tests_passed + tests_failed;
+    }
+
+    public int getFailedCount() {
+        return tests_failed;
+    }
+
+    public int getPassedCount() {
+        return tests_passed;
+    }
+
+    public Enumeration getFailures() {
+        return failures.elements();
+    }
+
+    public void setShowoutput( boolean b ) {
+        showOutput = b;
+    }
+    
+    public void setShowsummary(boolean b ) {
+        showSummary = b;   
+    }
+
+    /** Run tests. */
+    public void execute() {
+
+        // get the setUp, tearDown, and test targets
+        Hashtable targets = getProject().getTargets();
+        Enumeration en = targets.keys();
+        while ( en.hasMoreElements() ) {
+            String target = ( String ) en.nextElement();
+            if ( target.equals( "setUp" ) )
+                setUp = ( Target ) targets.get( target );
+            else if ( target.equals( "tearDown" ) )
+                tearDown = ( Target ) targets.get( target );
+            else if ( target.startsWith( "test" ) )
+                testTargets.addElement( targets.get( target ) );
+            // also check for imported targets.  Imported targets are named like
+            // projectname.targetname, so check for whatever follows the last dot.
+            // This is somewhat naive, as there is no restriction using dots in
+            // target names, so a target named "build.testimonials" would be treated
+            // as a test target.
+            else if ( target.lastIndexOf( "." ) > 0 && target.substring( target.lastIndexOf( "." ) + 1 ).startsWith( "test" ) ) {
+                testTargets.addElement( targets.get( target ) );
+            }
+        }
+
+        // run the setUp target
+        if ( setUp != null )
+            setUp.execute();
+        en = testTargets.elements();
+
+        // run the test targets
+        StringBuffer messages = new StringBuffer();
+        while ( en.hasMoreElements() ) {
+            Target target = ( Target ) en.nextElement();
+            try {
+                executeDependencies( target );
+                target.performTasks();
+                if (showOutput)
+                    log( target.getName() + " passed." );
+                ++tests_passed;
+            }
+            catch ( Exception e ) {
+                ++tests_failed;
+                if (showOutput)
+                    log( target.getName() + " failed: " + e.getMessage() );
+                failures.addElement( target.getName() + " failed: " + e.getMessage() );
+            }
+        }
+
+        // run the tearDown target
+        if ( tearDown != null )
+            tearDown.execute();
+
+        // print any error messages
+        if ( showSummary ) {
+            // log the failures
+            if ( failures.size() > 0 ) {
+                log( "" );
+                log( "---- Errors ---------------------------------" );
+                en = failures.elements();
+                while(en.hasMoreElements()) {
+                    String msg = (String)en.nextElement();
+                    log(msg);
+                }
+            }
+
+            // log the test count info
+            log( "" );
+            log( "---- Results --------------------------------" );
+            log( "Ran " + getRanCount() + " out of " + getTestCaseCount() + " tests." );
+            log( "Passed: " + getPassedCount() );
+            log( "Failed: " + getFailedCount() );
+        }
+    }
+
+    /**
+     * Execute a target's dependencies followed by the target itself.
+     * @param target the target to execute
+     */
+    private void executeDependencies( Target target ) {
+        if ( target == null )
+            return ;
+        Enumeration en = target.getDependencies();
+        if ( en == null )
+            return ;
+        while ( en.hasMoreElements() ) {
+            String name = ( String ) en.nextElement();
+            Target t = ( Target ) getProject().getTargets().get( name );
+            executeDependencies( t );
+            t.performTasks();
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SwitchTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SwitchTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/SwitchTask.java	(revision 15023)
@@ -0,0 +1,139 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * This task emulates a Java switch.
+ * @author Dale Anson
+ */
+public class SwitchTask extends Task  {
+
+    private Vector cases = new Vector();
+    private Case defaultCase = null;
+    private String name = null;
+
+    /**
+     * Register dependent tasks.    
+     */
+    public void init() {
+        getProject().addTaskDefinition( "case", Case.class );
+        getProject().addTaskDefinition( "default", DefaultCase.class );
+        getProject().addTaskDefinition( "break", Break.class );
+    }
+
+    /**
+     * Set the name of the property to switch on.
+     * @param name the name of the property to switch on.    
+     */
+    public void setName( String name ) {
+        this.name = name;
+    }
+
+    /**
+     * Adds a case to this switch. A switch can have any number of cases.
+     * @param c the case to add.    
+     */
+    public void addCase( Case c ) {
+        cases.addElement( c );
+    }
+
+    /**
+     * Adds a default case to this switch. Only one case may be added.
+     * @param c the default case.
+     */
+    public void addDefault( DefaultCase c ) {
+        if ( defaultCase == null ) {
+            defaultCase = c;
+            return ;
+        }
+        else
+            throw new BuildException( "<switch> can have only one <default>" );
+    }
+
+    public void execute() throws BuildException {
+        if ( name == null )
+            throw new BuildException( "'name' attribute cannot be null." );
+        String value = getProject().getProperty( name );
+        if ( value == null )
+            throw new BuildException( "Property " + name + " does not exist." );
+        boolean disregardValue = false;     // should the case fall through to the next?
+        Enumeration en = cases.elements();
+        while ( en.hasMoreElements() ) {
+            Case c = ( Case ) en.nextElement();
+            if ( disregardValue ) {
+                c.perform();
+                if ( c.doBreak() )
+                    return ;
+            }
+            else if ( value.equals( c.getValue() ) ) {
+                c.perform();
+                if ( c.doBreak() )
+                    return ;
+                else
+                    disregardValue = true;
+            }
+        }
+        // if here, then do the default case
+        if ( defaultCase != null ) {
+            defaultCase.perform();
+        }
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestCase.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestCase.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestCase.java	(revision 15023)
@@ -0,0 +1,401 @@
+package ise.antelope.tasks;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.tools.ant.*;
+
+import ise.library.ascii.MessageBox;
+
+/**
+ * Modeled after the TestCase provided by jUnit, this class is an Ant task that
+ * looks through the build file set in the <code>setFile</code> method, calls a
+ * 'setUp' target in that build file (if it exists), then all targets whose
+ * names start with 'test', and last calls a target named 'tearDown' (if it
+ * exists). Both 'setUp' and 'tearDown' are optional targets in the build file.
+ * <p>
+ *
+ * Ant stores targets in a hashtable, so there is no guaranteed order in which
+ * the 'test*' classes will be called. If order is important, use the 'depends'
+ * attribue of a target to enforce order, and do not name dependent targets with
+ * a name starting with 'test'. <p>
+ *
+ * Test targets may also be imported with the import task. Imported files should
+ * not have a "suite" task in the implicit target as such a task would rerun all
+ * test targets in all files.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.3 $
+ */
+public class TestCase extends Task implements TestStatisticAccumulator {
+
+    private boolean enabled = true;
+    private boolean assertEnabled = true;
+    private Target setUp = null;
+    private Target tearDown = null;
+    private Vector testTargets = new Vector();
+    private Vector failures = new Vector();
+    private boolean failOnError = false;
+    private boolean showSummary = true;
+    private boolean showOutput = true;
+    private File testFile = null;
+    private String test_name = "";
+
+    private int tests_passed = 0;
+    private int tests_failed = 0;
+    private int tests_warning = 0;
+
+    /** task initilization */
+    public void init() {
+        super.init();
+        setTaskName("testcase");
+    }
+
+    /**
+     * @return   the count of test targets.
+     */
+    public int getTestCaseCount() {
+        return testTargets.size();
+    }
+
+    /**
+     * @return   the number of tests targets actually executed.
+     */
+    public int getRanCount() {
+        return tests_passed + tests_warning + tests_failed;
+    }
+
+    /**
+     * @return   the number of tests that failed.
+     */
+    public int getFailedCount() {
+        return tests_failed;
+    }
+    
+    public int getWarningCount() {
+        return tests_warning;   
+    }
+
+    /**
+     * @return   the number of tests that passed.
+     */
+    public int getPassedCount() {
+        return tests_passed;
+    }
+
+    /**
+     * @return   an Enumeration of the failures. Individual elements are Strings
+     *      containing the name of the failed target and the reason why it
+     *      failed.
+     */
+    public Enumeration getFailures() {
+        return failures.elements();
+    }
+
+    /**
+     * @param b  if true, show the output of the tests as they run. Optional,
+     *      default is true, do show output.
+     */
+    public void setShowoutput(boolean b) {
+        showOutput = b;
+    }
+
+    /**
+     * @param b  if true, show the summary output (number of tests, passed,
+     *      failed) after the completion of all tests. Optional, default is
+     *      true, do show summary.
+     */
+    public void setShowsummary(boolean b) {
+        showSummary = b;
+    }
+
+    /**
+     * @param f  the file containing the tests to execute. Required. The file
+     *      itself is a standard Ant build file, but will be treated differently
+     *      than if Ant itself ran it. If there is a target named "setUp", that
+     *      target will be executed first, then all targets with names starting
+     *      with "test" (not in any particular order), then if there is a target
+     *      named "tearDown", that target will be executed last. All other
+     *      targets are ignored.
+     */
+    public void setFile(File f) {
+        testFile = f;
+    }
+
+    /**
+     * Should Asserts be enabled? Many (most?) tests will use the Assert task,
+     * which requires a property to be set to actually enable the asserts. By
+     * default, Asserts are enabled for testcases.
+     *
+     * @param b  if false, do not enable asserts. Note that this sets an Ant
+     *      property, and due to property immutability, this attribute may have
+     *      no effect if it has been set already. Generally, asserts are enabled
+     *      or disabled for an entire build.
+     */
+    public void setAssertsenabled(boolean b) {
+        assertEnabled = b;
+    }
+
+    /**
+     * Should the build fail if the test fails? By default, a failed test does
+     * not cause the build to fail, so all tests may have the opportunity to
+     * run.
+     *
+     * @param b  set to true to cause the build to fail if the test fails
+     */
+    public void setFailonerror(boolean b) {
+        failOnError = b;
+    }
+
+    /**
+     * @return   the name of the test as set by <code>setName</code>. If the
+     *      name has not be explicitly set, then the test name is the project
+     *      name if there is one, otherwise, the filename of the test file.
+     */
+    public String getName() {
+        return test_name;
+    }
+
+    /**
+     * Set the name for this testcase.
+     *
+     * @param n  the name for the testcase
+     */
+    public void setName(String n) {
+        test_name = n;
+    }
+
+    /**
+     * @param b  if true, execute the test. This is handy for enabling or
+     *      disabling groups of tests in a 'suite' by setting a single property.
+     *      Optional, default is true, the test should run.
+     */
+    public void setEnabled(boolean b) {
+        enabled = b;
+    }
+
+    /** Run tests. */
+    public void execute() {
+        
+        /*
+        Hashtable parent_targets = getProject().getTargets();
+        
+        for (Iterator it = parent_targets.keySet().iterator(); it.hasNext(); ) {
+            log(it.next());   
+        }
+        */
+        
+        if (!enabled)
+            return;
+
+        // check the test file
+        if (testFile == null)
+            throw ProjectHelper.addLocationToBuildException(new BuildException("missing file for testcase"), getLocation());
+        if (!testFile.exists())
+            throw ProjectHelper.addLocationToBuildException(new BuildException("file not found for testcase: " + testFile), getLocation());
+
+        // make sure asserts are enabled
+        String ae = assertEnabled ? "true" : "false";
+        if (assertEnabled)
+            getProject().setProperty("ant.enable.asserts", ae);
+
+        // create a new project, similar to the "ant" task, but not nearly as involved.
+        // All properties will be copied from the parent project to the subproject, and
+        // any properties set during execution of the subproject will be copied back to
+        // the parent project.
+        Project myProject = new Project();
+        initializeProject(myProject);
+        try {
+            ProjectHelper.configureProject(myProject, testFile);
+        }
+        catch (BuildException be) {
+            throw ProjectHelper.addLocationToBuildException(be, getLocation());
+        }
+
+        // set the test name, use a name that was set as an attribute first,
+        // otherwise, use the project name, and if all else fails, use the name
+        // of the test file
+        if (test_name == null || test_name.equals(""))
+            test_name = myProject.getName();
+        if (test_name == null || test_name.equals(""))
+            test_name = testFile.getName();
+
+        if (showOutput) {
+            // output start of test
+            log(MessageBox.box("Starting test: " + test_name));
+        }
+
+        // get the setUp, tearDown, and test targets
+        Hashtable targets = myProject.getTargets();
+        Enumeration en = targets.keys();
+        while (en.hasMoreElements()) {
+            String target = (String) en.nextElement();
+            if (target.equals("setUp"))
+                setUp = (Target) targets.get(target);
+            else if (target.equals("tearDown"))
+                tearDown = (Target) targets.get(target);
+            else if (target.startsWith("test"))
+                testTargets.addElement(targets.get(target));
+            // also check for imported targets.  Imported targets are named like
+            // projectname.targetname, so check for whatever follows the last dot.
+            // This is somewhat naive, as there is no restriction using dots in
+            // target names, so a target named "build.testimonials" would be treated
+            // as a test target.
+            else if (target.lastIndexOf(".") > 0 && target.substring(target.lastIndexOf(".") + 1).startsWith("test")) {
+                testTargets.addElement(targets.get(target));
+            }
+        }
+
+        // run the setUp target
+        if (setUp != null)
+            setUp.execute();
+
+        // run the test targets
+        StringBuffer messages = new StringBuffer();
+        en = testTargets.elements();
+        while (en.hasMoreElements()) {
+            Target target = (Target) en.nextElement();
+            try {
+                myProject.executeTarget(target.getName());
+                if (showOutput)
+                    log(target.getName() + " passed.");
+                ++tests_passed;
+            }
+            catch (Exception e) {
+                String error = "ERROR: ";
+                if (e instanceof AssertException) {
+                    int level = ((AssertException)e).getLevel();
+                    if (level == AssertException.ERROR)
+                        ++ tests_failed;
+                    else if (level == AssertException.WARN) {
+                        ++ tests_warning;
+                        error = "WARNING: ";
+                    }
+                    else {
+                        // info or debug level
+                        if (showOutput)
+                            log(target.getName() + ": " + e.getMessage());
+                        continue;
+                    }
+                }
+                else
+                    ++tests_failed;
+                if (showOutput)
+                    log(error + target.getName() + " failed: " + e.getMessage());
+                failures.addElement(error + test_name + ": " + target.getName() + " failed: " + e.getMessage());
+                if (failOnError)
+                    throw new BuildException(e.getMessage());
+            }
+        }
+
+        // run the tearDown target
+        if (tearDown != null)
+            tearDown.execute();
+
+        // copy any new properties to parent project
+        addAlmostAll(getProject(), myProject.getProperties());
+        /*
+        Hashtable props = myProject.getProperties();
+        for (en = props.keys(); en.hasMoreElements(); ) {
+            String key = (String)en.nextElement();
+            String value = (String)props.get(key);
+            if (value != null)
+                getProject().setNewProperty(key, value);
+    }
+        */
+        // print any error messages
+        if (showSummary) {
+            log(getSummary());
+        }
+    }
+
+    /**
+     * Gets the summary attribute of the TestCase object
+     *
+     * @return   The summary value
+     */
+    public String getSummary() {
+        String title = (test_name == null ? "Test" : test_name) + " Results";
+        StringBuffer msg = new StringBuffer();
+        String ls = System.getProperty("line.separator");
+        // log the failures
+        if (failures.size() > 0) {
+            String error_title = "Errors";
+            StringBuffer error_msg = new StringBuffer();
+            Enumeration en = failures.elements();
+            while (en.hasMoreElements()) {
+                error_msg.append((String) en.nextElement()).append(ls);
+            }
+            int box_width = MessageBox.getMaxWidth();
+            MessageBox.setMaxWidth(box_width - 8);
+            msg.append(MessageBox.box(error_title, error_msg));
+            MessageBox.setMaxWidth(box_width);
+            msg.append(ls);
+        }
+
+        // log the test count info
+        msg.append("Ran:     ").append(getRanCount()).append(" out of ").append(getTestCaseCount()).append(" tests.").append(ls);
+        msg.append("Passed:  ").append(getPassedCount()).append(ls);
+        msg.append("Warning: ").append(getWarningCount()).append(ls);
+        msg.append("Failed:  ").append(getFailedCount()).append(ls);
+        return MessageBox.box(title, msg);
+    }
+
+    /**
+     * Attaches the build listeners of the current project to the new project,
+     * configures a possible logfile, transfers task and data-type definitions,
+     * transfers properties (either all or just the ones specified as user
+     * properties to the current project, depending on inheritall), transfers
+     * the input handler.
+     *
+     * @param newProject
+     */
+    private void initializeProject(Project newProject) {
+        newProject.setBaseDir(getProject().getBaseDir());
+        newProject.setInputHandler(getProject().getInputHandler());
+
+        Iterator iter = getProject().getBuildListeners().iterator();
+        while (iter.hasNext()) {
+            newProject.addBuildListener((BuildListener) iter.next());
+        }
+
+        getProject().initSubProject(newProject);
+
+        // copy properties
+        /// are these necessary?  Does addAlmostAll cover these properties?
+        getProject().copyInheritedProperties(newProject);
+        getProject().copyUserProperties(newProject);
+
+        // set all properties from calling project
+        addAlmostAll(newProject, getProject().getProperties());
+
+    }
+
+    /**
+     * Copies all properties from the given table to the given project -
+     * omitting those that have already been set in the project as well as
+     * properties named basedir or ant.file.
+     *
+     * @param props    properties to copy to the project
+     * @param project  The feature to be added to the AlmostAll attribute
+     */
+    private void addAlmostAll(Project project, Hashtable props) {
+        Enumeration e = props.keys();
+        while (e.hasMoreElements()) {
+            String key = e.nextElement().toString();
+            if ("basedir".equals(key) || "ant.file".equals(key)) {
+                // basedir and ant.file get special treatment in execute()
+                continue;
+            }
+
+            String value = props.get(key).toString();
+            // don't re-set user properties, avoid the warning message
+            if (project.getProperty(key) == null) {
+                // no user property
+                project.setNewProperty(key, value);
+            }
+        }
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestStatisticAccumulator.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestStatisticAccumulator.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TestStatisticAccumulator.java	(revision 15023)
@@ -0,0 +1,13 @@
+package ise.antelope.tasks;
+
+import java.util.Enumeration;
+
+interface TestStatisticAccumulator {
+    public int getFailedCount();
+    public Enumeration getFailures();
+    public int getWarningCount();
+    public int getPassedCount();
+    public int getRanCount();
+    public String getSummary();
+    public int getTestCaseCount();
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TryTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TryTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/TryTask.java	(revision 15023)
@@ -0,0 +1,318 @@
+/*
+*  The Apache Software License, Version 1.1
+*
+*  Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+*  reserved.
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*  notice, this list of conditions and the following disclaimer.
+*
+*  2. Redistributions in binary form must reproduce the above copyright
+*  notice, this list of conditions and the following disclaimer in
+*  the documentation and/or other materials provided with the
+*  distribution.
+*
+*  3. The end-user documentation included with the redistribution, if
+*  any, must include the following acknowlegement:
+*  "This product includes software developed by the
+*  Apache Software Foundation (http://www.apache.org/)."
+*  Alternately, this acknowlegement may appear in the software itself,
+*  if and wherever such third-party acknowlegements normally appear.
+*
+*  4. The names "The Jakarta Project", "Ant", and "Apache Software
+*  Foundation" must not be used to endorse or promote products derived
+*  from this software without prior written permission. For written
+*  permission, please contact apache@apache.org.
+*
+*  5. Products derived from this software may not be called "Apache"
+*  nor may "Apache" appear in their names without prior written
+*  permission of the Apache Group.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+*  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+*  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+*  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+*  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+*  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+*  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+*  SUCH DAMAGE.
+*  ====================================================================
+*
+*  This software consists of voluntary contributions made by many
+*  individuals on behalf of the Apache Software Foundation.  For more
+*  information on the Apache Software Foundation, please see
+*  <http://www.apache.org/>.
+*/
+package ise.antelope.tasks;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Enumeration;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.TaskContainer;
+
+/**
+ * Try is a container task - it can contain other Ant tasks. The nested tasks
+ * are simply executed in sequence. Try's primary use is to support the
+ * try/catch-like execution of a set of tasks. If any of the child tasks fail
+ * (that is, they throw a build exception), the exception is caught and the
+ * build can continue. This is sometimes useful for tasks that can fail, but it
+ * isn't necessary to fail the build if they do. For example, the "mail" task
+ * may fail if the server is unavailable, but not sending the message may not be
+ * critical to the build continuing.
+ *
+ * @author     Dale Anson, danson@germane-software.com
+ * @version    $Revision: 1.1 $
+ * @since      Ant 1.5
+ * @ant.task   category="control"
+ */
+public class TryTask extends Task implements TaskContainer {
+
+   /**
+    * Vector to hold the nested tasks
+    */
+   private Vector tasks = new Vector();
+
+   /**
+    * support for a nested CatchTask
+    */
+   private Task catchTask = null;
+
+   /**
+    * support for a nested FinallyTask
+    */
+   private Task finallyTask = null;
+
+   /**
+    * should the try block exit on the first failure? Default is true.
+    */
+   private boolean doBreak = true;
+
+   /**
+    * should the error message of an exception be logged? Default is true.
+    */
+   private boolean doPrintMessage = true;
+   
+   /**
+    * the error message of the exception can be stored as a property   
+    */
+   private String messageProperty = null;
+
+   /**
+    * should the stack trace of an exception be logged? Default is false.
+    */
+   private boolean doPrintStackTrace = false;
+
+
+   /**
+    * the stack trace can be stored as a property   
+    */
+   private String stackTraceProperty = null;
+
+
+   /**
+    * make sure dependent tasks are loaded
+    */
+   public void init() {
+      getProject().addTaskDefinition( "catch", CatchTask.class );
+      getProject().addTaskDefinition( "finally", FinallyTask.class );
+   }
+
+
+   /**
+    * Override {@link org.apache.tools.ant.Task#maybeConfigure maybeConfigure}
+    * in a way that leaves the nested tasks unconfigured until they get
+    * executed.
+    *
+    * @exception BuildException  Description of Exception
+    * @since                     Ant 1.5
+    */
+   public void maybeConfigure() throws BuildException {
+      if ( isInvalid() ) {
+         super.maybeConfigure();
+      } else {
+         getRuntimeConfigurableWrapper().maybeConfigure( getProject(), false );
+      }
+   }
+
+
+   /**
+    * Add a nested task to Try.
+    *
+    * @param task  Nested task to try to execute
+    */
+   public void addTask( Task task ) {
+      if ( task instanceof CatchTask ) {
+         if ( catchTask == null ) {
+            catchTask = task;
+            return ;
+         } else {
+            throw new BuildException( "Only one Catch allowed per Try." );
+         }
+      } else if ( task instanceof FinallyTask ) {
+         if ( finallyTask == null ) {
+            finallyTask = task;
+            return ;
+         } else {
+            throw new BuildException( "Only one Finally allowed per Try." );
+         }
+      }
+      tasks.addElement( task );
+   }
+
+   public void addCatch( CatchTask task ) {
+      addTask( task );
+   }
+   
+   public void addFinally( FinallyTask task ) {
+      addTask( task );
+   }
+
+   /**
+    * A try block may contain several tasks. This parameter determines whether
+    * the block should continue executing tasks following a failed task. The
+    * default is false, and the try block will exit on the first failure. Note
+    * that if set to false and more than one task fails, the "catch" target will
+    * execute for each failed task.
+    *
+    * @param b  if set to false, the try block will execute all tasks in the
+    *      block, regardless of failure of an individual task.
+    */
+   public void setBreak( boolean b ) {
+      doBreak = b;
+   }
+
+
+   /**
+    * If printstacktrace is set to true, this is ignored as the error message is
+    * printed as part of the stack trace. Default is to print the message.
+    *
+    * @param b  Should the error message of a failed task be logged?
+    */
+   public void setPrintmessage( boolean b ) {
+      doPrintMessage = b;
+   }
+   
+   
+   /**
+    * the error message of the exception can be stored as a property   
+    */
+   public void setMessageproperty(String name) {
+      messageProperty = name;  
+   }
+
+
+   /**
+    * Default is to not print the stack trace.
+    *
+    * @param b  Should the stack trace of a failed task be logged?
+    */
+   public void setPrintstacktrace( boolean b ) {
+      doPrintStackTrace = b;
+   }
+
+   /**
+    * the stack trace can be stored as a property   
+    */
+   public void setStacktraceproperty( String name ) {
+      stackTraceProperty = name;
+   }
+
+
+   /**
+    * Try to execute all tasks.
+    *
+    * @exception BuildException  Description of Exception
+    */
+   public void execute() throws BuildException {
+      Throwable be = null;
+      for ( Enumeration e = tasks.elements(); e.hasMoreElements(); ) {
+         Task task = ( Task ) e.nextElement();
+         try {
+            task.perform();
+         } catch ( Throwable throwable ) {
+            be = throwable;
+            if (messageProperty != null){
+               getProject().setProperty(messageProperty, throwable.getMessage());  
+            }
+            if (stackTraceProperty != null) {
+               StringWriter stacktrace = new StringWriter();
+               PrintWriter writer = new PrintWriter( stacktrace, true );
+               throwable.printStackTrace( writer );
+               getProject().setProperty( stackTraceProperty, stacktrace.toString() );
+            }
+            if ( doPrintStackTrace ) {
+               try {
+                  // log a message
+                  log( "Task '" + task.getTaskName() + "' in target '" +
+                        ( task.getOwningTarget() == null ?
+                          "unknown" :
+                          task.getOwningTarget().getName() ) +
+                        "' failed, task stack trace follows:" );
+
+                  // send the stack trace to the log
+                  StringWriter stacktrace = new StringWriter();
+                  PrintWriter writer = new PrintWriter( stacktrace, true );
+                  throwable.printStackTrace( writer );
+                  log( stacktrace.toString() );
+               } catch ( Exception ignored ) {
+                  // don't fail on any exception
+               }
+            }
+            else if ( doPrintMessage ) {
+               try {
+                  // log a message
+                  log( "Task '" + task.getTaskName() + "' in target '" +
+                        ( task.getOwningTarget() == null ?
+                          "unknown" :
+                          task.getOwningTarget().getName() ) +
+                        "' failed, error message is: " + throwable.getMessage() );
+               } catch ( Exception ignored ) {
+                  // don't fail on any exception
+               }
+            }
+
+            // check if there is a nested CatchTask to execute. If the tasks
+            // in the catch throw an exception, catch it so the 'finally' can
+            // execute.
+
+            if ( catchTask != null ) {
+               try {
+                  catchTask.perform();
+               } catch ( Throwable t ) {
+                  if ( finallyTask != null ) {
+                     try {
+                        finallyTask.perform();
+                     } catch ( Exception eeee ) {
+                        throw new BuildException( be.getMessage(), new BuildException( eeee.getMessage(), t ) );
+                     }
+                  } else {
+                     throw new BuildException( be.getMessage(), t );
+                  }
+               }
+            }
+
+            // check if remaining tasks should execute
+            if ( doBreak ) {
+               break;
+            }
+         }
+      }
+
+      // do the finally
+      if ( finallyTask != null ) {
+         finallyTask.perform();
+      }
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/UIDTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/UIDTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/UIDTask.java	(revision 15023)
@@ -0,0 +1,46 @@
+package ise.antelope.tasks;
+
+import ise.antelope.tasks.typedefs.*;
+
+import java.rmi.server.ObjID;
+import java.rmi.server.UID;
+import org.apache.tools.ant.BuildException;
+
+import org.apache.tools.ant.Task;
+
+/**
+ * A task to generate a unique ID.
+ *
+ * @author Dale Anson, danson@germane-software.com
+ * @since Ant 1.6
+ * @version   $Revision: 1.1 $
+ */
+public class UIDTask extends Task {
+
+
+    private String name = null;
+    private boolean asInt = false;
+
+    /**
+     * @param n a name for this UID
+     */
+    public void setName(String n) {
+        name = n;
+    }
+    
+    public void setInt(boolean b) {
+        asInt = b;   
+    }
+
+    /** Generate a unique id and store it in the project with the given name. */
+    public void execute() {
+        if (name == null)
+            throw new BuildException("name attribute cannot be null");
+        if (asInt)
+            getProject().setProperty(name, String.valueOf(new ObjID().hashCode()));
+        else
+            getProject().setProperty(name, new UID().toString());
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Unset.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Unset.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Unset.java	(revision 15023)
@@ -0,0 +1,184 @@
+
+/*
+* Copyright (c) 2001-2004 Ant-Contrib project.  All rights reserved.
+*
+* Licensed 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.
+*/
+package ise.antelope.tasks;
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.util.*;
+import org.apache.tools.ant.*;
+
+/**
+ * Unsets a property.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.1 $
+ * @since     Ant 1.6
+ */
+public class Unset extends Task {
+
+    private String name = null;
+    private File file = null;
+
+    /**
+     * Set the name of the property to unset. Required.
+     *
+     * @param name  the name of the property to unset.
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Sets the file attribute of the Unset object
+     *
+     * @param file  The new file value
+     */
+    public void setFile(File file) {
+        this.file = file;
+    }
+
+    /**
+     * Execute all nested tasks, repeating.
+     *
+     * @exception BuildException  Description of the Exception
+     */
+    public void execute() throws BuildException {
+        if (name == null && file == null)
+            throw new BuildException("Must have either the 'name' or 'file' attribute with 'unset'.");
+        if (name != null && name.equals(""))
+            throw new BuildException("Must have non-empty 'name' attribute with 'unset'.");
+        
+        Properties file_props = null;
+        if (file != null) {
+            file_props = new Properties();
+            try {
+                file_props.load(new FileInputStream(file));
+            }
+            catch(FileNotFoundException fnfe) {
+                throw new BuildException("File not found: " + file.toString());   
+            }
+            catch (Exception e) {
+                throw new BuildException(e.getMessage());
+            }
+        }
+
+        Hashtable properties = null;
+        // Ant 1.5 stores properties in Project, remove project property
+        try {
+            properties = (Hashtable) getValue(getProject(), "properties");
+            removeProperties(properties, name, file_props);
+        }
+        catch (Exception ignored) {
+            // ignore, could be Ant 1.6
+        }
+        // Ant 1.5 stores properties in Project, remove user properties
+        try {
+            properties = (Hashtable) getValue(getProject(), "userProperties");
+            removeProperties(properties, name, file_props);
+        }
+        catch (Exception ignored) {
+            // ignore, could be Ant 1.6
+        }
+
+        // Ant 1.6 uses a PropertyHelper, can check for it by checking for a
+        // reference to "ant.PropertyHelper"
+        try {
+            Object property_helper = getProject().getReference("ant.PropertyHelper");
+            if (property_helper != null) {
+                // remove project properties
+                try {
+                    properties = (Hashtable) getValue(property_helper, "properties");
+                    removeProperties(properties, name, file_props);
+                }
+                catch (Exception ignored) {
+                }
+                // remove user properties
+                try {
+                    properties = (Hashtable) getValue(property_helper, "userProperties");
+                    removeProperties(properties, name, file_props);
+                }
+                catch (Exception ignored) {
+                }
+            }
+        }
+        catch (Exception ignored) {
+        }
+    }
+
+    /**
+     * Description of the Method
+     *
+     * @param properties
+     * @param name
+     * @param file_props
+     */
+    private void removeProperties(Hashtable properties, String name, Properties file_props) {
+        if (properties != null) {
+            if (name != null)
+                properties.remove(name);
+            else if (file_props != null) {
+                Enumeration keys = file_props.keys();
+                while (keys.hasMoreElements()) {
+                    String key = (String) keys.nextElement();
+                    properties.remove(key);
+                }
+            }
+        }
+    }
+
+    /**
+     * Get a field from a class. Works up through the inheritance chain until
+     * the field is found.
+     *
+     * @param fieldName                 The field to find
+     * @param someClass
+     * @return                          The field
+     * @exception NoSuchFieldException  Darn, no such field.
+     */
+    private Field getField(Class someClass, String fieldName) throws NoSuchFieldException {
+        if (someClass == null) {
+            throw new NoSuchFieldException("Invalid field : " + fieldName);
+        }
+        try {
+            return someClass.getDeclaredField(fieldName);
+        }
+        catch (NoSuchFieldException e) {
+            return getField(someClass.getSuperclass(), fieldName);
+        }
+    }
+
+
+    /**
+     * Get a value from a field in an object.
+     *
+     * @param instance                    the object instance
+     * @param fieldName                   the name of the field
+     * @return                            an object representing the value of
+     *      the field
+     * @exception IllegalAccessException  foiled by the security manager
+     * @exception NoSuchFieldException    Darn, no such field.
+     */
+    private Object getValue(Object instance, String fieldName)
+             throws IllegalAccessException, NoSuchFieldException {
+        Field field = getField(instance.getClass(), fieldName);
+        field.setAccessible(true);
+        return field.get(instance);
+    }
+
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Variable.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Variable.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/Variable.java	(revision 15023)
@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2001-2004 Ant-Contrib project.  All rights reserved.
+ *
+ * Licensed 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.
+ */
+package ise.antelope.tasks;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.apache.tools.ant.Task;
+
+/**
+ * Similar to Property, but this property is mutable. In fact, much of the code
+ * in this class is copy and paste from Property. In general, the standard Ant
+ * property should be used, but occasionally it is useful to use a mutable
+ * property.
+ * <p>
+ * This used to be a nice little task that took advantage of what is probably
+ * a flaw in the Ant Project API -- setting a "user" property programatically
+ * causes the project to overwrite a previously set property. Now this task
+ * has become more violent and employs a technique known as "object rape" to
+ * directly access the Project's private property hashtable.
+ * <p>Developed for use with Antelope, migrated to ant-contrib Oct 2003.
+ *
+ * @author   Dale Anson, danson@germane-software.com
+ * @since    Ant 1.5
+ * @version  $Revision: 1.3 $
+ */
+public class Variable extends Task {
+
+   // attribute storage
+   private String value = "";
+   private String name = null;
+   private File file = null;
+   private boolean remove = false;
+
+
+   /**
+    * Set the name of the property. Required unless 'file' is used.
+    *
+    * @param name  the name of the property.
+    */
+   public void setName( String name ) {
+      this.name = name;
+   }
+
+
+   /**
+    * Set the value of the property. Optional, defaults to "".
+    *
+    * @param value  the value of the property.
+    */
+   public void setValue( String value ) {
+      this.value = value;
+   }
+
+
+   /**
+    * Set the name of a file to read properties from. Optional.
+    *
+    * @param file  the file to read properties from.
+    */
+   public void setFile( File file ) {
+      this.file = file;
+   }
+
+   /**
+    * Determines whether the property should be removed from the project.
+    * Default is false. Once  removed, conditions that check for property
+    * existence will find this property does not exist.
+    *
+    * @param b set to true to remove the property from the project. 
+    */
+   public void setUnset( boolean b ) {
+      remove = b;
+   }
+
+
+   /**
+    * Execute this task.
+    *
+    * @exception BuildException  Description of the Exception
+    */
+   public void execute() throws BuildException {
+      if ( remove ) {
+         if ( name == null || name.equals( "" ) ) {
+            throw new BuildException( "The 'name' attribute is required with 'unset'." );
+         }
+         removeProperty( name );
+         return ;
+      }
+      if ( file == null ) {
+         // check for the required name attribute
+         if ( name == null || name.equals( "" ) ) {
+            throw new BuildException( "The 'name' attribute is required." );
+         }
+
+         // check for the required value attribute
+         if ( value == null ) {
+            value = "";
+         }
+
+         // adjust the property value if necessary -- is this necessary?
+         // Doesn't Ant do this automatically?
+         value = getProject().replaceProperties( value );
+
+         // set the property
+         forceProperty( name, value );
+      }
+      else {
+         if ( !file.exists() ) {
+            throw new BuildException( file.getAbsolutePath() + " does not exists." );
+         }
+         loadFile( file );
+      }
+   }
+
+   /**
+    * Remove a property from the project's property table and the userProperty table.
+    * Note that Ant 1.6 uses a helper for this.
+    */
+   private void removeProperty( String name ) {
+      Hashtable properties = null;
+      // Ant 1.5 stores properties in Project
+      try {
+         properties = ( Hashtable ) getValue( getProject(), "properties" );
+         if ( properties != null ) {
+            properties.remove( name );
+         }
+      }
+      catch ( Exception e ) {
+         // ignore, could be Ant 1.6
+      }
+      try {
+         properties = ( Hashtable ) getValue( getProject(), "userProperties" );
+         if ( properties != null ) {
+            properties.remove( name );
+         }
+      }
+      catch ( Exception e ) {
+         // ignore, could be Ant 1.6
+      }
+
+      // Ant 1.6 uses a PropertyHelper, can check for it by checking for a
+      // reference to "ant.PropertyHelper"
+      try {
+         Object property_helper = getProject().getReference( "ant.PropertyHelper" );
+         if ( property_helper != null ) {
+            try {
+               properties = ( Hashtable ) getValue( property_helper, "properties" );
+               if ( properties != null ) {
+                  properties.remove( name );
+               }
+            }
+            catch ( Exception e ) {
+               // ignore
+            }
+            try {
+               properties = ( Hashtable ) getValue( property_helper, "userProperties" );
+               if ( properties != null ) {
+                  properties.remove( name );
+               }
+            }
+            catch ( Exception e ) {
+               // ignore
+            }
+         }
+      }
+      catch ( Exception e ) {
+         // ignore, could be Ant 1.5
+      }
+   }
+
+   private void forceProperty( String name, String value ) {
+      try {
+         Hashtable properties = ( Hashtable ) getValue( getProject(), "properties" );
+         if ( properties == null ) {
+            getProject().setUserProperty( name, value );
+         }
+         else {
+            properties.put( name, value );
+         }
+      }
+      catch ( Exception e ) {
+         getProject().setUserProperty( name, value );
+      }
+   }
+
+
+   /**
+    * Object rape: fondle the private parts of an object without it's
+    * permission.
+    *
+    * @param thisClass                 The class to rape.
+    * @param fieldName                 The field to fondle
+    * @return                          The field value
+    * @exception NoSuchFieldException  Darn, nothing to fondle.
+    */
+   private Field getField( Class thisClass, String fieldName ) throws NoSuchFieldException {
+      if ( thisClass == null ) {
+         throw new NoSuchFieldException( "Invalid field : " + fieldName );
+      }
+      try {
+         return thisClass.getDeclaredField( fieldName );
+      }
+      catch ( NoSuchFieldException e ) {
+         return getField( thisClass.getSuperclass(), fieldName );
+      }
+   }
+
+
+   /**
+    * Object rape: fondle the private parts of an object without it's
+    * permission.
+    *
+    * @param instance                    the object instance
+    * @param fieldName                   the name of the field
+    * @return                            an object representing the value of the
+    *      field
+    * @exception IllegalAccessException  foiled by the security manager
+    * @exception NoSuchFieldException    Darn, nothing to fondle
+    */
+   private Object getValue( Object instance, String fieldName )
+   throws IllegalAccessException, NoSuchFieldException {
+      Field field = getField( instance.getClass(), fieldName );
+      field.setAccessible( true );
+      return field.get( instance );
+   }
+
+
+   /**
+    * load variables from a file
+    *
+    * @param file                file to load
+    * @exception BuildException  Description of the Exception
+    */
+   private void loadFile( File file ) throws BuildException {
+      Properties props = new Properties();
+      try {
+         if ( file.exists() ) {
+            FileInputStream fis = new FileInputStream( file );
+            try {
+               props.load( fis );
+            }
+            finally {
+               if ( fis != null ) {
+                  fis.close();
+               }
+            }
+            addProperties( props );
+         }
+         else {
+            log( "Unable to find property file: " + file.getAbsolutePath(),
+                 Project.MSG_VERBOSE );
+         }
+      }
+      catch ( IOException ex ) {
+         throw new BuildException( ex, location );
+      }
+   }
+
+
+   /**
+    * iterate through a set of properties, resolve them, then assign them
+    *
+    * @param props  The feature to be added to the Properties attribute
+    */
+   protected void addProperties( Properties props ) {
+      resolveAllProperties( props );
+      Enumeration e = props.keys();
+      while ( e.hasMoreElements() ) {
+         String name = ( String ) e.nextElement();
+         String value = props.getProperty( name );
+         forceProperty( name, value );
+      }
+   }
+
+
+   /**
+    * resolve properties inside a properties hashtable
+    *
+    * @param props               properties object to resolve
+    * @exception BuildException  Description of the Exception
+    */
+   private void resolveAllProperties( Properties props ) throws BuildException {
+      for ( Enumeration e = props.keys(); e.hasMoreElements(); ) {
+         String name = ( String ) e.nextElement();
+         String value = props.getProperty( name );
+
+         boolean resolved = false;
+         while ( !resolved ) {
+            Vector fragments = new Vector();
+            Vector propertyRefs = new Vector();
+            ProjectHelper.parsePropertyString( value, fragments,
+                  propertyRefs );
+
+            resolved = true;
+            if ( propertyRefs.size() != 0 ) {
+               StringBuffer sb = new StringBuffer();
+               Enumeration i = fragments.elements();
+               Enumeration j = propertyRefs.elements();
+               while ( i.hasMoreElements() ) {
+                  String fragment = ( String ) i.nextElement();
+                  if ( fragment == null ) {
+                     String propertyName = ( String ) j.nextElement();
+                     if ( propertyName.equals( name ) ) {
+                        throw new BuildException( "Property " + name
+                              + " was circularly "
+                              + "defined." );
+                     }
+                     fragment = getProject().getProperty( propertyName );
+                     if ( fragment == null ) {
+                        if ( props.containsKey( propertyName ) ) {
+                           fragment = props.getProperty( propertyName );
+                           resolved = false;
+                        }
+                        else {
+                           fragment = "${" + propertyName + "}";
+                        }
+                     }
+                  }
+                  sb.append( fragment );
+               }
+               value = sb.toString();
+               props.put( name, value );
+            }
+         }
+      }
+   }
+
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/XmlPropertyTask.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/XmlPropertyTask.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/XmlPropertyTask.java	(revision 15023)
@@ -0,0 +1,728 @@
+/*
+* Copyright  2002-2004 The Apache Software Foundation
+*
+*  Licensed 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.
+*
+*/
+
+package ise.antelope.tasks;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Hashtable;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.ParserConfigurationException;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.XMLCatalog;
+import org.apache.tools.ant.util.FileUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+import org.xml.sax.EntityResolver;
+
+/**
+ * danson: modified from original to allow setting xml as a string rather than
+ * a file.
+ * <p>
+ * Loads property values from a valid XML file, generating the
+ * property names from the file's element and attribute names.
+ *
+ * <p>Example:</p>
+ * <pre>
+ *   &lt;root-tag myattr="true"&gt;
+ *     &lt;inner-tag someattr="val"&gt;Text&lt;/inner-tag&gt;
+ *     &lt;a2&gt;&lt;a3&gt;&lt;a4&gt;false&lt;/a4&gt;&lt;/a3&gt;&lt;/a2&gt;
+ *     &lt;x&gt;x1&lt;/x&gt;
+ *     &lt;x&gt;x2&lt;/x&gt;
+ *   &lt;/root-tag&gt;
+ *</pre>
+ *
+ * <p>this generates the following properties:</p>
+ *
+ * <pre>
+ *  root-tag(myattr)=true
+ *  root-tag.inner-tag=Text
+ *  root-tag.inner-tag(someattr)=val
+ *  root-tag.a2.a3.a4=false
+ *  root-tag.x=x1,x2
+ * </pre>
+ *
+ * <p>The <i>collapseAttributes</i> property of this task can be set
+ * to true (the default is false) which will instead result in the
+ * following properties (note the difference in names of properties
+ * corresponding to XML attributes):</p>
+ *
+ * <pre>
+ *  root-tag.myattr=true
+ *  root-tag.inner-tag=Text
+ *  root-tag.inner-tag.someattr=val
+ *  root-tag.a2.a3.a4=false
+ *  root-tag.x=x1,x2
+ * </pre>
+ *
+ * <p>Optionally, to more closely mirror the abilities of the Property
+ * task, a selected set of attributes can be treated specially.  To
+ * enable this behavior, the "semanticAttributes" property of this task
+ * must be set to true (it defaults to false).  If this attribute is
+ * specified, the following attributes take on special meaning
+ * (setting this to true implicitly sets collapseAttributes to true as
+ * well):</p>
+ *
+ * <ul>
+ *  <li><b>value</b>: Identifies a text value for a property.</li>
+ *  <li><b>location</b>: Identifies a file location for a property.</li>
+ *  <li><b>id</b>: Sets an id for a property</li>
+ *  <li><b>refid</b>: Sets a property to the value of another property
+ *       based upon the provided id</li>
+ *  <li><b>pathid</b>: Defines a path rather than a property with
+ *       the given id.</li>
+ * </ul>
+ *
+ * <p>For example, with keepRoot = false, the following properties file:</p>
+ *
+ * <pre>
+ * &lt;root-tag&gt;
+ *   &lt;build&gt;
+ *   &lt;build folder="build"&gt;
+ *     &lt;classes id="build.classes" location="${build.folder}/classes"/&gt;
+ *     &lt;reference refid="build.classes"/&gt;
+ *   &lt;/build&gt;
+ *   &lt;compile&gt;
+ *     &lt;classpath pathid="compile.classpath"&gt;
+ *       &lt;pathelement location="${build.classes}"/&gt;
+ *     &lt;/classpath&gt;
+ *   &lt;/compile&gt;
+ *   &lt;run-time&gt;
+ *     &lt;jars&gt;*.jar&lt;/jars&gt;
+ *     &lt;classpath pathid="run-time.classpath"&gt;
+ *       &lt;path refid="compile.classpath"/&gt;
+ *       &lt;pathelement path="${run-time.jars}"/&gt;
+ *     &lt;/classpath&gt;
+ *   &lt;/run-time&gt;
+ * &lt;/root-tag&gt;
+ * </pre>
+ *
+ * <p>is equivalent to the following entries in a build file:</p>
+ *
+ * <pre>
+ * &lt;property name="build" location="build"/&gt;
+ * &lt;property name="build.classes" location="${build.location}/classes"/&gt;
+ * &lt;property name="build.reference" refid="build.classes"/&gt;
+ *
+ * &lt;property name="run-time.jars" value="*.jar/&gt;
+ *
+ * &lt;classpath id="compile.classpath"&gt;
+ *   &lt;pathelement location="${build.classes}"/&gt;
+ * &lt;/classpath&gt;
+ *
+ * &lt;classpath id="run-time.classpath"&gt;
+ *   &lt;path refid="compile.classpath"/&gt;
+ *   &lt;pathelement path="${run-time.jars}"/&gt;
+ * &lt;/classpath&gt;
+ * </pre>
+ *
+ * <p> This task <i>requires</i> the following attributes:</p>
+ *
+ * <ul>
+ * <li><b>file</b>: The name of the file to load.</li>
+ * </ul>
+ *
+ * <p>This task supports the following attributes:</p>
+ *
+ * <ul>
+ * <li><b>prefix</b>: Optionally specify a prefix applied to
+ *     all properties loaded.  Defaults to an empty string.</li>
+ * <li><b>keepRoot</b>: Indicate whether the root xml element
+ *     is kept as part of property name.  Defaults to true.</li>
+ * <li><b>validate</b>: Indicate whether the xml file is validated.
+ *     Defaults to false.</li>
+ * <li><b>collapseAttributes</b>: Indicate whether attributes are
+ *     stored in property names with parens or with period
+ *     delimiters.  Defaults to false, meaning properties
+ *     are stored with parens (i.e., foo(attr)).</li>
+ * <li><b>semanticAttributes</b>: Indicate whether attributes
+ *     named "location", "value", "refid" and "path"
+ *     are interpreted as ant properties.  Defaults
+ *     to false.</li>
+ * <li><b>rootDirectory</b>: Indicate the directory to use
+ *     as the root directory for resolving location
+ *     properties.  Defaults to the directory
+ *     of the project using the task.</li>
+ * <li><b>includeSemanticAttribute</b>: Indicate whether to include
+ *     the semantic attribute ("location" or "value") as
+ *     part of the property name.  Defaults to false.</li>
+ * </ul>
+ *
+ * @ant.task name="xmlproperty" category="xml"
+ */
+
+public class XmlPropertyTask extends org.apache.tools.ant.Task {
+
+    private File src;
+    private String xml = null;
+    private String prefix = "";
+    private boolean keepRoot = true;
+    private boolean validate = false;
+    private boolean collapseAttributes = false;
+    private boolean semanticAttributes = false;
+    private boolean includeSemanticAttribute = false;
+    private File rootDirectory = null;
+    private FileUtils fileUtils = FileUtils.newFileUtils();
+    private Hashtable addedAttributes = new Hashtable();
+    private XMLCatalog xmlCatalog = new XMLCatalog();
+
+    private static final String ID = "id";
+    private static final String REF_ID = "refid";
+    private static final String LOCATION = "location";
+    private static final String VALUE = "value";
+    private static final String PATH = "path";
+    private static final String PATHID = "pathid";
+    private static final String[] ATTRIBUTES = new String[] {
+                ID, REF_ID, LOCATION, VALUE, PATH, PATHID
+            };
+
+    /**
+     * Constructor.
+     */
+    public XmlPropertyTask() {
+        super();
+    }
+
+    /**
+     * Initializes the task.
+     */
+
+    public void init() {
+        super.init();
+        xmlCatalog.setProject( getProject() );
+    }
+
+
+    /**
+     * @return the xmlCatalog as the entityresolver.
+     */
+    protected EntityResolver getEntityResolver() {
+        return xmlCatalog;
+    }
+
+    /**
+     * Run the task.
+     * @throws BuildException The exception raised during task execution.
+     * @todo validate the source file is valid before opening, print a better error message
+     * @todo add a verbose level log message listing the name of the file being loaded
+     */
+    public void execute()
+    throws BuildException {
+
+        try {
+            InputStream is = getInputStream();
+            if ( is == null ) {
+                String msg = "XmlProperty task requires a file or xml attribute";
+                throw new BuildException( msg );
+            }
+
+            log( "Loading " + ( src != null ? src.getAbsolutePath() : "xml properties" ), Project.MSG_VERBOSE );
+
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            factory.setValidating( validate );
+            factory.setNamespaceAware( false );
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            builder.setEntityResolver( getEntityResolver() );
+            Document document = builder.parse( is );
+            Element topElement = document.getDocumentElement();
+
+            // Keep a hashtable of attributes added by this task.
+            // This task is allow to override its own properties
+            // but not other properties.  So we need to keep track
+            // of which properties we've added.
+            addedAttributes = new Hashtable();
+
+            if ( keepRoot ) {
+                addNodeRecursively( topElement, prefix, null );
+            }
+            else {
+                NodeList topChildren = topElement.getChildNodes();
+                int numChildren = topChildren.getLength();
+                for ( int i = 0; i < numChildren; i++ ) {
+                    addNodeRecursively( topChildren.item( i ), prefix, null );
+                }
+            }
+
+        }
+        catch ( SAXException sxe ) {
+            // Error generated during parsing
+            Exception x = sxe;
+            if ( sxe.getException() != null ) {
+                x = sxe.getException();
+            }
+            throw new BuildException( x );
+
+        }
+        catch ( ParserConfigurationException pce ) {
+            // Parser with specified options can't be built
+            throw new BuildException( pce );
+        }
+        catch ( IOException ioe ) {
+            // I/O error
+            throw new BuildException( ioe );
+        }
+    }
+
+    private InputStream getInputStream() throws IOException {
+        if ( src != null && src.exists() )
+            return new BufferedInputStream( new FileInputStream( src ) );
+        else if ( xml != null )
+            return new BufferedInputStream( new ByteArrayInputStream( xml.getBytes() ));
+        else
+            return null;
+    }
+
+    /** Iterate through all nodes in the tree. */
+    private void addNodeRecursively( Node node, String prefix,
+            Object container ) {
+
+        // Set the prefix for this node to include its tag name.
+        String nodePrefix = prefix;
+        if ( node.getNodeType() != Node.TEXT_NODE ) {
+            if ( prefix.trim().length() > 0 ) {
+                nodePrefix += ".";
+            }
+            nodePrefix += node.getNodeName();
+        }
+
+        // Pass the container to the processing of this node,
+        Object nodeObject = processNode( node, nodePrefix, container );
+
+        // now, iterate through children.
+        if ( node.hasChildNodes() ) {
+
+            NodeList nodeChildren = node.getChildNodes();
+            int numChildren = nodeChildren.getLength();
+
+            for ( int i = 0; i < numChildren; i++ ) {
+                // For each child, pass the object added by
+                // processNode to its children -- in other word, each
+                // object can pass information along to its children.
+                addNodeRecursively( nodeChildren.item( i ), nodePrefix,
+                        nodeObject );
+            }
+        }
+    }
+
+    void addNodeRecursively( org.w3c.dom.Node node, String prefix ) {
+        addNodeRecursively( node, prefix, null );
+    }
+
+    /**
+     * Process the given node, adding any required attributes from
+     * this child node alone -- but <em>not</em> processing any
+     * children.
+     *
+     * @param node the XML Node to parse
+     * @param prefix A string to prepend to any properties that get
+     * added by this node.
+     * @param container Optionally, an object that a parent node
+     * generated that this node might belong to.  For example, this
+     * node could be within a node that generated a Path.
+     * @return the Object created by this node.  Generally, this is
+     * either a String if this node resulted in setting an attribute,
+     * or a Path.
+     */
+    public Object processNode ( Node node, String prefix, Object container ) {
+
+        // Parse the attribute(s) and text of this node, adding
+        // properties for each.
+        // if the "path" attribute is specified, then return the created path
+        // which will be passed to the children of this node.
+        Object addedPath = null;
+
+        // The value of an id attribute of this node.
+        String id = null;
+
+        if ( node.hasAttributes() ) {
+
+            NamedNodeMap nodeAttributes = node.getAttributes();
+
+            // Is there an id attribute?
+            Node idNode = nodeAttributes.getNamedItem( ID );
+            id = ( semanticAttributes && idNode != null
+                   ? idNode.getNodeValue() : null );
+
+            // Now, iterate through the attributes adding them.
+            for ( int i = 0; i < nodeAttributes.getLength(); i++ ) {
+
+                Node attributeNode = nodeAttributes.item( i );
+
+                if ( !semanticAttributes ) {
+                    String attributeName = getAttributeName( attributeNode );
+                    String attributeValue = getAttributeValue( attributeNode );
+                    addProperty( prefix + attributeName, attributeValue, null );
+                }
+                else {
+
+                    String nodeName = attributeNode.getNodeName();
+                    String attributeValue = getAttributeValue( attributeNode );
+
+                    Path containingPath = ( container != null
+                            && container instanceof Path ? ( Path ) container : null );
+
+                    /*
+                     * The main conditional logic -- if the attribute
+                     * is somehow "special" (i.e., it has known
+                     * semantic meaning) then deal with it
+                     * appropriately.
+                     */
+                    if ( nodeName.equals( ID ) ) {
+                        // ID has already been found above.
+                        continue;
+                    }
+                    else if ( containingPath != null
+                            && nodeName.equals( PATH ) ) {
+                        // A "path" attribute for a node within a Path object.
+                        containingPath.setPath( attributeValue );
+                    }
+                    else if ( container instanceof Path
+                            && nodeName.equals( REF_ID ) ) {
+                        // A "refid" attribute for a node within a Path object.
+                        containingPath.setPath( attributeValue );
+                    }
+                    else if ( container instanceof Path
+                            && nodeName.equals( LOCATION ) ) {
+                        // A "location" attribute for a node within a
+                        // Path object.
+                        containingPath.setLocation( resolveFile( attributeValue ) );
+                    }
+                    else if ( nodeName.equals( PATHID ) ) {
+                        // A node identifying a new path
+                        if ( container != null ) {
+                            throw new BuildException( "XmlProperty does not "
+                                    + "support nested paths" );
+                        }
+
+                        addedPath = new Path( getProject() );
+                        getProject().addReference( attributeValue, addedPath );
+                    }
+                    else {
+                        // An arbitrary attribute.
+                        String attributeName = getAttributeName( attributeNode );
+                        addProperty( prefix + attributeName, attributeValue, id );
+                    }
+                }
+            }
+        }
+
+        String nodeText = null;
+        if ( node.getNodeType() == Node.TEXT_NODE ) {
+            // For the text node, add a property.
+            nodeText = getAttributeValue( node );
+        }
+        else if ( ( node.getNodeType() == Node.ELEMENT_NODE )
+                && ( node.getChildNodes().getLength() == 1 )
+                && ( node.getFirstChild().getNodeType() == Node.CDATA_SECTION_NODE ) ) {
+
+            nodeText = node.getFirstChild().getNodeValue();
+        }
+
+        if ( nodeText != null ) {
+            // If the containing object was a String, then use it as the ID.
+            if ( semanticAttributes && id == null
+                    && container instanceof String ) {
+                id = ( String ) container;
+            }
+
+            if ( nodeText.trim().length() != 0 ) {
+                addProperty( prefix, nodeText, id );
+            }
+        }
+
+        // Return the Path we added or the ID of this node for
+        // children to reference if needed.  Path objects are
+        // definitely used by child path elements, and ID may be used
+        // for a child text node.
+        return ( addedPath != null ? addedPath : id );
+    }
+
+    /**
+     * Actually add the given property/value to the project
+     * after writing a log message.
+     */
+    private void addProperty ( String name, String value, String id ) {
+        String msg = name + ":" + value;
+        if ( id != null ) {
+            msg += ( "(id=" + id + ")" );
+        }
+        log( msg, Project.MSG_DEBUG );
+
+        if ( addedAttributes.containsKey( name ) ) {
+            // If this attribute was added by this task, then
+            // we append this value to the existing value.
+            // We use the setProperty method which will
+            // forcibly override the property if it already exists.
+            // We need to put these properties into the project
+            // when we read them, though (instead of keeping them
+            // outside of the project and batch adding them at the end)
+            // to allow other properties to reference them.
+            value = ( String ) addedAttributes.get( name ) + "," + value;
+            getProject().setProperty( name, value );
+        }
+        else {
+            getProject().setNewProperty( name, value );
+        }
+        addedAttributes.put( name, value );
+        if ( id != null ) {
+            getProject().addReference( id, value );
+        }
+    }
+
+    /**
+     * Return a reasonable attribute name for the given node.
+     * If we are using semantic attributes or collapsing
+     * attributes, the returned name is ".nodename".
+     * Otherwise, we return "(nodename)".  This is long-standing
+     * (and default) &lt;xmlproperty&gt; behavior.
+     */
+    private String getAttributeName ( Node attributeNode ) {
+        String attributeName = attributeNode.getNodeName();
+
+        if ( semanticAttributes ) {
+            // Never include the "refid" attribute as part of the
+            // attribute name.
+            if ( attributeName.equals( REF_ID ) ) {
+                return "";
+                // Otherwise, return it appended unless property to hide it is set.
+            }
+            else if ( !isSemanticAttribute( attributeName )
+                    || includeSemanticAttribute ) {
+                return "." + attributeName;
+            }
+            else {
+                return "";
+            }
+        }
+        else if ( collapseAttributes ) {
+            return "." + attributeName;
+        }
+        else {
+            return "(" + attributeName + ")";
+        }
+    }
+
+    /**
+     * Return whether the provided attribute name is recognized or not.
+     */
+    private static boolean isSemanticAttribute ( String attributeName ) {
+        for ( int i = 0; i < ATTRIBUTES.length; i++ ) {
+            if ( attributeName.equals( ATTRIBUTES[ i ] ) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Return the value for the given attribute.
+     * If we are not using semantic attributes, its just the
+     * literal string value of the attribute.
+     *
+     * <p>If we <em>are</em> using semantic attributes, then first
+     * dependent properties are resolved (i.e., ${foo} is resolved
+     * based on the foo property value), and then an appropriate data
+     * type is used.  In particular, location-based properties are
+     * resolved to absolute file names.  Also for refid values, look
+     * up the referenced object from the project.</p>
+     */
+    private String getAttributeValue ( Node attributeNode ) {
+        String nodeValue = attributeNode.getNodeValue().trim();
+        if ( semanticAttributes ) {
+            String attributeName = attributeNode.getNodeName();
+            nodeValue = getProject().replaceProperties( nodeValue );
+            if ( attributeName.equals( LOCATION ) ) {
+                File f = resolveFile( nodeValue );
+                return f.getPath();
+            }
+            else if ( attributeName.equals( REF_ID ) ) {
+                Object ref = getProject().getReference( nodeValue );
+                if ( ref != null ) {
+                    return ref.toString();
+                }
+            }
+        }
+        return nodeValue;
+    }
+
+    /**
+     * The XML file to parse; required.
+     * @param src the file to parse
+     */
+    public void setFile( File src ) {
+        this.src = src;
+    }
+
+    public void setXml( String xml ) {
+        this.xml = xml;
+    }
+
+    /**
+     * the prefix to prepend to each property
+     * @param prefix the prefix to prepend to each property
+     */
+    public void setPrefix( String prefix ) {
+        this.prefix = prefix.trim();
+    }
+
+    /**
+     * flag to include the xml root tag as a
+     * first value in the property name; optional,
+     * default is true
+     * @param keepRoot if true (default), include the xml root tag
+     */
+    public void setKeeproot( boolean keepRoot ) {
+        this.keepRoot = keepRoot;
+    }
+
+    /**
+     * flag to validate the XML file; optional, default false
+     * @param validate if true validate the XML file, default false
+     */
+    public void setValidate( boolean validate ) {
+        this.validate = validate;
+    }
+
+    /**
+     * flag to treat attributes as nested elements;
+     * optional, default false
+     * @param collapseAttributes if true treat attributes as nested elements
+     */
+    public void setCollapseAttributes( boolean collapseAttributes ) {
+        this.collapseAttributes = collapseAttributes;
+    }
+
+    /**
+     * Attribute to enable special handling of attributes - see ant manual.
+     * @param semanticAttributes if true enable the special handling.
+     */
+    public void setSemanticAttributes( boolean semanticAttributes ) {
+        this.semanticAttributes = semanticAttributes;
+    }
+
+    /**
+     * The directory to use for resolving file references.
+     * Ignored if semanticAttributes is not set to true.
+     * @param rootDirectory the directory.
+     */
+    public void setRootDirectory( File rootDirectory ) {
+        this.rootDirectory = rootDirectory;
+    }
+
+    /**
+     * Include the semantic attribute name as part of the property name.
+     * Ignored if semanticAttributes is not set to true.
+     * @param includeSemanticAttribute if true include the sematic attribute
+     *                                 name.
+     */
+    public void setIncludeSemanticAttribute( boolean includeSemanticAttribute ) {
+        this.includeSemanticAttribute = includeSemanticAttribute;
+    }
+
+    /**
+     * add an XMLCatalog as a nested element; optional.
+     * @param catalog the XMLCatalog to use
+     */
+    public void addConfiguredXMLCatalog( XMLCatalog catalog ) {
+        xmlCatalog.addConfiguredXMLCatalog( catalog );
+    }
+
+    /* Expose members for extensibility */
+
+    /**
+     * @return the file attribute.
+     */
+    protected File getFile () {
+        return this.src;
+    }
+
+    protected String getXML() {
+        return this.xml;
+    }
+
+    /**
+     * @return the prefix attribute.
+     */
+    protected String getPrefix () {
+        return this.prefix;
+    }
+
+    /**
+     * @return the keeproot attribute.
+     */
+    protected boolean getKeeproot () {
+        return this.keepRoot;
+    }
+
+    /**
+     * @return the validate attribute.
+     */
+    protected boolean getValidate () {
+        return this.validate;
+    }
+
+    /**
+     * @return the collapse attributes attribute.
+     */
+    protected boolean getCollapseAttributes () {
+        return this.collapseAttributes;
+    }
+
+    /**
+     * @return the semantic attributes attribute.
+     */
+    protected boolean getSemanticAttributes () {
+        return this.semanticAttributes;
+    }
+
+    /**
+     * @return the root directory attribute.
+     */
+    protected File getRootDirectory () {
+        return this.rootDirectory;
+    }
+
+    /**
+     * @return the include semantic attribute.
+     */
+    protected boolean getIncludeSementicAttribute () {
+        return this.includeSemanticAttribute;
+    }
+
+    /**
+     * Let project resolve the file - or do it ourselves if
+     * rootDirectory has been set.
+     */
+    private File resolveFile( String fileName ) {
+        if ( rootDirectory == null ) {
+            return getProject().resolveFile( fileName );
+        }
+        return fileUtils.resolveFile( rootDirectory, fileName );
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelope.taskdefs
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelope.taskdefs	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelope.taskdefs	(revision 15023)
@@ -0,0 +1,75 @@
+antcallback=ise.antelope.tasks.AntCallBack
+antfetch=ise.antelope.tasks.AntFetch
+assert=ise.antelope.tasks.Assert
+bool=ise.antelope.tasks.BooleanConditionTask
+break=ise.antelope.tasks.Break
+call=ise.antelope.tasks.Call
+case=ise.antelope.tasks.Case
+catch=ise.antelope.tasks.CatchTask
+default=ise.antelope.tasks.DefaultCase
+else=ise.antelope.tasks.ElseTask
+fileutil=ise.antelope.tasks.FileUtilTask
+finally=ise.antelope.tasks.FinallyTask
+find=ise.antelope.tasks.Find
+foreach=ise.antelope.tasks.Foreach
+grep=ise.antelope.tasks.Find
+hostname=ise.antelope.tasks.HostnameTask
+if=ise.antelope.tasks.IfTask
+limit=ise.antelope.tasks.Limit
+math=ise.antelope.tasks.MathTask
+new=ise.antelope.tasks.New
+pw=ise.antelope.tasks.PasswordHandlerTask
+post=ise.antelope.tasks.PostTask
+readlog=ise.antelope.tasks.ReadLog
+repeat=ise.antelope.tasks.Repeat
+split=ise.antelope.tasks.SplitTask
+stopwatch=ise.antelope.tasks.StopWatchTask
+suite=ise.antelope.tasks.Suite
+stringutil=ise.antelope.tasks.StringUtilTask
+switch=ise.antelope.tasks.SwitchTask
+testcase=ise.antelope.tasks.TestCase
+try=ise.antelope.tasks.TryTask
+uid=ise.antelope.tasks.UIDTask
+unset=ise.antelope.tasks.Unset
+until=ise.antelope.tasks.BooleanConditionTask
+var=ise.antelope.tasks.Variable
+xmlprop=ise.antelope.tasks.XmlPropertyTask
+
+prop=ise.antelope.tasks.typedefs.Prop
+
+contains=ise.antelope.tasks.condition.Contains
+datedifference=ise.antelope.tasks.condition.DateTimeDifference
+timedifference=ise.antelope.tasks.condition.DateTimeDifference
+datebefore=ise.antelope.tasks.condition.DateTimeBefore
+timebefore=ise.antelope.tasks.condition.DateTimeBefore
+islessthan=ise.antelope.tasks.condition.IsLessThan
+isgreaterthan=ise.antelope.tasks.condition.IsGreaterThan
+mathequals=ise.antelope.tasks.condition.MathEquals
+endswith=ise.antelope.tasks.condition.EndsWith
+startswith=ise.antelope.tasks.condition.StartsWith
+
+and=ise.antelope.tasks.condition.And
+or=ise.antelope.tasks.condition.Or
+not=ise.antelope.tasks.condition.Not
+
+lowercase=ise.antelope.tasks.typedefs.string.LowerCase
+uppercase=ise.antelope.tasks.typedefs.string.UpperCase
+trim=ise.antelope.tasks.typedefs.string.Trim
+substring=ise.antelope.tasks.typedefs.string.Substring
+replace=ise.antelope.tasks.typedefs.string.Replace
+indexof=ise.antelope.tasks.typedefs.string.IndexOf
+lastindexof=ise.antelope.tasks.typedefs.string.LastIndexOf
+length=ise.antelope.tasks.typedefs.string.Length
+messagebox=ise.antelope.tasks.typedefs.string.MessageBox
+sort=ise.antelope.tasks.typedefs.string.Sort
+
+canread=ise.antelope.tasks.typedefs.file.CanRead
+canwrite=ise.antelope.tasks.typedefs.file.CanWrite
+filecount=ise.antelope.tasks.typedefs.file.FileCount
+filelength=ise.antelope.tasks.typedefs.file.FileLength
+linecount=ise.antelope.tasks.typedefs.file.FileLineCount
+listfiles=ise.antelope.tasks.typedefs.file.FileList
+isdirectory=ise.antelope.tasks.typedefs.file.IsDirectory
+isfile=ise.antelope.tasks.typedefs.file.IsFile
+lastmodified=ise.antelope.tasks.typedefs.file.LastModified
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelopetaskdefs
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelopetaskdefs	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antelopetaskdefs	(revision 15023)
@@ -0,0 +1,59 @@
+antcallback=ise.antelope.tasks.AntCallBack
+antfetch=ise.antelope.tasks.AntFetch
+assert=ise.antelope.tasks.Assert
+bool=ise.antelope.tasks.BooleanConditionTask
+break=ise.antelope.tasks.Break
+call=ise.antelope.tasks.Call
+case=ise.antelope.tasks.Case
+catch=ise.antelope.tasks.CatchTask
+default=ise.antelope.tasks.DefaultCase
+else=ise.antelope.tasks.ElseTask
+finally=ise.antelope.tasks.FinallyTask
+find=ise.antelope.tasks.Find
+foreach=ise.antelope.tasks.Foreach
+grep=ise.antelope.tasks.Find
+if=ise.antelope.tasks.IfTask
+limit=ise.antelope.tasks.Limit
+math=ise.antelope.tasks.MathTask
+new=ise.antelope.tasks.New
+post=ise.antelope.tasks.PostTask
+prop=ise.antelope.tasks.Prop
+readlog=ise.antelope.tasks.ReadLog
+repeat=ise.antelope.tasks.Repeat
+split=ise.antelope.tasks.SplitTask
+stopwatch=ise.antelope.tasks.StopWatchTask
+suite=ise.antelope.tasks.Suite
+stringutil=ise.antelope.tasks.StringUtilTask;
+switch=ise.antelope.tasks.SwitchTask
+testcase=ise.antelope.tasks.TestCase
+try=ise.antelope.tasks.TryTask
+unset=ise.antelope.tasks.Unset;
+until=ise.antelope.tasks.BooleanConditionTask
+var=ise.antelope.tasks.Variable
+
+contains=ise.antelope.tasks.Contains
+datedifference=ise.antelope.tasks.DateTimeDifference
+timedifference=ise.antelope.tasks.DateTimeDifference
+datebefore=ise.antelope.tasks.DateTimeBefore
+timebefore=ise.antelope.tasks.DateTimeBefore
+islessthan=ise.antelope.tasks.IsLessThan
+isgreaterthan=ise.antelope.tasks.IsGreaterThan
+mathequals=ise.antelope.tasks.MathEquals
+endswith=ise.antelope.tasks.EndsWith
+startswith=ise.antelope.tasks.StartsWith
+
+and=ise.antelope.tasks.And
+or=ise.antelope.tasks.Or
+not = ise.antelope.tasks.Not
+
+lowercase=ise.antelope.tasks.typedefs.LowerCase
+uppercase=ise.antelope.tasks.typedefs.UpperCase
+trim=ise.antelope.tasks.typedefs.Trim
+substring=ise.antelope.tasks.typdefs.Substring
+replace=ise.antelope.tasks.typedefs.Replace
+indexof=ise.antelope.tasks.typdefs.IndexOf
+lastindexof=ise.antelope.tasks.typedefs.LastIndexOf
+length=ise.antelope.tasks.typedefs.Length;
+
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antlib.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antlib.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/antlib.xml	(revision 15023)
@@ -0,0 +1,80 @@
+<antlib>
+   <taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack"/>
+   <taskdef name="antfetch" classname="ise.antelope.tasks.AntFetch"/>
+   <taskdef name="assert" classname="ise.antelope.tasks.Assert"/>
+   <taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack"/>
+   <taskdef name="antfetch" classname="ise.antelope.tasks.AntFetch"/>
+   <taskdef name="assert" classname="ise.antelope.tasks.Assert"/>
+   <taskdef name="bool" classname="ise.antelope.tasks.BooleanConditionTask"/>
+   <taskdef name="break" classname="ise.antelope.tasks.Break"/>
+   <taskdef name="call" classname="ise.antelope.tasks.Call"/>
+   <taskdef name="case" classname="ise.antelope.tasks.Case"/>
+   <taskdef name="catch" classname="ise.antelope.tasks.CatchTask"/>
+   <taskdef name="default" classname="ise.antelope.tasks.DefaultCase"/>
+   <taskdef name="else" classname="ise.antelope.tasks.ElseTask"/>
+   <taskdef name="fileutil" classname="ise.antelope.tasks.FileUtilTask"/>
+   <taskdef name="finally" classname="ise.antelope.tasks.FinallyTask"/>
+   <taskdef name="find" classname="ise.antelope.tasks.Find"/>
+   <taskdef name="foreach" classname="ise.antelope.tasks.Foreach"/>
+   <taskdef name="grep" classname="ise.antelope.tasks.Find"/>
+   <taskdef name="hostname" classname="ise.antelope.tasks.HostnameTask"/>
+   <taskdef name="if" classname="ise.antelope.tasks.IfTask"/>
+   <taskdef name="limit" classname="ise.antelope.tasks.Limit"/>
+   <taskdef name="math" classname="ise.antelope.tasks.MathTask"/>
+   <taskdef name="new" classname="ise.antelope.tasks.New"/>
+   <taskdef name="pw" classname="ise.antelope.tasks.PasswordHandlerTask"/>
+   <taskdef name="post" classname="ise.antelope.tasks.PostTask"/>
+   <taskdef name="readlog" classname="ise.antelope.tasks.ReadLog"/>
+   <taskdef name="repeat" classname="ise.antelope.tasks.Repeat"/>
+   <taskdef name="split" classname="ise.antelope.tasks.SplitTask"/>
+   <taskdef name="stopwatch" classname="ise.antelope.tasks.StopWatchTask"/>
+   <taskdef name="suite" classname="ise.antelope.tasks.Suite"/>
+   <taskdef name="stringutil" classname="ise.antelope.tasks.StringUtilTask"/>
+   <taskdef name="switch" classname="ise.antelope.tasks.SwitchTask"/>
+   <taskdef name="testcase" classname="ise.antelope.tasks.TestCase"/>
+   <taskdef name="try" classname="ise.antelope.tasks.TryTask"/>
+   <taskdef name="uid" classname="ise.antelope.tasks.UIDTask"/>
+   <taskdef name="unset" classname="ise.antelope.tasks.Unset"/>
+   <taskdef name="until" classname="ise.antelope.tasks.BooleanConditionTask"/>
+   <taskdef name="var" classname="ise.antelope.tasks.Variable"/>
+   <taskdef name="xmlprop" classname="ise.antelope.tasks.XmlPropertyTask"/>
+   
+   <typedef name="prop" classname="ise.antelope.tasks.typedefs.Prop"/>
+   
+   <typedef name="contains" classname="ise.antelope.tasks.condition.Contains"/>
+   <typedef name="datedifference" classname="ise.antelope.tasks.condition.DateTimeDifference"/>
+   <typedef name="timedifference" classname="ise.antelope.tasks.condition.DateTimeDifference"/>
+   <typedef name="datebefore" classname="ise.antelope.tasks.condition.DateTimeBefore"/>
+   <typedef name="timebefore" classname="ise.antelope.tasks.condition.DateTimeBefore"/>
+   <typedef name="islessthan" classname="ise.antelope.tasks.condition.IsLessThan"/>
+   <typedef name="isgreaterthan" classname="ise.antelope.tasks.condition.IsGreaterThan"/>
+   <typedef name="mathequals" classname="ise.antelope.tasks.condition.MathEquals"/>
+   <typedef name="endswith" classname="ise.antelope.tasks.condition.EndsWith"/>
+   <typedef name="startswith" classname="ise.antelope.tasks.condition.StartsWith"/>
+   
+   <typedef name="and" classname="ise.antelope.tasks.condition.And"/>
+   <typedef name="or" classname="ise.antelope.tasks.condition.Or"/>
+   <typedef name="not" classname="ise.antelope.tasks.condition.Not"/>
+   
+   <typedef name="lowercase" classname="ise.antelope.tasks.typedefs.string.LowerCase"/>
+   <typedef name="uppercase" classname="ise.antelope.tasks.typedefs.string.UpperCase"/>
+   <typedef name="trim" classname="ise.antelope.tasks.typedefs.string.Trim"/>
+   <typedef name="substring" classname="ise.antelope.tasks.typedefs.string.Substring"/>
+   <typedef name="replace" classname="ise.antelope.tasks.typedefs.string.Replace"/>
+   <typedef name="indexof" classname="ise.antelope.tasks.typedefs.string.IndexOf"/>
+   <typedef name="lastindexof" classname="ise.antelope.tasks.typedefs.string.LastIndexOf"/>
+   <typedef name="length" classname="ise.antelope.tasks.typedefs.string.Length"/>
+   <typedef name="messagebox" classname="ise.antelope.tasks.typedefs.string.MessageBox"/>
+   <typedef name="sort" classname="ise.antelope.tasks.typedefs.string.Sort"/>
+   
+   <typedef name="canread" classname="ise.antelope.tasks.typedefs.file.CanRead"/>
+   <typedef name="canwrite" classname="ise.antelope.tasks.typedefs.file.CanWrite"/>
+   <typedef name="filecount" classname="ise.antelope.tasks.typedefs.file.FileCount"/>
+   <typedef name="filelength" classname="ise.antelope.tasks.typedefs.file.FileLength"/>
+   <typedef name="linecount" classname="ise.antelope.tasks.typedefs.file.FileLineCount"/>
+   <typedef name="listfiles" classname="ise.antelope.tasks.typedefs.file.FileList"/>
+   <typedef name="isdirectory" classname="ise.antelope.tasks.typedefs.file.IsDirectory"/>
+   <typedef name="isfile" classname="ise.antelope.tasks.typedefs.file.IsFile"/>
+   <typedef name="lastmodified" classname="ise.antelope.tasks.typedefs.file.LastModified"/>
+   
+</antlib>
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/And.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/And.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/And.java	(revision 15023)
@@ -0,0 +1,50 @@
+/*
+ * Copyright  2001-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+package ise.antelope.tasks.condition;
+
+import java.util.Enumeration;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * &lt;and&gt; condition container, modified for Antelope.
+ *
+ * <p>Iterates over all conditions and returns false as soon as one
+ * evaluates to false.</p>
+ *
+ * @since Ant 1.4
+ * @version $Revision: 1.1 $
+ */
+public class And extends BooleanConditionBase implements Condition {
+
+    /**
+     * @return true if all the contained conditions evaluates to true
+     * @exception BuildException if an error occurs
+     */
+    public boolean eval() throws BuildException {
+        Enumeration e = getConditions();
+        while (e.hasMoreElements()) {
+            Condition c = (Condition) e.nextElement();
+            if (!c.eval()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/BooleanConditionBase.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/BooleanConditionBase.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/BooleanConditionBase.java	(revision 15023)
@@ -0,0 +1,186 @@
+package ise.antelope.tasks.condition;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.UnknownElement;
+import org.apache.tools.ant.taskdefs.Available;
+import org.apache.tools.ant.taskdefs.Checksum;
+import org.apache.tools.ant.taskdefs.UpToDate;
+import org.apache.tools.ant.taskdefs.condition.*;
+
+/**
+ * Extends ConditionBase so I can get access to the condition count and the
+ * first condition. This is the class that the BooleanConditionTask is proxy
+ * for.
+ *
+ * @author   danson
+ */
+public class BooleanConditionBase extends ProjectComponent {
+
+    private Vector conditions = new Vector();
+
+
+    /**
+     * Gets the conditionCount attribute of the BooleanConditionBase object
+     *
+     * @return   The conditionCount value
+     */
+    public int getConditionCount() {
+        return countConditions();
+    }
+
+
+    /**
+     * Gets the firstCondition attribute of the BooleanConditionBase object
+     *
+     * @return   The firstCondition value
+     */
+    public Condition getFirstCondition() {
+        return ( Condition ) getConditions().nextElement();
+    }
+
+    /**
+     * Count the conditions.
+     *
+     * @return the number of conditions in the container
+     * @since 1.1
+     */
+    public int countConditions() {
+        return conditions.size();
+    }
+
+    /**
+     * Iterate through all conditions.
+     *
+     * @return an enumeration to use for iteration
+     * @since 1.1
+     */
+    public final Enumeration getConditions() {
+        return conditions.elements();
+    }
+
+    public void addAvailable( Available a ) {
+        add( a );
+    }
+
+    public void addChecksum( Checksum c ) {
+        add( c );
+    }
+
+    public void addUptodate( UpToDate u ) {
+        add( u );
+    }
+
+    public void addNot( Not n ) {
+        add( n );
+    }
+
+    public void addAnd( And a ) {
+        add( a );
+    }
+
+    public void addOr( Or o ) {
+        add( o );
+    }
+
+    public void addEquals( Equals e ) {
+        add( e );
+    }
+
+    public void addOs( Os o ) {
+        add( o );
+    }
+
+    public void addIsSet( IsSet i ) {
+        add( i );
+    }
+
+    public void addHttp( Http h ) {
+        add( h );
+    }
+
+    public void addSocket( Socket s ) {
+        add( s );
+    }
+
+    public void addFilesMatch( FilesMatch test ) {
+        add( test );
+    }
+
+    public void addContains( Contains test ) {
+        add( test );
+    }
+
+    public void addIsTrue( IsTrue test ) {
+        add( test );
+    }
+
+    public void addIsFalse( IsFalse test ) {
+        add( test );
+    }
+
+    public void addIsReference( IsReference i ) {
+        add( i );
+    }
+    
+    public void addIsPropertyTrue( IsPropertyTrue i ) {
+        add( i );
+    }
+
+    public void addIsPropertyFalse( IsPropertyFalse i ) {
+        add( i );
+    }
+
+    public void addIsGreaterThan( IsGreaterThan i ) {
+        add( i );
+    }
+
+    public void addIsLessThan( IsLessThan i ) {
+        add( i );
+    }
+
+    public void addMathEquals( MathEquals i ) {
+        add( i );
+    }
+
+    public void addStartsWith( StartsWith i ) {
+        add( i );
+    }
+    
+    public void addEndsWith( EndsWith i ) {
+        add( i );
+    }
+
+    public void addDateDifference(DateTimeDifference i) {
+        add(i);   
+    }
+    
+    public void addTimeDifference(DateTimeDifference i) {
+        add(i);   
+    }
+    
+    public void addDateBefore(DateTimeBefore i) {
+        add(i);   
+    }
+    
+    public void addTimeBefore(DateTimeBefore i) {
+        add(i);   
+    }
+
+    /**
+     * Add an arbitrary condition -- this doesn't work, it is copied from 
+     * ConditionBase in Ant, and it doesn't work there either.
+     * @param c a  condition
+     * @since Ant 1.6
+     */
+    public void add( Condition c ) {
+        conditions.addElement( c );
+    }
+
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Contains.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Contains.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Contains.java	(revision 15023)
@@ -0,0 +1,130 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import java.util.*;
+
+import org.apache.tools.ant.taskdefs.condition.IsTrue;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.PropertyHelper;
+
+/**
+ * @author Dale Anson
+ */
+public class Contains extends IsTrue {
+    
+    private String propertyName = null;
+    
+    private String string, subString;
+    private boolean caseSensitive = true;
+
+    /**
+     * The name of a property value to search in.
+     * @param s the property name 
+     * @since Ant 1.5
+     */
+    public void setProperty(String s) {
+        propertyName = s;   
+    }
+    
+    /**
+     * The string to search in.
+     * @param string the string to search in
+     * @since Ant 1.5
+     */
+    public void setString(String string) {
+        this.string = string;
+    }
+
+    /**
+     * The string to search for.
+     * @param subString the string to search for
+     * @since Ant 1.5
+     */
+    public void setSubstring(String subString) {
+        this.subString = subString;
+    }
+
+    /**
+     * Whether to search ignoring case or not.
+     * @param b if true, ignore case
+     * @since Ant 1.5
+     */
+    public void setCasesensitive(boolean b) {
+        caseSensitive = b;
+    }
+
+    /**
+     * @since Ant 1.5
+     * @return true if the substring is within the string
+     * @exception BuildException if the attributes are not set correctly
+     */
+    public boolean eval() throws BuildException {
+        String in = string;
+        if (in == null)
+            in = getProject().getProperty(propertyName);
+        if (in == null)
+            in = getProject().getUserProperty(propertyName);
+        if (in == null)
+            return false;
+        
+        if (subString == null)
+            throw new BuildException("subString must be set in contains.");
+        
+        return caseSensitive
+            ? in.indexOf(subString) > -1
+            : in.toLowerCase().indexOf(subString.toLowerCase()) > -1;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeBefore.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeBefore.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeBefore.java	(revision 15023)
@@ -0,0 +1,158 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import java.text.*;
+import java.util.*;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.PropertyHelper;
+
+import org.apache.tools.ant.taskdefs.condition.*;
+
+/**
+ * Condition that validates if one datetime is before another datetime.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.1 $
+ */
+public class DateTimeBefore extends IsTrue implements Condition {
+
+    private String date1, date2;
+
+    private String format = null;
+    private boolean lenient = true;
+
+
+    /**
+     * Sets the first date/timestamp, required.
+     *
+     * @param date  a string representing a date or time.
+     */
+    public void setDatetime1(String date) {
+        if (date == null)
+            return;
+        if (date1 == null)
+            date1 = date;
+    }
+
+    /**
+     * Sets the other date/time stamp, required.
+     *
+     * @param date  a string representing a date or time.
+     */
+    public void setDatetime2(String date) {
+        if (date == null)
+            return;
+        if (date2 == null)
+            date2 = date;
+    }
+
+
+    /**
+     * Sets the format of the datetimes, this is a required attribute.  See
+     * java.text.SimpleDateFormat for the format.
+     *
+     * @param format  The new format value
+     */
+    public void setFormat(String format) {
+        this.format = format;
+    }
+
+
+    /**
+     * Sets whether the datetime parser should use lenient parsing. This is an
+     * optional setting, default is true, use lenient parsing.
+     *
+     * @param b  The new lenient value
+     */
+    public void setLenient(boolean b) {
+        lenient = b;
+    }
+
+
+    /**
+     * @return  true if datetime1 is before datetime2.
+     * @exception BuildException  if the attributes are not set correctly
+     */
+    public boolean eval() throws BuildException {
+        try {
+            Date d1;
+            Date d2;
+            if (format == null)
+                throw new BuildException("format is required");
+
+            SimpleDateFormat df = new SimpleDateFormat(format);
+            df.setLenient(lenient);
+
+            if (date1 != null && date2 != null) {
+                // handle date difference
+                d1 = df.parse(date1);
+                d2 = df.parse(date2);
+            }
+            else
+                throw new BuildException("Both datetime1 and datetime2 must be set.");
+
+            Calendar cal1 = Calendar.getInstance();
+            Calendar cal2 = Calendar.getInstance();
+            cal1.setTime(d1);
+            cal2.setTime(d2);
+
+            return cal1.before(cal2);
+        }
+        catch (Exception e) {
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeDifference.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeDifference.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/DateTimeDifference.java	(revision 15023)
@@ -0,0 +1,223 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import java.text.*;
+import java.util.*;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.PropertyHelper;
+
+import org.apache.tools.ant.taskdefs.condition.*;
+import ise.antelope.tasks.typedefs.TimeUnit;
+
+/**
+ * Condition that validates the difference between two date/time stamps.
+ *
+ * @author    Dale Anson
+ * @version   $Revision: 1.1 $
+ */
+public class DateTimeDifference implements Condition {
+
+    private String date1, date2;
+
+    private String format = null;
+    private boolean lenient = true;
+
+    private int value = 0;
+    private String unit = null;
+
+    /**
+     * Sets a date/timestamp, required.
+     *
+     * @param date  a string representing a date or time.
+     */
+    public void setDatetime1(String date) {
+        if (date == null)
+            return;
+        if (date1 == null)
+            date1 = date;
+    }
+
+    /**
+     * Sets the other date/time stamp, required.
+     *
+     * @param date  a string representing a date or time.
+     */
+    public void setDatetime2(String date) {
+        if (date == null)
+            return;
+        if (date2 == null)
+            date2 = date;
+    }
+
+
+    /**
+     * Sets the format of the datetimes, this is a required attribute.  See
+     * java.text.SimpleDateFormat for the format.
+     *
+     * @param format  The new format value
+     */
+    public void setFormat(String format) {
+        this.format = format;
+    }
+
+
+    /**
+     * Sets whether the datetime parser should use lenient parsing. This is an
+     * optional setting, default is true, use lenient parsing.
+     *
+     * @param b  The new lenient value
+     */
+    public void setLenient(boolean b) {
+        lenient = b;
+    }
+
+    /**
+     * Sets the expected difference between the 2 datetimes.
+     *
+     * @param value  the expected difference.
+     */
+    public void setValue(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Sets the unit for the difference between the 2 datetimes.  For example,
+     * if <code>value</code> is 12 and <code>unit</code> is "hours", then this
+     * condition checks that the difference between the 2 datetimes is 12 hours.
+     *
+     * @param unit  valid values are "millisecond", "second", "minute", "hour",
+     *      "day", "week", "month", "year".
+     */
+    public void setUnit(String unit) {
+        if (unit == null)
+            return;
+        this.unit = unit;
+    }
+
+    /**
+     * @return                    true if the difference between the two dates
+     *      or times is the same as the expected value.
+     * @exception BuildException  if the attributes are not set correctly
+     */
+    public boolean eval() throws BuildException {
+        try {
+            Date d1;
+            Date d2;
+            if (format == null)
+                throw new BuildException("format is required");
+
+            SimpleDateFormat df = new SimpleDateFormat(format);
+            df.setLenient(lenient);
+
+            if (date1 != null && date2 != null) {
+                // handle date difference
+                d1 = df.parse(date1);
+                d2 = df.parse(date2);
+            }
+            else
+                throw new BuildException("Both datetime1 and datetime2 must be set.");
+
+            Calendar cal1 = Calendar.getInstance();
+            Calendar cal2 = Calendar.getInstance();
+            cal1.setTime(d1);
+            cal2.setTime(d2);
+
+            Calendar before = cal1.before(cal2) ? cal1 : cal2;
+            Calendar after = cal1.before(cal2) ? cal2 : cal1;
+
+            int cal_unit = Calendar.DATE;
+
+            if (unit.equals(TimeUnit.SECOND)) {
+                cal_unit = Calendar.SECOND;
+            }
+            else if (unit.equals(TimeUnit.MILLISECOND)) {
+                cal_unit = Calendar.MILLISECOND;
+            }
+            else if (unit.equals(TimeUnit.MINUTE)) {
+                cal_unit = Calendar.MINUTE;
+            }
+            else if (unit.equals(TimeUnit.HOUR)) {
+                cal_unit = Calendar.HOUR;
+            }
+            else if (unit.equals(TimeUnit.DAY)) {
+                cal_unit = Calendar.DATE;
+            }
+            else if (unit.equals(TimeUnit.WEEK)) {
+                cal_unit = Calendar.WEEK_OF_YEAR;
+            }
+            else if (unit.equals(TimeUnit.MONTH)) {
+                cal_unit = Calendar.MONTH;
+            }
+            else if (unit.equals(TimeUnit.YEAR)) {
+                cal_unit = Calendar.YEAR;
+            }
+            else
+                throw new BuildException("Unknown unit: " + unit);
+
+            int count = 0;
+            while (before.before(after)) {
+                before.add(cal_unit, 1);
+                ++count;
+            }
+
+            return count == value;
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            throw new BuildException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/EndsWith.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/EndsWith.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/EndsWith.java	(revision 15023)
@@ -0,0 +1,85 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.IsTrue;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends IsTrue to do a String.endsWith().
+ * <endswith string="" with=""/>
+ * @author Dale Anson
+ */
+public class EndsWith extends IsTrue {
+    
+    private String string = null;
+    private String with = null;
+    
+    public void setString(String s) {
+        this.string = s;   
+    }
+    
+    public void setWith(String w) {
+        this.with = getProject().replaceProperties(w);   
+    }
+    
+    public boolean eval() throws BuildException {
+        if (string == null)
+            throw new BuildException("string must be set.");
+        if (with == null)
+            throw new BuildException("with must be set.");
+        return string.endsWith(with);
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsGreaterThan.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsGreaterThan.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsGreaterThan.java	(revision 15023)
@@ -0,0 +1,121 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.Equals;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends Equals condition to test if the first argument is greater than the
+ * second argument. Will deal with base 10 integer and decimal numbers, otherwise,
+ * treats arguments as Strings.
+ * @author Dale Anson
+ */
+public class IsGreaterThan extends Equals {
+
+    private String arg1, arg2;
+    private boolean trim = false;
+    private boolean caseSensitive = true;
+
+    public void setArg1(String a1) {
+        arg1 = a1;
+    }
+
+    public void setArg2(String a2) {
+        arg2 = a2;
+    }
+
+    /**
+     * Should we want to trim the arguments before comparing them?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setTrim(boolean b) {
+        trim = b;
+    }
+
+    /**
+     * Should the comparison be case sensitive?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setCasesensitive(boolean b) {
+        caseSensitive = b;
+    }
+
+    public boolean eval() throws BuildException {
+        if (arg1 == null || arg2 == null) {
+            throw new BuildException("both arg1 and arg2 are required in "
+                                     + "greater than");
+        }
+
+        if (trim) {
+            arg1 = arg1.trim();
+            arg2 = arg2.trim();
+        }
+        
+        // check if args are numbers
+        boolean first_is_num = arg1.matches("\\d*[.]?\\d*");
+        boolean second_is_num = arg2.matches("\\d*[.]?\\d*");
+        if (first_is_num && second_is_num) {
+           double first_double = Double.parseDouble(arg1);
+           double second_double = Double.parseDouble(arg2);
+           return first_double > second_double;
+        }
+        
+        
+        return caseSensitive ? arg1.compareTo(arg2) > 0 : arg1.compareToIgnoreCase(arg2) > 0;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsLessThan.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsLessThan.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsLessThan.java	(revision 15023)
@@ -0,0 +1,124 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.Condition;
+import org.apache.tools.ant.taskdefs.condition.Equals;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends Equals condition to test if the first argument is less than the
+ * second argument. Will deal with base 10 integer and decimal numbers, otherwise,
+ * treats arguments as Strings.
+ * @author Dale Anson
+ */
+public class IsLessThan extends Equals implements Condition {
+
+    private String arg1, arg2;
+    private boolean trim = false;
+    private boolean caseSensitive = true;
+
+    public void setArg1(String a1) {
+        arg1 = a1;
+    }
+
+    public void setArg2(String a2) {
+        arg2 = a2;
+    }
+
+    /**
+     * Should we want to trim the arguments before comparing them?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setTrim(boolean b) {
+        trim = b;
+    }
+
+    /**
+     * Should the comparison be case sensitive?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setCasesensitive(boolean b) {
+        caseSensitive = b;
+    }
+
+    public boolean eval() throws BuildException {
+        if (arg1 == null || arg2 == null) {
+            //System.out.println("arg1 = " + arg1);
+            //System.out.println("arg2 = " + arg2);
+            throw new BuildException("both arg1 and arg2 are required in "
+                                     + "less than");
+        }
+
+        if (trim) {
+            arg1 = arg1.trim();
+            arg2 = arg2.trim();
+        }
+        
+        // check if args are numbers
+        boolean first_is_num = arg1.matches("\\d*[.]?\\d*");
+        boolean second_is_num = arg2.matches("\\d*[.]?\\d*");
+        if (first_is_num && second_is_num) {
+           double first_double = Double.parseDouble(arg1);
+           double second_double = Double.parseDouble(arg2);
+           return first_double < second_double;
+        }
+        
+        
+        return caseSensitive ? arg1.compareTo(arg2) < 0 : arg1.compareToIgnoreCase(arg2) < 0;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyFalse.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyFalse.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyFalse.java	(revision 15023)
@@ -0,0 +1,80 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.IsFalse;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends IsFalse condition to check the value of a specified property.
+ * @author Dale Anson
+ */
+public class IsPropertyFalse extends IsFalse {
+    
+    private String name = null;
+    
+    public void setProperty(String name) {
+        this.name = name;   
+    }
+    
+    public boolean eval() throws BuildException {
+        if (name == null)
+            throw new BuildException("Property name must be set.");
+        String value = getProject().getProperty(name);
+        if (value == null)
+            return true;
+        return !getProject().toBoolean(value);
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyTrue.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyTrue.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/IsPropertyTrue.java	(revision 15023)
@@ -0,0 +1,80 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.IsTrue;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends IsTrue condition to check the value of a specified property.
+ * @author Dale Anson
+ */
+public class IsPropertyTrue extends IsTrue {
+
+    private String name = null;
+
+    public void setProperty( String name ) {
+        this.name = name;
+    }
+
+    public boolean eval() throws BuildException {
+        if ( name == null )
+            throw new BuildException( "Property name must be set." );
+        String value = getProject().getProperty( name );
+        if ( value == null )
+            return false;
+        return getProject().toBoolean( value );
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/MathEquals.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/MathEquals.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/MathEquals.java	(revision 15023)
@@ -0,0 +1,121 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.Equals;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends Equals condition to test if the first argument is greater than the
+ * second argument. Will handle base 10 integer and decimal numbers, otherwise,
+ * treats arguments as Strings.
+ * @author Dale Anson
+ */
+public class MathEquals extends Equals {
+
+    private String arg1, arg2;
+    private boolean trim = false;
+    private boolean caseSensitive = true;
+
+    public void setArg1(String a1) {
+        arg1 = a1;
+    }
+
+    public void setArg2(String a2) {
+        arg2 = a2;
+    }
+
+    /**
+     * Should we want to trim the arguments before comparing them?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setTrim(boolean b) {
+        trim = b;
+    }
+
+    /**
+     * Should the comparison be case sensitive?
+     *
+     * @since Revision: 1.3, Ant 1.5
+     */
+    public void setCasesensitive(boolean b) {
+        caseSensitive = b;
+    }
+
+    public boolean eval() throws BuildException {
+        if (arg1 == null || arg2 == null) {
+            throw new BuildException("both arg1 and arg2 are required in "
+                                     + "math equals");
+        }
+
+        if (trim) {
+            arg1 = arg1.trim();
+            arg2 = arg2.trim();
+        }
+        
+        // check if args are numbers
+        boolean first_is_num = arg1.matches("\\d*[.]?\\d*");
+        boolean second_is_num = arg2.matches("\\d*[.]?\\d*");
+        if (first_is_num && second_is_num) {
+           double first_double = Double.parseDouble(arg1);
+           double second_double = Double.parseDouble(arg2);
+           return first_double == second_double;
+        }
+        
+        
+        return caseSensitive ? arg1.compareTo(arg2) == 0 : arg1.compareToIgnoreCase(arg2) == 0;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Not.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Not.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Not.java	(revision 15023)
@@ -0,0 +1,51 @@
+/*
+ * Copyright  2001-2002,2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * &lt;not&gt; condition, modified for Antelope.
+ *
+ * Evaluates to true if the single condition nested into it is false
+ * and vice versa.
+ *
+ * @since Ant 1.4
+ * @version $Revision: 1.1 $
+ */
+public class Not extends BooleanConditionBase implements Condition {
+
+    /**
+     * Evaluate condition
+     *
+     * @return true if the condition is true.
+     * @throws BuildException if the condition is not configured correctly.
+     */
+    public boolean eval() throws BuildException {
+        if (countConditions() > 1) {
+            throw new BuildException("You must not nest more than one "
+                + "condition into <not>");
+        }
+        if (countConditions() < 1) {
+            throw new BuildException("You must nest a condition into <not>");
+        }
+        return !((Condition) getConditions().nextElement()).eval();
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Or.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Or.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/Or.java	(revision 15023)
@@ -0,0 +1,50 @@
+/*
+ * Copyright  2001-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+package ise.antelope.tasks.condition;
+
+import java.util.Enumeration;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+/**
+ * &lt;or&gt; condition container, modified for Antelope.
+ *
+ * <p>Iterates over all conditions and returns true as soon as one
+ * evaluates to true.</p>
+ *
+ * @since Ant 1.4
+ * @version $Revision: 1.1 $
+ */
+public class Or extends BooleanConditionBase implements Condition {
+
+    /**
+     * @return true if any of the contained conditions evaluate to true
+     * @exception BuildException if an error occurs
+     */
+    public boolean eval() throws BuildException {
+        Enumeration e = getConditions();
+        while (e.hasMoreElements()) {
+            Condition c = (Condition) e.nextElement();
+            if (c.eval()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/StartsWith.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/StartsWith.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/condition/StartsWith.java	(revision 15023)
@@ -0,0 +1,96 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+package ise.antelope.tasks.condition;
+
+import org.apache.tools.ant.taskdefs.condition.IsTrue;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Extends IsTrue to do a String.startsWith().
+ * <startswith string="" with=""/>
+ * @author Dale Anson
+ */
+public class StartsWith extends IsTrue {
+    
+    private String string = null;
+    private String propertyName = null;
+    private String with = null;
+    
+    public void setString(String s) {
+        this.string = s;   
+    }
+    
+    public void setProperty(String s) {
+        String propertyName = s;   
+    }
+    
+    public void setWith(String w) {
+        this.with = getProject().replaceProperties(w);   
+    }
+    
+    public boolean eval() throws BuildException {
+        if (string == null || propertyName == null)
+            throw new BuildException("string or property must be set.");
+        if (with == null)
+            throw new BuildException("with must be set.");
+        
+        if (string != null)
+            return string.startsWith(with);
+        else {
+            String propertyValue = getProject().getProperty(propertyName);
+            return propertyValue == null ? false : propertyValue.startsWith(with);    
+        }
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/Input.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/Input.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/Input.java	(revision 15023)
@@ -0,0 +1,69 @@
+/*
+Copyright (c) Dale Anson, 2004
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.   
+   3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package ise.antelope.tasks.password;
+
+import java.io.*;
+
+/**
+ * A simple input field to get data from the command line.
+ * @version   $Revision: 1.1 $
+ */
+public abstract class Input {
+
+    protected String prompt = null;
+    private String default_value = null;
+
+    /** Constructor for Input  */
+    public Input() {
+        this("");
+    }
+
+    /**
+     * Constructor for Input
+     *
+     * @param prompt
+     */
+    public Input(String prompt) {
+        this.prompt = prompt;
+    }
+
+    /**
+     * Gets the input attribute of the Input object
+     *
+     * @return   The input value
+     */
+    public abstract String getInput();
+    
+    public void setDefaultValue(String default_value){
+        this.default_value = default_value;   
+    }
+    
+    public String getDefaultValue() {
+        return default_value;   
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandler.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandler.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandler.java	(revision 15023)
@@ -0,0 +1,170 @@
+/*
+Copyright (c) Dale Anson, 2004
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+  1. Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+  3. The name of the author may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package ise.antelope.tasks.password;
+
+import java.security.*;
+import java.security.spec.*;
+import javax.crypto.*;
+import javax.crypto.spec.*;
+
+import ise.antelope.tasks.util.Base64;
+
+/**
+ * Simple class to encode and decode passwords. The encrypted password is a
+ * base-64 encoded string, so it's suitable for storage in a properties file or
+ * where ever a string might be stored. This class could be used for larger
+ * strings than passwords, but all I need is an easy way to store passwords in a
+ * file.
+ *
+ * @author    Dale Anson, May 2002
+ * @version   $Revision: 1.1 $
+ */
+public class PasswordHandler {
+
+    /** use Triple-DES as algorithm */
+    public final static String DESEDE = "DESede";
+    /** key to use if none given */
+    public final static String DEFAULT_KEY = "The quick brown fox jumped over the lazy dog.";
+    /** default character encoding */
+    private final static String ENCODING = "UTF8";
+
+    private KeySpec keySpec;
+    private SecretKeyFactory keyFactory;
+    private Cipher cipher;
+
+    /**
+     * Constructor for PasswordHandler, uses default key.
+     *
+     * @exception PasswordHandlerException  Description of Exception
+     */
+    public PasswordHandler() throws PasswordHandlerException {
+        this(DEFAULT_KEY);
+    }
+
+    /**
+     * Constructor for PasswordHandler
+     *
+     * @param encryptKey                    String to use for a key, must be at
+     *      least 32 characters long.
+     * @exception PasswordHandlerException  Description of Exception
+     */
+    public PasswordHandler(String encryptKey) throws PasswordHandlerException {
+        if (encryptKey == null) {
+            throw new IllegalArgumentException("Encrypt key cannot be null.");
+        }
+        if (encryptKey.trim().length() < 32) {
+            throw new IllegalArgumentException("Encrypt key cannot be less than 32 characters.");
+        }
+
+        try {
+            byte[] bytes = encryptKey.getBytes(ENCODING);
+            keySpec = new DESedeKeySpec(bytes);
+            keyFactory = SecretKeyFactory.getInstance(DESEDE);
+            cipher = Cipher.getInstance(DESEDE);
+        }
+        catch (Exception e) {
+            throw new PasswordHandlerException(e);
+        }
+    }
+
+    /**
+     * Encrypt a password.
+     *
+     * @param password                      the password to encrypt
+     * @return                              the encrypted password.
+     * @exception PasswordHandlerException  Description of Exception
+     */
+    public String encrypt(String password) throws PasswordHandlerException {
+        if (password == null || password.trim().length() == 0)
+            throw new IllegalArgumentException("Password cannot be null or empty.");
+
+        try {
+            SecretKey key = keyFactory.generateSecret(keySpec);
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+            byte[] plain_bytes = password.getBytes(ENCODING);
+            byte[] cipher_bytes = cipher.doFinal(plain_bytes);
+            return Base64.encodeBytes(cipher_bytes);
+        }
+        catch (Exception e) {
+            throw new PasswordHandlerException(e);
+        }
+    }
+
+    /**
+     * Decrypt a password.
+     *
+     * @param encryptedPassword             the encrypted password, needing to
+     *      be decrypted
+     * @return                              the original, plain text password
+     * @exception PasswordHandlerException  Description of Exception
+     */
+    public String decrypt(String encryptedPassword) throws PasswordHandlerException {
+        if (encryptedPassword == null || encryptedPassword.trim().length() <= 0)
+            throw new IllegalArgumentException("Encrypted password cannot be null or empty.");
+
+        try {
+            SecretKey key = keyFactory.generateSecret(keySpec);
+            cipher.init(Cipher.DECRYPT_MODE, key);
+            byte[] cipher_bytes = Base64.decode(encryptedPassword);
+            byte[] plain_bytes = cipher.doFinal(cipher_bytes);
+            //StringBuffer sb = new StringBuffer();
+            //for (int i = 0; i < plain_bytes.length; i++) {
+            //    sb.append((char) plain_bytes[i]);
+            //}
+            return new String(plain_bytes);
+        }
+        catch (Exception e) {
+            throw new PasswordHandlerException(e);
+        }
+    }
+
+    /**
+     * for testing only
+     *
+     * @param args  The command line arguments
+     */
+    public static void main(String[] args) {
+        try {
+                //testPassword.append(String.valueOf(i % 10));
+                String testPassword = "abcdef1234567890";
+                System.out.println("original: " + testPassword.toString());
+                System.out.println("original length: " + testPassword.length());
+                PasswordHandler ph = new PasswordHandler();
+                String encrypted = ph.encrypt(testPassword.toString());
+                System.out.println("encrypted: " + encrypted);
+                System.out.println("encrypted length: " + encrypted.length());
+                if (encrypted.length() >= 32)
+                    System.exit(0);
+                ph = new PasswordHandler();
+                String plain = ph.decrypt(encrypted);
+                System.out.println("decrypted: " + plain);
+                if (testPassword.toString().compareTo(plain) != 0) {
+                    throw new Exception("test failed!");
+                }
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandlerException.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandlerException.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordHandlerException.java	(revision 15023)
@@ -0,0 +1,42 @@
+package ise.antelope.tasks.password;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class PasswordHandlerException extends Exception {
+    /** Constructor for PasswordHandlerException  */
+    public PasswordHandlerException() {
+        super();
+    }
+
+    /**
+     * Constructor for PasswordHandlerException
+     *
+     * @param message
+     */
+    public PasswordHandlerException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor for PasswordHandlerException
+     *
+     * @param message
+     * @param cause
+     */
+    public PasswordHandlerException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor for PasswordHandlerException
+     *
+     * @param cause
+     */
+    public PasswordHandlerException(Throwable cause) {
+        super(cause);
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInput.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInput.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInput.java	(revision 15023)
@@ -0,0 +1,81 @@
+/*
+Copyright (c) Dale Anson, 2004
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.   
+   3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package ise.antelope.tasks.password;
+
+import java.io.*;
+
+/**
+ * Extends Input to mask user input for a password.
+ * @version   $Revision: 1.1 $
+ */
+public class PasswordInput extends Input {
+
+    /** Constructor for PasswordInput  */
+    public PasswordInput() {
+        super();
+    }
+
+    /**
+     * Constructor for PasswordInput
+     *
+     * @param prompt
+     */
+    public PasswordInput(String prompt) {
+        super(prompt);
+    }
+
+    /**
+     * Gets the input attribute of the PasswordInput object
+     *
+     * @return   The encrypted password, or "" if the user did not enter a password.
+     */
+    public String getInput() {
+        try {
+            System.out.print(prompt + " ");
+            BufferedReader br = new BufferedReader(new InputStreamReader(new PasswordInputStream()));
+            String plain = br.readLine().trim();
+            if (plain == null || plain.length() == 0)
+                return "";
+            
+            String password = null;
+            try {
+                PasswordHandler ph = new PasswordHandler();
+                password = ph.encrypt(plain);
+            }
+            catch(Exception e) {
+                e.printStackTrace();
+            }
+            return password;
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage());
+        }
+
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInputStream.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInputStream.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/password/PasswordInputStream.java	(revision 15023)
@@ -0,0 +1,111 @@
+/*
+Copyright (c) Dale Anson, 2004
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+  1. Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+  3. The name of the author may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package ise.antelope.tasks.password;
+
+import java.io.*;
+import java.nio.*;
+
+/**
+ * An input stream for getting a password from the command line, provides for
+ * masking of user input. Reads and masks input from the command line, then
+ * stops getting input from the command line on the first line separator.
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class PasswordInputStream extends InputStream {
+
+    private StringBuffer buffer = new StringBuffer();
+    private String LS = System.getProperty("line.separator");
+    private InputStream _system_in = System.in;
+
+    private Thread reader = null;
+
+    private int ptr = 0;
+
+    /** Constructor for PasswordInputStream */
+    public PasswordInputStream() {
+        _system_in = System.in;
+        _system_in.mark(256);
+        System.setIn(this);
+
+        reader =
+            new Thread() {
+                public void run() {
+                    try {
+                        _system_in.reset();
+                    }
+                    catch (Exception ignored) {
+                    }
+                    do {
+                        try {
+                            int c = _system_in.read();
+                            buffer.append((char) c);
+                            if (buffer.indexOf(LS) != -1) {
+                                System.setIn(_system_in);
+                                return;
+                            }
+                            sleep(1);
+                        }
+                        catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    } while (true);
+                }
+            };
+        reader.start();
+    }
+
+
+    /**
+     * Reads the next byte of data from the input stream. The value byte is
+     * returned as an int in the range 0 to 255. If no byte is available because
+     * the end of the stream has been reached, we're in trouble because we're
+     * reading from System.in. This method blocks until input data is available,
+     * the end of the stream is detected, or an exception is thrown. 
+     *
+     * @return                 the next byte of data
+     * @exception IOException  if an I/O error occurs.
+     */
+    public int read() throws IOException {
+        if (buffer.indexOf(LS) != -1) {
+            for (int i = 0; i < LS.length(); i++)
+                System.out.print("\b");
+            return -1;
+        }
+        while (true) {
+            if (buffer.length() > 0 && ptr < buffer.length()) {
+                int i = (int) buffer.charAt(ptr);
+                ++ptr;
+                return i;
+            }
+            System.out.print("\b ");
+            try {
+                Thread.currentThread().sleep(1);
+            }
+            catch (Exception e) {
+                throw new IOException();
+            }
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/Prop.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/Prop.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/Prop.java	(revision 15023)
@@ -0,0 +1,77 @@
+/*
+* The Apache Software License, Version 1.1
+*
+* Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
+* reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+*
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in
+*    the documentation and/or other materials provided with the
+*    distribution.
+*
+* 3. The end-user documentation included with the redistribution, if
+*    any, must include the following acknowlegement:
+*       "This product includes software developed by the
+*        Apache Software Foundation (http://www.apache.org/)."
+*    Alternately, this acknowlegement may appear in the software itself,
+*    if and wherever such third-party acknowlegements normally appear.
+*
+* 4. The names "The Jakarta Project", "Ant", and "Apache Software
+*    Foundation" must not be used to endorse or promote products derived
+*    from this software without prior written permission. For written
+*    permission, please contact apache@apache.org.
+*
+* 5. Products derived from this software may not be called "Apache"
+*    nor may "Apache" appear in their names without prior written
+*    permission of the Apache Group.
+*
+* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+* ====================================================================
+*
+* This software consists of voluntary contributions made by many
+* individuals on behalf of the Apache Software Foundation.  For more
+* information on the Apache Software Foundation, please see
+* <http://www.apache.org/>.
+*/
+
+package ise.antelope.tasks.typedefs;
+
+/**
+ * Simple bean to represent a name/value pair.
+ * @author Dale Anson
+ */
+public class Prop {
+    private String name = null;
+    private String value = null;
+    public void setName( String name ) {
+        this.name = name;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setValue( String value ) {
+        this.value = value;
+    }
+    public String getValue() {
+        return value;
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/TimeUnit.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/TimeUnit.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/TimeUnit.java	(revision 15023)
@@ -0,0 +1,107 @@
+
+package ise.antelope.tasks.typedefs;
+
+import java.util.*;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * The enumeration of units: millisecond, second, minute, hour, day, week,
+ * month, year.
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class TimeUnit extends EnumeratedAttribute {
+
+    public final static String MILLISECOND = "millisecond";
+    public final static String SECOND = "second";
+    public final static String MINUTE = "minute";
+    public final static String HOUR = "hour";
+    public final static String DAY = "day";
+    public final static String WEEK = "week";
+    public final static String MONTH = "month";
+    public final static String YEAR = "year";
+
+    /** static unit objects, for use as sensible defaults */
+    public final static TimeUnit MILLISECOND_UNIT = new TimeUnit(MILLISECOND);
+    public final static TimeUnit SECOND_UNIT = new TimeUnit(SECOND);
+    public final static TimeUnit MINUTE_UNIT = new TimeUnit(MINUTE);
+    public final static TimeUnit HOUR_UNIT = new TimeUnit(HOUR);
+    public final static TimeUnit DAY_UNIT = new TimeUnit(DAY);
+    public final static TimeUnit WEEK_UNIT = new TimeUnit(WEEK);
+
+    private final static String[] units = {MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR};
+
+    private Hashtable timeTable = new Hashtable();
+
+    /** Constructor for TimeUnit */
+    public TimeUnit() {
+        timeTable.put(MILLISECOND, new Long(1L));
+        timeTable.put(SECOND, new Long(1000L));
+        timeTable.put(MINUTE, new Long(1000L * 60L));
+        timeTable.put(HOUR, new Long(1000L * 60L * 60L));
+        timeTable.put(DAY, new Long(1000L * 60L * 60L * 24L));
+        timeTable.put(WEEK, new Long(1000L * 60L * 60L * 24L * 7L));
+        
+        // calculate month and year based on the current date
+        Calendar now = Calendar.getInstance();
+        long now_ms = now.getTimeInMillis();
+        
+        Calendar later = Calendar.getInstance();
+        later.add(Calendar.MONTH, 1);
+        timeTable.put(MONTH, new Long(later.getTimeInMillis() - now_ms));
+        
+        later.add(Calendar.MONTH, -1);
+        later.add(Calendar.YEAR, 1);
+        timeTable.put(YEAR, new Long(later.getTimeInMillis() - now_ms));
+    }
+
+    /**
+     * private constructor used for static construction of TimeUnit objects.
+     *
+     * @param value  String representing the value.
+     */
+    private TimeUnit(String value) {
+        this();
+        setValueProgrammatically(value);
+    }
+
+    /**
+     * set the inner value programmatically.
+     *
+     * @param value  to set
+     */
+    protected void setValueProgrammatically(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the multiplier attribute of the TimeUnit object
+     *
+     * @return   The multiplier value
+     */
+    public long getMultiplier() {
+        String key = getValue().toLowerCase();
+        Long l = (Long) timeTable.get(key);
+        return l.longValue();
+    }
+
+    /**
+     * Gets the values attribute of the TimeUnit object
+     *
+     * @return   The values value
+     */
+    public String[] getValues() {
+        return units;
+    }
+
+    /**
+     * convert the time in the current unit, to millis
+     *
+     * @param numberOfUnits  long expressed in the current objects units
+     * @return               long representing the value in millis
+     */
+    public long toMillis(long numberOfUnits) {
+        return numberOfUnits * getMultiplier();
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanRead.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanRead.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanRead.java	(revision 15023)
@@ -0,0 +1,25 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class CanRead implements FileOp {
+    
+    /**
+     * Checks if the given file is readable
+     *
+     * @param f a file
+     * @return true if the file is a readable.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return f.canRead() ? "true" : "false";
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanWrite.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanWrite.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/CanWrite.java	(revision 15023)
@@ -0,0 +1,25 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class CanWrite implements FileOp {
+    
+    /**
+     * Checks if the given file is writable
+     *
+     * @param f a file
+     * @return true if the file is a writable.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return f.canWrite() ? "true" : "false";
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileCount.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileCount.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileCount.java	(revision 15023)
@@ -0,0 +1,34 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class FileCount implements FileOp {
+    
+    /**
+     * Counts the number of files in a directory.  Does not recurse.  Does not 
+     * count subdirectores.  Only counts files in the directory.
+     *
+     * @param f a directory
+     * @return the number of files contained in the directory.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        if (!f.isDirectory())
+            return "1";
+        File[] files = f.listFiles();
+        int file_count = 0;
+        for (int i = 0; i < files.length; i++) {
+            if (files[i].isFile())
+                ++file_count;
+        }
+        return String.valueOf(file_count);
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLength.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLength.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLength.java	(revision 15023)
@@ -0,0 +1,26 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class FileLength implements FileOp {
+    
+    /**
+     * Description of the Method
+     *
+     * @param f a file
+     * @return the length of the file.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return String.valueOf(f.length());
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLineCount.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLineCount.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileLineCount.java	(revision 15023)
@@ -0,0 +1,48 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+import org.apache.tools.ant.BuildException;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class FileLineCount implements FileOp {
+
+    /**
+     * Description of the Method
+     *
+     * @param f a file
+     * @return the number of lines in the file
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        //System.out.println(f);
+        LineNumberReader lnr = null;
+        try {
+            lnr = new LineNumberReader(new FileReader(f));
+            String line = lnr.readLine();
+            while(line != null) {
+                line = lnr.readLine();
+            }
+            return String.valueOf(lnr.getLineNumber());
+        }
+        catch(Exception e) {
+            throw new BuildException(e.getMessage());
+        }
+        finally {
+            try {
+                if (lnr != null)
+                    lnr.close();
+            }
+            catch(Exception e) {
+                // ignored
+            }
+        }
+
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileList.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileList.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileList.java	(revision 15023)
@@ -0,0 +1,72 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.File;
+import java.util.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class FileList implements FileOp {
+    
+    private String what = "files";
+    private String separator = ",";
+    private boolean includepath = true;
+    
+    public void setSeparator(String s) {
+        if (s != null)
+            separator = s;   
+    }
+    
+    public void setIncludepath(boolean b) {
+        includepath = b;   
+    }
+    
+    public void setWhat(String s) {
+        if (s == null || s.equals("files")) {
+            what = "files";
+            return;
+        }
+        else if (s.equals("dirs")) {
+            what = "dirs";
+            return;
+        }
+        else if (s.equals("all")) {
+            what = "all";
+            return;
+        }
+        else
+            what = "files";
+    }
+    
+    /**
+     * Lists the files in a directory.  Does not recurse.  Does not 
+     * list subdirectores.  Only lists files in the directory.
+     *
+     * @param f a directory
+     * @return a list of files contained in the directory.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        if (!f.isDirectory())
+            return f.toString();
+        List files = Arrays.asList(f.listFiles());
+        StringBuffer value = new StringBuffer();
+        for (Iterator it = files.iterator(); it.hasNext(); ) {
+            File file = (File)it.next();
+            if ( (what.equals("files") && file.isFile()) ||
+                 (what.equals("dirs" ) && file.isDirectory()) ||
+                 (what.equals("all"  )) ) {
+                String filename = includepath ? file.getAbsolutePath() : file.getName();
+                value.append(filename);
+                if (it.hasNext())
+                    value.append(separator);
+            }
+        }
+        return value.toString();
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileOp.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileOp.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/FileOp.java	(revision 15023)
@@ -0,0 +1,7 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.File;
+
+public interface FileOp {
+    public String execute(File f);   
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsDirectory.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsDirectory.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsDirectory.java	(revision 15023)
@@ -0,0 +1,25 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class IsDirectory implements FileOp {
+    
+    /**
+     * Checks if the given file is a directory
+     *
+     * @param f a file
+     * @return true if the file is a directory
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return f.isDirectory() ? "true" : "false";
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsFile.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsFile.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsFile.java	(revision 15023)
@@ -0,0 +1,25 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class IsFile implements FileOp {
+    
+    /**
+     * Checks if the given file is a file
+     *
+     * @param f a file
+     * @return true if the file is a file, not a directory.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return f.isFile() ? "true" : "false";
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsHidden.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsHidden.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/IsHidden.java	(revision 15023)
@@ -0,0 +1,25 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class IsHidden implements FileOp {
+    
+    /**
+     * Checks if the given file is a hidden file
+     *
+     * @param f a file
+     * @return true if the file is a hidden file.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        return f.isHidden() ? "true" : "false";
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/LastModified.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/LastModified.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/file/LastModified.java	(revision 15023)
@@ -0,0 +1,39 @@
+package ise.antelope.tasks.typedefs.file;
+
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class LastModified implements FileOp {
+    
+    private String format = null;
+    
+    public void setFormat(String f) {
+        format = f;   
+    }
+    
+    /**
+     * Checks if the given file is writable
+     *
+     * @param f a file
+     * @return true if the file is a writable.
+     */
+    public String execute(File f) {
+        if (f == null)
+            throw new IllegalArgumentException("file cannot be null");
+        Date date = new Date(f.lastModified());
+        String lm;
+        if (format != null)
+            lm = new SimpleDateFormat(format).format(date);
+        else
+            lm = date.toString();
+        return lm;
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/Hostname.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/Hostname.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/Hostname.java	(revision 15023)
@@ -0,0 +1,66 @@
+package ise.antelope.tasks.typedefs.net;
+
+import java.net.*;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision$
+ */
+public class Hostname implements NetOp {
+
+    private String host = null;
+    private boolean showIp = false;
+
+    /**
+     * Gets the defaultProperty attribute of the Hostname object
+     *
+     * @return   The defaultProperty value
+     */
+    public String getDefaultProperty() {
+        return "hostname";
+    }
+
+    /**
+     * Sets the showip attribute of the Hostname object
+     *
+     * @param b  The new showip value
+     */
+    public void setShowip(boolean b) {
+        showIp = b;
+    }
+
+    /**
+     * Sets the host attribute of the Hostname object
+     *
+     * @param h  The new host value
+     */
+    public void setHost(String h) {
+        host = h;
+    }
+
+    /**
+     * Description of the Method
+     *
+     * @return   Description of the Returned Value
+     */
+    public String execute() {
+        try {
+            InetAddress addr = null;
+            if (host == null) {
+                // localhost
+                addr = InetAddress.getLocalHost();
+            }
+            else {
+                // remote host
+                addr = InetAddress.getByName(host);
+            }
+            String hostname = showIp ? addr.getHostAddress() : addr.getHostName();
+            return hostname;
+        }
+        catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/NetOp.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/NetOp.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/net/NetOp.java	(revision 15023)
@@ -0,0 +1,7 @@
+package ise.antelope.tasks.typedefs.net;
+
+
+public interface NetOp {
+    public String getDefaultProperty();
+    public String execute();   
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/IndexOf.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/IndexOf.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/IndexOf.java	(revision 15023)
@@ -0,0 +1,35 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class IndexOf implements StringOp {
+    
+    private String string = "";
+    private int fromIndex = 0;
+    
+    public void setString(String s) {
+        string = s;
+    }
+    
+    public void setFromindex(int i) {
+        fromIndex = i;
+    }
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return the index of the substring in the given string as a String, or '
+     * "-1" if not found.
+     */
+    public String execute(String s) {
+        if (s == null)
+            throw new IllegalArgumentException("string cannot be null");
+        return String.valueOf(s.indexOf(string, fromIndex));
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LastIndexOf.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LastIndexOf.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LastIndexOf.java	(revision 15023)
@@ -0,0 +1,37 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class LastIndexOf implements StringOp {
+    
+    private String string = "";
+    private int fromIndex = -1;
+    
+    public void setString(String s) {
+        string = s;
+    }
+    
+    public void setFromindex(int i) {
+        fromIndex = i;
+    }
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return the index of the substring in the given string as a String, or '
+     * "-1" if not found.
+     */
+    public String execute(String s) {
+        if (s == null)
+            throw new IllegalArgumentException("string cannot be null");
+        if (fromIndex == -1)
+            fromIndex = s.length();
+        return String.valueOf(s.lastIndexOf(string, fromIndex));
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Length.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Length.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Length.java	(revision 15023)
@@ -0,0 +1,18 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class Length implements StringOp {
+    
+    public String execute(String s) {
+        if (s == null)
+            throw new IllegalArgumentException("string cannot be null");
+        return String.valueOf(s.length());
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LowerCase.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LowerCase.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/LowerCase.java	(revision 15023)
@@ -0,0 +1,20 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class LowerCase implements StringOp {
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        return s.toLowerCase();
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/MessageBox.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/MessageBox.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/MessageBox.java	(revision 15023)
@@ -0,0 +1,37 @@
+package ise.antelope.tasks.typedefs.string;
+
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class MessageBox implements StringOp {
+    
+    private String title = null;
+    private int width = 60;
+    
+    public void setTitle(String t) {
+        title = t;   
+    }
+    
+    public void setWidth(int w) {
+        width = w;   
+    }
+    
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        if (width <= 0)
+            return "";
+        else
+            ise.library.ascii.MessageBox.setMaxWidth(width);
+        return ise.library.ascii.MessageBox.box(title, s);
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Replace.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Replace.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Replace.java	(revision 15023)
@@ -0,0 +1,34 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class Replace implements StringOp {
+    
+    
+    private String regex = "";
+    private String replacement = "";
+    
+    public void setRegex(String regex) {
+        this.regex = regex;
+    }
+    
+    public void setReplacement(String replacement) {
+        this.replacement = replacement;   
+    }
+    
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        return s.replaceAll(regex, replacement);
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Sort.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Sort.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Sort.java	(revision 15023)
@@ -0,0 +1,55 @@
+package ise.antelope.tasks.typedefs.string;
+
+import java.util.*;
+
+/**
+ * Sort a list of Strings.
+ *
+ * @version   $Revision: 1.2 $
+ */
+public class Sort implements StringOp {
+    
+    private String separator = null;
+    
+	/**
+	 * @param s the separator.  The string representing the list to be sorted
+	 * will be split on this separator.  This string is passed to a
+     * StringTokenizer, so this parameter represents a list of separators, 
+     * not necessarily a single separator. 
+	 */
+    public void setSeparator(String s) {
+        separator = s;
+    }
+    
+    /**
+     * Sort the string. The given string will first be split using either
+     * that string set in <code>setSeparator</code> or by the default delimiters
+     * for StringTokenizer.  If the default delimiters for StringTokenizer are
+     * used, the returned string will be a list of comma separated values.
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        if (s == null)
+            return "";
+        if (separator != null && separator.length() == 0)
+            separator = null;
+        List list = new ArrayList();
+        StringTokenizer st = separator == null ? new StringTokenizer(s) : new StringTokenizer(s, separator);
+        while(st.hasMoreTokens()) {
+            list.add(st.nextToken());   
+        }
+        Collections.sort(list);
+        StringBuffer sorted = new StringBuffer();
+        String sep = separator == null ? "," : separator.substring(0, 1);
+        for (Iterator it = list.iterator(); it.hasNext(); ) {
+            sorted.append((String)it.next());
+            if (it.hasNext())
+                sorted.append(sep);
+        }
+        return sorted.toString();
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/StringOp.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/StringOp.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/StringOp.java	(revision 15023)
@@ -0,0 +1,5 @@
+package ise.antelope.tasks.typedefs.string;
+
+public interface StringOp {
+    public String execute(String s);   
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Substring.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Substring.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Substring.java	(revision 15023)
@@ -0,0 +1,44 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class Substring implements StringOp {
+    
+    private int beginIndex = 0;
+    private int endIndex = -1;
+    
+    public void setBeginindex(int i) {
+        if (i < 0)
+            throw new IllegalArgumentException("beginindex must be <= 0");
+        beginIndex = i;   
+    }
+    
+    public void setEndindex(int i) {
+        if (i < 0)
+            throw new IllegalArgumentException("endindex must be <= 0");
+        endIndex = i;   
+    }
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        if (s == null)
+            return "";
+        if (beginIndex == endIndex)
+            return "";
+        if (endIndex == -1)
+            endIndex = s.length();
+        if (endIndex < beginIndex)
+            throw new IllegalArgumentException("endindex must be greater than beginindex");
+        return s.substring(beginIndex, endIndex);
+        
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Trim.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Trim.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/Trim.java	(revision 15023)
@@ -0,0 +1,20 @@
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class Trim implements StringOp {
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        return s.trim();
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/UpperCase.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/UpperCase.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/typedefs/string/UpperCase.java	(revision 15023)
@@ -0,0 +1,21 @@
+
+package ise.antelope.tasks.typedefs.string;
+
+/**
+ * Copyright 2003
+ *
+ * @version   $Revision: 1.1 $
+ */
+public class UpperCase implements StringOp {
+    /**
+     * Description of the Method
+     *
+     * @param s
+     * @return   Description of the Returned Value
+     */
+    public String execute(String s) {
+        return s.toUpperCase();
+    }
+}
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/Base64.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/Base64.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/Base64.java	(revision 15023)
@@ -0,0 +1,1432 @@
+
+package ise.antelope.tasks.util;
+
+/**
+ * Encodes and decodes to and from Base64 notation.
+ *
+ * <p>
+ * Change Log:
+ * </p>
+ * <ul>
+ *  <li>v2.1 - Cleaned up javadoc comments and unused variables and methods. Added
+ *   some convenience methods for reading and writing to and from files.</li>
+ *  <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems
+ *   with other encodings (like EBCDIC).</li>
+ *  <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
+ *   encoded data was a single byte.</li>
+ *  <li>v2.0 - I got rid of methods that used booleans to set options. 
+ *   Now everything is more consolidated and cleaner. The code now detects
+ *   when data that's being decoded is gzip-compressed and will decompress it
+ *   automatically. Generally things are cleaner. You'll probably have to
+ *   change some method calls that you were making to support the new
+ *   options format (<tt>int</tt>s that you "OR" together).</li>
+ *  <li>v1.5.1 - Fixed bug when decompressing and decoding to a             
+ *   byte[] using <tt>decode( String s, boolean gzipCompressed )</tt>.      
+ *   Added the ability to "suspend" encoding in the Output Stream so        
+ *   you can turn on and off the encoding if you need to embed base64       
+ *   data in an otherwise "normal" stream (like an XML file).</li>  
+ *  <li>v1.5 - Output stream pases on flush() command but doesn't do anything itself.
+ *      This helps when using GZIP streams.
+ *      Added the ability to GZip-compress objects before encoding them.</li>
+ *  <li>v1.4 - Added helper methods to read/write files.</li>
+ *  <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
+ *  <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream
+ *      where last buffer being read, if not completely full, was not returned.</li>
+ *  <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.</li>
+ *  <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
+ * </ul>
+ *
+ * <p>
+ * I am placing this code in the Public Domain. Do with it as you will.
+ * This software comes with no guarantees or warranties but with
+ * plenty of well-wishing instead!
+ * Please visit <a href="http://iharder.net/base64">http://iharder.net/base64</a>
+ * periodically to check for updates or to contribute improvements.
+ * </p>
+ *
+ * @author Robert Harder
+ * @author rob@iharder.net
+ * @version 2.1
+ */
+public class Base64 {
+
+   /* ********  P U B L I C   F I E L D S  ******** */
+
+
+   /** No options specified. Value is zero. */
+   public final static int NO_OPTIONS = 0;
+
+   /** Specify encoding. */
+   public final static int ENCODE = 1;
+
+
+   /** Specify decoding. */
+   public final static int DECODE = 0;
+
+
+   /** Specify that data should be gzip-compressed. */
+   public final static int GZIP = 2;
+
+
+   /** Don't break lines when encoding (violates strict Base64 specification) */
+   public final static int DONT_BREAK_LINES = 8;
+
+
+   /* ********  P R I V A T E   F I E L D S  ******** */
+
+
+   /** Maximum line length (76) of Base64 output. */
+   private final static int MAX_LINE_LENGTH = 76;
+
+
+   /** The equals sign (=) as a byte. */
+   private final static byte EQUALS_SIGN = ( byte ) '=';
+
+
+   /** The new line character (\n) as a byte. */
+   private final static byte NEW_LINE = ( byte ) '\n';
+
+
+   /** Preferred encoding. */
+   private final static String PREFERRED_ENCODING = "UTF-8";
+
+
+   /** The 64 valid Base64 values. */
+   private final static byte[] ALPHABET;
+   private final static byte[] _NATIVE_ALPHABET =  /* May be something funny like EBCDIC */
+      {
+         ( byte ) 'A', ( byte ) 'B', ( byte ) 'C', ( byte ) 'D', ( byte ) 'E', ( byte ) 'F', ( byte ) 'G',
+         ( byte ) 'H', ( byte ) 'I', ( byte ) 'J', ( byte ) 'K', ( byte ) 'L', ( byte ) 'M', ( byte ) 'N',
+         ( byte ) 'O', ( byte ) 'P', ( byte ) 'Q', ( byte ) 'R', ( byte ) 'S', ( byte ) 'T', ( byte ) 'U',
+         ( byte ) 'V', ( byte ) 'W', ( byte ) 'X', ( byte ) 'Y', ( byte ) 'Z',
+         ( byte ) 'a', ( byte ) 'b', ( byte ) 'c', ( byte ) 'd', ( byte ) 'e', ( byte ) 'f', ( byte ) 'g',
+         ( byte ) 'h', ( byte ) 'i', ( byte ) 'j', ( byte ) 'k', ( byte ) 'l', ( byte ) 'm', ( byte ) 'n',
+         ( byte ) 'o', ( byte ) 'p', ( byte ) 'q', ( byte ) 'r', ( byte ) 's', ( byte ) 't', ( byte ) 'u',
+         ( byte ) 'v', ( byte ) 'w', ( byte ) 'x', ( byte ) 'y', ( byte ) 'z',
+         ( byte ) '0', ( byte ) '1', ( byte ) '2', ( byte ) '3', ( byte ) '4', ( byte ) '5',
+         ( byte ) '6', ( byte ) '7', ( byte ) '8', ( byte ) '9', ( byte ) '+', ( byte ) '/'
+      };
+
+   /** Determine which ALPHABET to use. */
+   static
+   {
+      byte[] __bytes;
+      try {
+         __bytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes( PREFERRED_ENCODING );
+      }   // end try
+      catch ( java.io.UnsupportedEncodingException use ) {
+         __bytes = _NATIVE_ALPHABET; // Fall back to native encoding
+      }   // end catch
+
+      ALPHABET = __bytes;
+   }   // end static
+
+
+   /**
+    * Translates a Base64 value to either its 6-bit reconstruction value
+    * or a negative number indicating some other meaning.
+    **/
+   private final static byte[] DECODABET =
+      {
+         -9, -9, -9, -9, -9, -9, -9, -9, -9,                  // Decimal  0 -  8
+         -5, -5,                                       // Whitespace: Tab and Linefeed
+         -9, -9,                                       // Decimal 11 - 12
+         -5,                                          // Whitespace: Carriage Return
+         -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,      // Decimal 14 - 26
+         -9, -9, -9, -9, -9,                              // Decimal 27 - 31
+         -5,                                          // Whitespace: Space
+         -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,               // Decimal 33 - 42
+         62,                                          // Plus sign at decimal 43
+         -9, -9, -9,                                    // Decimal 44 - 46
+         63,                                          // Slash at decimal 47
+         52, 53, 54, 55, 56, 57, 58, 59, 60, 61,               // Numbers zero through nine
+         -9, -9, -9,                                    // Decimal 58 - 60
+         -1,                                          // Equals sign at decimal 61
+         -9, -9, -9,                                       // Decimal 62 - 64
+         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,             // Letters 'A' through 'N'
+         14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,         // Letters 'O' through 'Z'
+         -9, -9, -9, -9, -9, -9,                           // Decimal 91 - 96
+         26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,      // Letters 'a' through 'm'
+         39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,      // Letters 'n' through 'z'
+         -9, -9, -9, -9                                 // Decimal 123 - 126
+         /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 127 - 139
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 140 - 152
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 153 - 165
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 166 - 178
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 179 - 191
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 192 - 204
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 205 - 217
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 218 - 230
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,     // Decimal 231 - 243
+         -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9         // Decimal 244 - 255 */
+      };
+
+   // I think I end up not using the BAD_ENCODING indicator.
+   //private final static byte BAD_ENCODING    = -9; // Indicates error in encoding
+   private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
+   private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
+
+
+   /** Defeats instantiation. */
+   private Base64() {}
+
+
+
+   /* ********  E N C O D I N G   M E T H O D S  ******** */
+
+
+   /**
+    * Encodes up to the first three bytes of array <var>threeBytes</var>
+    * and returns a four-byte array in Base64 notation.
+    * The actual number of significant bytes in your array is
+    * given by <var>numSigBytes</var>.
+    * The array <var>threeBytes</var> needs only be as big as
+    * <var>numSigBytes</var>.
+    * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
+    *
+    * @param b4 A reusable byte array to reduce array instantiation
+    * @param threeBytes the array to convert
+    * @param numSigBytes the number of significant bytes in your array
+    * @return four byte array in Base64 notation.
+    * @since 1.5.1
+    */
+   private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes ) {
+      encode3to4( threeBytes, 0, numSigBytes, b4, 0 );
+      return b4;
+   }   // end encode3to4
+
+
+   /**
+    * Encodes up to three bytes of the array <var>source</var>
+    * and writes the resulting four Base64 bytes to <var>destination</var>.
+    * The source and destination arrays can be manipulated
+    * anywhere along their length by specifying 
+    * <var>srcOffset</var> and <var>destOffset</var>.
+    * This method does not check to make sure your arrays
+    * are large enough to accomodate <var>srcOffset</var> + 3 for
+    * the <var>source</var> array or <var>destOffset</var> + 4 for
+    * the <var>destination</var> array.
+    * The actual number of significant bytes in your array is
+    * given by <var>numSigBytes</var>.
+    *
+    * @param source the array to convert
+    * @param srcOffset the index where conversion begins
+    * @param numSigBytes the number of significant bytes in your array
+    * @param destination the array to hold the conversion
+    * @param destOffset the index where output will be put
+    * @return the <var>destination</var> array
+    * @since 1.3
+    */
+   private static byte[] encode3to4(
+      byte[] source, int srcOffset, int numSigBytes,
+      byte[] destination, int destOffset ) {
+      //           1         2         3
+      // 01234567890123456789012345678901 Bit position
+      // --------000000001111111122222222 Array position from threeBytes
+      // --------|    ||    ||    ||    | Six bit groups to index ALPHABET
+      //          >>18  >>12  >> 6  >> 0  Right shift necessary
+      //                0x3f  0x3f  0x3f  Additional AND
+
+      // Create buffer with zero-padding if there are only one or two
+      // significant bytes passed in the array.
+      // We have to shift left 24 in order to flush out the 1's that appear
+      // when Java treats a value as negative that is cast from a byte to an int.
+      int inBuff = ( numSigBytes > 0 ? ( ( source[ srcOffset ] << 24 ) >>> 8 ) : 0 )
+            | ( numSigBytes > 1 ? ( ( source[ srcOffset + 1 ] << 24 ) >>> 16 ) : 0 )
+            | ( numSigBytes > 2 ? ( ( source[ srcOffset + 2 ] << 24 ) >>> 24 ) : 0 );
+
+      switch ( numSigBytes ) {
+         case 3:
+            destination[ destOffset ] = ALPHABET[ ( inBuff >>> 18 ) ];
+            destination[ destOffset + 1 ] = ALPHABET[ ( inBuff >>> 12 ) & 0x3f ];
+            destination[ destOffset + 2 ] = ALPHABET[ ( inBuff >>> 6 ) & 0x3f ];
+            destination[ destOffset + 3 ] = ALPHABET[ ( inBuff ) & 0x3f ];
+            return destination;
+
+         case 2:
+            destination[ destOffset ] = ALPHABET[ ( inBuff >>> 18 ) ];
+            destination[ destOffset + 1 ] = ALPHABET[ ( inBuff >>> 12 ) & 0x3f ];
+            destination[ destOffset + 2 ] = ALPHABET[ ( inBuff >>> 6 ) & 0x3f ];
+            destination[ destOffset + 3 ] = EQUALS_SIGN;
+            return destination;
+
+         case 1:
+            destination[ destOffset ] = ALPHABET[ ( inBuff >>> 18 ) ];
+            destination[ destOffset + 1 ] = ALPHABET[ ( inBuff >>> 12 ) & 0x3f ];
+            destination[ destOffset + 2 ] = EQUALS_SIGN;
+            destination[ destOffset + 3 ] = EQUALS_SIGN;
+            return destination;
+
+         default:
+            return destination;
+      }   // end switch
+   }   // end encode3to4
+
+
+
+   /**
+    * Serializes an object and returns the Base64-encoded
+    * version of that serialized object. If the object
+    * cannot be serialized or there is another error,
+    * the method will return <tt>null</tt>.
+    * The object is not GZip-compressed before being encoded.
+    *
+    * @param serializableObject The object to encode
+    * @return The Base64-encoded object
+    * @since 1.4
+    */
+   public static String encodeObject( java.io.Serializable serializableObject ) {
+      return encodeObject( serializableObject, NO_OPTIONS );
+   }   // end encodeObject
+
+
+
+   /**
+    * Serializes an object and returns the Base64-encoded
+    * version of that serialized object. If the object
+    * cannot be serialized or there is another error,
+    * the method will return <tt>null</tt>.
+    * <p>
+    * Valid options:<pre>
+    *   GZIP: gzip-compresses object before encoding it.
+    *   DONT_BREAK_LINES: don't break lines at 76 characters
+    *     <i>Note: Technically, this makes your encoding non-compliant.</i>
+    * </pre>
+    * <p>
+    * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
+    * <p>
+    * Example: <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+    *
+    * @param serializableObject The object to encode
+    * @param options Specified options
+    * @return The Base64-encoded object
+    * @see Base64#GZIP
+    * @see Base64#DONT_BREAK_LINES
+    * @since 2.0
+    */
+   public static String encodeObject( java.io.Serializable serializableObject, int options ) {
+      // Streams
+      java.io.ByteArrayOutputStream baos = null;
+      java.io.OutputStream b64os = null;
+      java.io.ObjectOutputStream oos = null;
+      java.util.zip.GZIPOutputStream gzos = null;
+
+      // Isolate options
+      int gzip = ( options & GZIP );
+      int dontBreakLines = ( options & DONT_BREAK_LINES );
+
+      try {
+         // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
+         baos = new java.io.ByteArrayOutputStream();
+         b64os = new Base64.OutputStream( baos, ENCODE | dontBreakLines );
+
+         // GZip?
+         if ( gzip == GZIP ) {
+            gzos = new java.util.zip.GZIPOutputStream( b64os );
+            oos = new java.io.ObjectOutputStream( gzos );
+         }   // end if: gzip
+         else
+            oos = new java.io.ObjectOutputStream( b64os );
+
+         oos.writeObject( serializableObject );
+      }   // end try
+      catch ( java.io.IOException e ) {
+         e.printStackTrace();
+         return null;
+      }   // end catch
+      finally {
+         try {
+            oos.close();
+         }
+         catch ( Exception e ) {}
+         try {
+            gzos.close();
+         }
+         catch ( Exception e ) {}
+         try {
+            b64os.close();
+         }
+         catch ( Exception e ) {}
+         try {
+            baos.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+      // Return value according to relevant encoding.
+
+      try {
+         return new String( baos.toByteArray(), PREFERRED_ENCODING );
+      }   // end try
+      catch ( java.io.UnsupportedEncodingException uue ) {
+         return new String( baos.toByteArray() );
+      }   // end catch
+
+   }   // end encode
+
+
+
+   /**
+    * Encodes a byte array into Base64 notation.
+    * Does not GZip-compress data.
+    *
+    * @param source The data to convert
+    * @since 1.4
+    */
+   public static String encodeBytes( byte[] source ) {
+      return encodeBytes( source, 0, source.length, NO_OPTIONS );
+   }   // end encodeBytes
+
+
+
+   /**
+    * Encodes a byte array into Base64 notation.
+    * <p>
+    * Valid options:<pre>
+    *   GZIP: gzip-compresses object before encoding it.
+    *   DONT_BREAK_LINES: don't break lines at 76 characters
+    *     <i>Note: Technically, this makes your encoding non-compliant.</i>
+    * </pre>
+    * <p>
+    * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+    * <p>
+    * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+    *
+    *
+    * @param source The data to convert
+    * @param options Specified options
+    * @see Base64#GZIP
+    * @see Base64#DONT_BREAK_LINES
+    * @since 2.0
+    */
+   public static String encodeBytes( byte[] source, int options ) {
+      return encodeBytes( source, 0, source.length, options );
+   }   // end encodeBytes
+
+
+   /**
+    * Encodes a byte array into Base64 notation.
+    * Does not GZip-compress data.
+    *
+    * @param source The data to convert
+    * @param off Offset in array where conversion should begin
+    * @param len Length of data to convert
+    * @since 1.4
+    */
+   public static String encodeBytes( byte[] source, int off, int len ) {
+      return encodeBytes( source, off, len, NO_OPTIONS );
+   }   // end encodeBytes
+
+
+
+   /**
+    * Encodes a byte array into Base64 notation.
+    * <p>
+    * Valid options:<pre>
+    *   GZIP: gzip-compresses object before encoding it.
+    *   DONT_BREAK_LINES: don't break lines at 76 characters
+    *     <i>Note: Technically, this makes your encoding non-compliant.</i>
+    * </pre>
+    * <p>
+    * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+    * <p>
+    * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+    *
+    *
+    * @param source The data to convert
+    * @param off Offset in array where conversion should begin
+    * @param len Length of data to convert
+    * @param options Specified options
+    * @see Base64#GZIP
+    * @see Base64#DONT_BREAK_LINES
+    * @since 2.0
+    */
+   public static String encodeBytes( byte[] source, int off, int len, int options ) {
+      // Isolate options
+      int dontBreakLines = ( options & DONT_BREAK_LINES );
+      int gzip = ( options & GZIP );
+
+      // Compress?
+      if ( gzip == GZIP ) {
+         java.io.ByteArrayOutputStream baos = null;
+         java.util.zip.GZIPOutputStream gzos = null;
+         Base64.OutputStream b64os = null;
+
+
+         try {
+            // GZip -> Base64 -> ByteArray
+            baos = new java.io.ByteArrayOutputStream();
+            b64os = new Base64.OutputStream( baos, ENCODE | dontBreakLines );
+            gzos = new java.util.zip.GZIPOutputStream( b64os );
+
+            gzos.write( source, off, len );
+            gzos.close();
+         }   // end try
+         catch ( java.io.IOException e ) {
+            e.printStackTrace();
+            return null;
+         }   // end catch
+         finally {
+            try {
+               gzos.close();
+            }
+            catch ( Exception e ) {}
+            try {
+               b64os.close();
+            }
+            catch ( Exception e ) {}
+            try {
+               baos.close();
+            }
+            catch ( Exception e ) {}
+         }   // end finally
+
+         // Return value according to relevant encoding.
+
+         try {
+            return new String( baos.toByteArray(), PREFERRED_ENCODING );
+         }   // end try
+         catch ( java.io.UnsupportedEncodingException uue ) {
+            return new String( baos.toByteArray() );
+         }   // end catch
+      }   // end if: compress
+
+      // Else, don't compress. Better not to use streams at all then.
+
+      else {
+         // Convert option to boolean in way that code likes it.
+         boolean breakLines = dontBreakLines == 0;
+
+         int len43 = len * 4 / 3;
+         byte[] outBuff = new byte[ ( len43 )                       // Main 4:3
+               + ( ( len % 3 ) > 0 ? 4 : 0 )       // Account for padding
+               + ( breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0 ) ]; // New lines
+         int d = 0;
+         int e = 0;
+         int len2 = len - 2;
+         int lineLength = 0;
+         for ( ; d < len2; d += 3, e += 4 ) {
+            encode3to4( source, d + off, 3, outBuff, e );
+
+            lineLength += 4;
+            if ( breakLines && lineLength == MAX_LINE_LENGTH ) {
+               outBuff[ e + 4 ] = NEW_LINE;
+               e++;
+               lineLength = 0;
+            }   // end if: end of line
+         }   // en dfor: each piece of array
+
+
+         if ( d < len ) {
+            encode3to4( source, d + off, len - d, outBuff, e );
+            e += 4;
+         }   // end if: some padding needed
+
+
+         // Return value according to relevant encoding.
+         try {
+            return new String( outBuff, 0, e, PREFERRED_ENCODING );
+         }   // end try
+         catch ( java.io.UnsupportedEncodingException uue ) {
+            return new String( outBuff, 0, e );
+         }   // end catch
+
+      }   // end else: don't compress
+
+   }   // end encodeBytes
+
+
+
+
+
+   /* ********  D E C O D I N G   M E T H O D S  ******** */
+
+
+   /**
+    * Decodes four bytes from array <var>source</var>
+    * and writes the resulting bytes (up to three of them)
+    * to <var>destination</var>.
+    * The source and destination arrays can be manipulated
+    * anywhere along their length by specifying 
+    * <var>srcOffset</var> and <var>destOffset</var>.
+    * This method does not check to make sure your arrays
+    * are large enough to accomodate <var>srcOffset</var> + 4 for
+    * the <var>source</var> array or <var>destOffset</var> + 3 for
+    * the <var>destination</var> array.
+    * This method returns the actual number of bytes that 
+    * were converted from the Base64 encoding.
+    * 
+    *
+    * @param source the array to convert
+    * @param srcOffset the index where conversion begins
+    * @param destination the array to hold the conversion
+    * @param destOffset the index where output will be put
+    * @return the number of decoded bytes converted
+    * @since 1.3
+    */
+   private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset ) {
+      // Example: Dk==
+      if ( source[ srcOffset + 2 ] == EQUALS_SIGN ) {
+         // Two ways to do the same thing. Don't know which way I like best.
+         //int outBuff =   ( ( DECODABET[ source[ srcOffset    ] ] << 24 ) >>>  6 )
+         //              | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
+         int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+               | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 );
+
+         destination[ destOffset ] = ( byte ) ( outBuff >>> 16 );
+         return 1;
+      }
+
+      // Example: DkL=
+      else if ( source[ srcOffset + 3 ] == EQUALS_SIGN ) {
+         // Two ways to do the same thing. Don't know which way I like best.
+         //int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] << 24 ) >>>  6 )
+         //              | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+         //              | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
+         int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+               | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+               | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 );
+
+         destination[ destOffset ] = ( byte ) ( outBuff >>> 16 );
+         destination[ destOffset + 1 ] = ( byte ) ( outBuff >>> 8 );
+         return 2;
+      }
+
+      // Example: DkLE
+      else {
+         try {
+            // Two ways to do the same thing. Don't know which way I like best.
+            //int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] << 24 ) >>>  6 )
+            //              | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+            //              | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
+            //              | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
+            int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+                  | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+                  | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 )
+                  | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) );
+
+
+            destination[ destOffset ] = ( byte ) ( outBuff >> 16 );
+            destination[ destOffset + 1 ] = ( byte ) ( outBuff >> 8 );
+            destination[ destOffset + 2 ] = ( byte ) ( outBuff );
+
+            return 3;
+         }
+         catch ( Exception e ) {
+            System.out.println( "" + source[ srcOffset ] + ": " + ( DECODABET[ source[ srcOffset ] ] ) );
+            System.out.println( "" + source[ srcOffset + 1 ] + ": " + ( DECODABET[ source[ srcOffset + 1 ] ] ) );
+            System.out.println( "" + source[ srcOffset + 2 ] + ": " + ( DECODABET[ source[ srcOffset + 2 ] ] ) );
+            System.out.println( "" + source[ srcOffset + 3 ] + ": " + ( DECODABET[ source[ srcOffset + 3 ] ] ) );
+            return -1;
+         }   //e nd catch
+      }
+   }   // end decodeToBytes
+
+
+
+
+   /**
+    * Very low-level access to decoding ASCII characters in
+    * the form of a byte array. Does not support automatically
+    * gunzipping or any other "fancy" features.
+    *
+    * @param source The Base64 encoded data
+    * @param off    The offset of where to begin decoding
+    * @param len    The length of characters to decode
+    * @return decoded data
+    * @since 1.3
+    */
+   public static byte[] decode( byte[] source, int off, int len ) {
+      int len34 = len * 3 / 4;
+      byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output
+      int outBuffPosn = 0;
+
+      byte[] b4 = new byte[ 4 ];
+      int b4Posn = 0;
+      int i = 0;
+      byte sbiCrop = 0;
+      byte sbiDecode = 0;
+      for ( i = off; i < off + len; i++ ) {
+         sbiCrop = ( byte ) ( source[ i ] & 0x7f ); // Only the low seven bits
+         sbiDecode = DECODABET[ sbiCrop ];
+
+         if ( sbiDecode >= WHITE_SPACE_ENC )  // White space, Equals sign or better
+         {
+            if ( sbiDecode >= EQUALS_SIGN_ENC ) {
+               b4[ b4Posn++ ] = sbiCrop;
+               if ( b4Posn > 3 ) {
+                  outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn );
+                  b4Posn = 0;
+
+                  // If that was the equals sign, break out of 'for' loop
+                  if ( sbiCrop == EQUALS_SIGN )
+                     break;
+               }   // end if: quartet built
+
+            }   // end if: equals sign or better
+
+         }   // end if: white space, equals sign or better
+
+         else {
+            System.err.println( "Bad Base64 input character at " + i + ": " + source[ i ] + "(decimal)" );
+            return null;
+         }   // end else:
+      }   // each input character
+
+
+      byte[] out = new byte[ outBuffPosn ];
+      System.arraycopy( outBuff, 0, out, 0, outBuffPosn );
+      return out;
+   }   // end decode
+
+
+
+
+   /**
+    * Decodes data from Base64 notation, automatically
+    * detecting gzip-compressed data and decompressing it.
+    *
+    * @param s the string to decode
+    * @return the decoded data
+    * @since 1.4
+    */
+   public static byte[] decode( String s ) {
+      byte[] bytes;
+      try {
+         bytes = s.getBytes( PREFERRED_ENCODING );
+      }   // end try
+      catch ( java.io.UnsupportedEncodingException uee ) {
+         bytes = s.getBytes();
+      }   // end catch
+      //</change>
+
+      // Decode
+      bytes = decode( bytes, 0, bytes.length );
+
+
+      // Check to see if it's gzip-compressed
+      // GZIP Magic Two-Byte Number: 0x8b1f (35615)
+      if ( bytes != null && bytes.length >= 4 ) {
+
+         int head = ( ( int ) bytes[ 0 ] & 0xff ) | ( ( bytes[ 1 ] << 8 ) & 0xff00 );
+         if ( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) {
+            java.io.ByteArrayInputStream bais = null;
+            java.util.zip.GZIPInputStream gzis = null;
+            java.io.ByteArrayOutputStream baos = null;
+            byte[] buffer = new byte[ 2048 ];
+            int length = 0;
+
+            try {
+               baos = new java.io.ByteArrayOutputStream();
+               bais = new java.io.ByteArrayInputStream( bytes );
+               gzis = new java.util.zip.GZIPInputStream( bais );
+
+               while ( ( length = gzis.read( buffer ) ) >= 0 ) {
+                  baos.write( buffer, 0, length );
+               }   // end while: reading input
+
+               // No error? Get new bytes.
+               bytes = baos.toByteArray();
+
+            }   // end try
+            catch ( java.io.IOException e ) {
+               // Just return originally-decoded bytes
+            }   // end catch
+
+            finally {
+               try {
+                  baos.close();
+               }
+               catch ( Exception e ) {}
+               try {
+                  gzis.close();
+               }
+               catch ( Exception e ) {}
+               try {
+                  bais.close();
+               }
+               catch ( Exception e ) {}
+            }   // end finally
+
+         }   // end if: gzipped
+      }   // end if: bytes.length >= 2
+
+
+      return bytes;
+   }   // end decode
+
+
+
+
+   /**
+    * Attempts to decode Base64 data and deserialize a Java
+    * Object within. Returns <tt>null</tt> if there was an error.
+    *
+    * @param encodedObject The Base64 data to decode
+    * @return The decoded and deserialized object
+    * @since 1.5
+    */
+   public static Object decodeToObject( String encodedObject ) {
+      // Decode and gunzip if necessary
+      byte[] objBytes = decode( encodedObject );
+
+      java.io.ByteArrayInputStream bais = null;
+      java.io.ObjectInputStream ois = null;
+      Object obj = null;
+
+      try {
+         bais = new java.io.ByteArrayInputStream( objBytes );
+         ois = new java.io.ObjectInputStream( bais );
+
+         obj = ois.readObject();
+      }   // end try
+      catch ( java.io.IOException e ) {
+         e.printStackTrace();
+         obj = null;
+      }   // end catch
+      catch ( java.lang.ClassNotFoundException e ) {
+         e.printStackTrace();
+         obj = null;
+      }   // end catch
+      finally {
+         try {
+            bais.close();
+         }
+         catch ( Exception e ) {}
+         try {
+            ois.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+
+      return obj;
+   }   // end decodeObject
+
+
+
+   /**
+    * Convenience method for encoding data to a file.
+    *
+    * @param dataToEncode byte array of data to encode in base64 form
+    * @param filename Filename for saving encoded data
+    * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+    *
+    * @since 2.1
+    */
+   public static boolean encodeToFile( byte[] dataToEncode, String filename ) {
+      boolean success = false;
+      Base64.OutputStream bos = null;
+      try {
+         bos = new Base64.OutputStream(
+                  new java.io.FileOutputStream( filename ), Base64.ENCODE );
+         bos.write( dataToEncode );
+         success = true;
+      }   // end try
+      catch ( java.io.IOException e ) {
+
+         success = false;
+      }   // end catch: IOException
+      finally {
+         try {
+            bos.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+
+      return success;
+   }   // end encodeToFile
+
+
+   /**
+    * Convenience method for decoding data to a file.
+    *
+    * @param dataToDecode Base64-encoded data as a string
+    * @param filename Filename for saving decoded data
+    * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+    *
+    * @since 2.1
+    */
+   public static boolean decodeToFile( String dataToDecode, String filename ) {
+      boolean success = false;
+      Base64.OutputStream bos = null;
+      try {
+         bos = new Base64.OutputStream(
+                  new java.io.FileOutputStream( filename ), Base64.DECODE );
+         bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) );
+         success = true;
+      }   // end try
+      catch ( java.io.IOException e ) {
+         success = false;
+      }   // end catch: IOException
+      finally {
+         try {
+            bos.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+
+      return success;
+   }   // end decodeToFile
+
+
+
+
+   /**
+    * Convenience method for reading a base64-encoded
+    * file and decoding it.
+    *
+    * @param filename Filename for reading encoded data
+    * @return decoded byte array or null if unsuccessful
+    *
+    * @since 2.1
+    */
+   public static byte[] decodeFromFile( String filename ) {
+      byte[] decodedData = null;
+      Base64.InputStream bis = null;
+      try {
+         // Set up some useful variables
+         java.io.File file = new java.io.File( filename );
+         byte[] buffer = null;
+         int length = 0;
+         int numBytes = 0;
+
+         // Check for size of file
+         if ( file.length() > Integer.MAX_VALUE ) {
+            System.err.println( "File is too big for this convenience method (" + file.length() + " bytes)." );
+            return null;
+         }   // end if: file too big for int index
+         buffer = new byte[ ( int ) file.length() ];
+
+         // Open a stream
+         bis = new Base64.InputStream(
+                  new java.io.BufferedInputStream(
+                     new java.io.FileInputStream( file ) ), Base64.DECODE );
+
+         // Read until done
+         while ( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+            length += numBytes;
+
+         // Save in a variable to return
+         decodedData = new byte[ length ];
+         System.arraycopy( buffer, 0, decodedData, 0, length );
+
+      }   // end try
+      catch ( java.io.IOException e ) {
+         System.err.println( "Error decoding from file " + filename );
+      }   // end catch: IOException
+      finally {
+         try {
+            bis.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+
+      return decodedData;
+   }   // end decodeFromFile
+
+
+
+   /**
+    * Convenience method for reading a binary file
+    * and base64-encoding it.
+    *
+    * @param filename Filename for reading binary data
+    * @return base64-encoded string or null if unsuccessful
+    *
+    * @since 2.1
+    */
+   public static String encodeFromFile( String filename ) {
+      String encodedData = null;
+      Base64.InputStream bis = null;
+      try {
+         // Set up some useful variables
+         java.io.File file = new java.io.File( filename );
+         byte[] buffer = new byte[ ( int ) ( file.length() * 1.4 ) ];
+         int length = 0;
+         int numBytes = 0;
+
+         // Open a stream
+         bis = new Base64.InputStream(
+                  new java.io.BufferedInputStream(
+                     new java.io.FileInputStream( file ) ), Base64.ENCODE );
+
+         // Read until done
+         while ( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+            length += numBytes;
+
+         // Save in a variable to return
+         encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING );
+
+      }   // end try
+      catch ( java.io.IOException e ) {
+         System.err.println( "Error encoding from file " + filename );
+      }   // end catch: IOException
+      finally {
+         try {
+            bis.close();
+         }
+         catch ( Exception e ) {}
+      }   // end finally
+
+
+      return encodedData;
+   }   // end encodeFromFile
+
+
+
+
+   /* ********  I N N E R   C L A S S   I N P U T S T R E A M  ******** */
+
+
+
+   /**
+    * A {@link Base64.InputStream} will read data from another
+    * <tt>java.io.InputStream</tt>, given in the constructor,
+    * and encode/decode to/from Base64 notation on the fly.
+    *
+    * @see Base64
+    * @since 1.3
+    */
+   public static class InputStream extends java.io.FilterInputStream {
+      private boolean encode;         // Encoding or decoding
+      private int position;       // Current position in the buffer
+      private byte[] buffer;         // Small buffer holding converted data
+      private int bufferLength;   // Length of buffer (3 or 4)
+      private int numSigBytes;    // Number of meaningful bytes in the buffer
+      private int lineLength;
+      private boolean breakLines;     // Break lines at less than 80 characters
+
+
+      /**
+       * Constructs a {@link Base64.InputStream} in DECODE mode.
+       *
+       * @param in the <tt>java.io.InputStream</tt> from which to read data.
+       * @since 1.3
+       */
+      public InputStream( java.io.InputStream in ) {
+         this( in, DECODE );
+      }   // end constructor
+
+
+      /**
+       * Constructs a {@link Base64.InputStream} in
+       * either ENCODE or DECODE mode.
+       * <p>
+       * Valid options:<pre>
+       *   ENCODE or DECODE: Encode or Decode as data is read.
+       *   DONT_BREAK_LINES: don't break lines at 76 characters
+       *     (only meaningful when encoding)
+       *     <i>Note: Technically, this makes your encoding non-compliant.</i>
+       * </pre>
+       * <p>
+       * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
+       *
+       *
+       * @param in the <tt>java.io.InputStream</tt> from which to read data.
+       * @param options Specified options
+       * @see Base64#ENCODE
+       * @see Base64#DECODE
+       * @see Base64#DONT_BREAK_LINES
+       * @since 2.0
+       */
+      public InputStream( java.io.InputStream in, int options ) {
+         super( in );
+         this.breakLines = ( options & DONT_BREAK_LINES ) != DONT_BREAK_LINES;
+         this.encode = ( options & ENCODE ) == ENCODE;
+         this.bufferLength = encode ? 4 : 3;
+         this.buffer = new byte[ bufferLength ];
+         this.position = -1;
+         this.lineLength = 0;
+      }   // end constructor
+
+      /**
+       * Reads enough of the input stream to convert
+       * to/from Base64 and returns the next byte.
+       *
+       * @return next byte
+       * @since 1.3
+       */
+      public int read() throws java.io.IOException {
+         // Do we need to get data?
+         if ( position < 0 ) {
+            if ( encode ) {
+               byte[] b3 = new byte[ 3 ];
+               int numBinaryBytes = 0;
+               for ( int i = 0; i < 3; i++ ) {
+                  try {
+                     int b = in.read();
+
+                     // If end of stream, b is -1.
+                     if ( b >= 0 ) {
+                        b3[ i ] = ( byte ) b;
+                        numBinaryBytes++;
+                     }   // end if: not end of stream
+
+                  }   // end try: read
+
+                  catch ( java.io.IOException e ) {
+                     // Only a problem if we got no data at all.
+                     if ( i == 0 )
+                        throw e;
+
+                  }   // end catch
+               }   // end for: each needed input byte
+
+
+               if ( numBinaryBytes > 0 ) {
+                  encode3to4( b3, 0, numBinaryBytes, buffer, 0 );
+                  position = 0;
+                  numSigBytes = 4;
+               }   // end if: got data
+               else {
+                  return -1;
+               }   // end else
+            }   // end if: encoding
+
+            // Else decoding
+
+            else {
+               byte[] b4 = new byte[ 4 ];
+               int i = 0;
+               for ( i = 0; i < 4; i++ ) {
+                  // Read four "meaningful" bytes:
+                  int b = 0;
+                  do {
+                     b = in.read();
+                  }
+                  while ( b >= 0 && DECODABET[ b & 0x7f ] <= WHITE_SPACE_ENC );
+
+                  if ( b < 0 )
+                     break; // Reads a -1 if end of stream
+
+                  b4[ i ] = ( byte ) b;
+               }   // end for: each needed input byte
+
+               if ( i == 4 ) {
+                  numSigBytes = decode4to3( b4, 0, buffer, 0 );
+                  position = 0;
+               }   // end if: got four characters
+               else if ( i == 0 ) {
+                  return -1;
+               }   // end else if: also padded correctly
+               else {
+                  // Must have broken out from above.
+                  throw new java.io.IOException( "Improperly padded Base64 input." );
+               }   // end
+
+            }   // end else: decode
+         }   // end else: get data
+
+         // Got data?
+
+         if ( position >= 0 ) {
+            // End of relevant data?
+            if (  /*!encode &&*/ position >= numSigBytes )
+               return -1;
+
+            if ( encode && breakLines && lineLength >= MAX_LINE_LENGTH ) {
+               lineLength = 0;
+               return '\n';
+            }   // end if
+            else {
+               lineLength++;   // This isn't important when decoding
+               // but throwing an extra "if" seems
+               // just as wasteful.
+
+               int b = buffer[ position++ ];
+
+               if ( position >= bufferLength )
+                  position = -1;
+
+               return b & 0xFF; // This is how you "cast" a byte that's
+               // intended to be unsigned.
+            }   // end else
+         }   // end if: position >= 0
+
+         // Else error
+
+         else {
+            // When JDK1.4 is more accepted, use an assertion here.
+            throw new java.io.IOException( "Error in Base64 code reading stream." );
+         }   // end else
+      }   // end read
+
+
+      /**
+       * Calls {@link #read()} repeatedly until the end of stream
+       * is reached or <var>len</var> bytes are read.
+       * Returns number of bytes read into array or -1 if
+       * end of stream is encountered.
+       *
+       * @param dest array to hold values
+       * @param off offset for array
+       * @param len max number of bytes to read into array
+       * @return bytes read into array or -1 if end of stream is encountered.
+       * @since 1.3
+       */
+      public int read( byte[] dest, int off, int len ) throws java.io.IOException {
+         int i;
+         int b;
+         for ( i = 0; i < len; i++ ) {
+            b = read();
+
+            //if( b < 0 && i == 0 )
+            //    return -1;
+
+            if ( b >= 0 )
+               dest[ off + i ] = ( byte ) b;
+            else if ( i == 0 )
+               return -1;
+            else
+               break; // Out of 'for' loop
+         }   // end for: each byte read
+
+         return i;
+      }   // end read
+
+   }   // end inner class InputStream
+
+
+
+
+
+
+   /* ********  I N N E R   C L A S S   O U T P U T S T R E A M  ******** */
+
+
+
+   /**
+    * A {@link Base64.OutputStream} will write data to another
+    * <tt>java.io.OutputStream</tt>, given in the constructor,
+    * and encode/decode to/from Base64 notation on the fly.
+    *
+    * @see Base64
+    * @since 1.3
+    */
+   public static class OutputStream extends java.io.FilterOutputStream {
+      private boolean encode;
+      private int position;
+      private byte[] buffer;
+      private int bufferLength;
+      private int lineLength;
+      private boolean breakLines;
+      private byte[] b4; // Scratch used in a few places
+      private boolean suspendEncoding;
+
+      /**
+       * Constructs a {@link Base64.OutputStream} in ENCODE mode.
+       *
+       * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+       * @since 1.3
+       */
+      public OutputStream( java.io.OutputStream out ) {
+         this( out, ENCODE );
+      }   // end constructor
+
+
+      /**
+       * Constructs a {@link Base64.OutputStream} in
+       * either ENCODE or DECODE mode.
+       * <p>
+       * Valid options:<pre>
+       *   ENCODE or DECODE: Encode or Decode as data is read.
+       *   DONT_BREAK_LINES: don't break lines at 76 characters
+       *     (only meaningful when encoding)
+       *     <i>Note: Technically, this makes your encoding non-compliant.</i>
+       * </pre>
+       * <p>
+       * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
+       *
+       * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+       * @param options Specified options.
+       * @see Base64#ENCODE
+       * @see Base64#DECODE
+       * @see Base64#DONT_BREAK_LINES
+       * @since 1.3
+       */
+      public OutputStream( java.io.OutputStream out, int options ) {
+         super( out );
+         this.breakLines = ( options & DONT_BREAK_LINES ) != DONT_BREAK_LINES;
+         this.encode = ( options & ENCODE ) == ENCODE;
+         this.bufferLength = encode ? 3 : 4;
+         this.buffer = new byte[ bufferLength ];
+         this.position = 0;
+         this.lineLength = 0;
+         this.suspendEncoding = false;
+         this.b4 = new byte[ 4 ];
+      }   // end constructor
+
+
+      /**
+       * Writes the byte to the output stream after
+       * converting to/from Base64 notation.
+       * When encoding, bytes are buffered three
+       * at a time before the output stream actually
+       * gets a write() call.
+       * When decoding, bytes are buffered four
+       * at a time.
+       *
+       * @param theByte the byte to write
+       * @since 1.3
+       */
+      public void write( int theByte ) throws java.io.IOException {
+         // Encoding suspended?
+         if ( suspendEncoding ) {
+            super.out.write( theByte );
+            return ;
+         }   // end if: supsended
+
+         // Encode?
+         if ( encode ) {
+            buffer[ position++ ] = ( byte ) theByte;
+            if ( position >= bufferLength )   // Enough to encode.
+            {
+               out.write( encode3to4( b4, buffer, bufferLength ) );
+
+               lineLength += 4;
+               if ( breakLines && lineLength >= MAX_LINE_LENGTH ) {
+                  out.write( NEW_LINE );
+                  lineLength = 0;
+               }   // end if: end of line
+
+               position = 0;
+            }   // end if: enough to output
+         }   // end if: encoding
+
+         // Else, Decoding
+
+         else {
+            // Meaningful Base64 character?
+            if ( DECODABET[ theByte & 0x7f ] > WHITE_SPACE_ENC ) {
+               buffer[ position++ ] = ( byte ) theByte;
+               if ( position >= bufferLength )   // Enough to output.
+               {
+                  int len = Base64.decode4to3( buffer, 0, b4, 0 );
+                  out.write( b4, 0, len );
+                  //out.write( Base64.decode4to3( buffer ) );
+                  position = 0;
+               }   // end if: enough to output
+            }   // end if: meaningful base64 character
+
+            else if ( DECODABET[ theByte & 0x7f ] != WHITE_SPACE_ENC ) {
+               throw new java.io.IOException( "Invalid character in Base64 data." );
+            }   // end else: not white space either
+         }   // end else: decoding
+      }   // end write
+
+
+
+      /**
+       * Calls {@link #write(int)} repeatedly until <var>len</var> 
+       * bytes are written.
+       *
+       * @param theBytes array from which to read bytes
+       * @param off offset for array
+       * @param len max number of bytes to read into array
+       * @since 1.3
+       */
+      public void write( byte[] theBytes, int off, int len ) throws java.io.IOException {
+         // Encoding suspended?
+         if ( suspendEncoding ) {
+            super.out.write( theBytes, off, len );
+            return ;
+         }   // end if: supsended
+
+         for ( int i = 0; i < len; i++ ) {
+            write( theBytes[ off + i ] );
+         }   // end for: each byte written
+
+      }   // end write
+
+
+
+      /**
+       * Method added by PHIL. [Thanks, PHIL. -Rob]
+       * This pads the buffer without closing the stream.
+       */
+      public void flushBase64() throws java.io.IOException {
+         if ( position > 0 ) {
+            if ( encode ) {
+               out.write( encode3to4( b4, buffer, position ) );
+               position = 0;
+            }   // end if: encoding
+            else {
+               throw new java.io.IOException( "Base64 input not properly padded." );
+            }   // end else: decoding
+         }   // end if: buffer partially full
+
+      }   // end flush
+
+
+      /**
+       * Flushes and closes (I think, in the superclass) the stream. 
+       *
+       * @since 1.3
+       */
+      public void close() throws java.io.IOException {
+         // 1. Ensure that pending characters are written
+         flushBase64();
+
+         // 2. Actually close the stream
+         // Base class both flushes and closes.
+         super.close();
+
+         buffer = null;
+         out = null;
+      }   // end close
+
+
+
+      /**
+       * Suspends encoding of the stream.
+       * May be helpful if you need to embed a piece of
+       * base640-encoded data in a stream.
+       *
+       * @since 1.5.1
+       */
+      public void suspendEncoding() throws java.io.IOException {
+         flushBase64();
+         this.suspendEncoding = true;
+      }   // end suspendEncoding
+
+
+      /**
+       * Resumes encoding of the stream.
+       * May be helpful if you need to embed a piece of
+       * base640-encoded data in a stream.
+       *
+       * @since 1.5.1
+       */
+      public void resumeEncoding() {
+         this.suspendEncoding = false;
+      }   // end resumeEncoding
+
+
+
+   }   // end inner class OutputStream
+
+   public static void main (String[] args) {
+       String command = args[0];
+       System.out.println(command);
+       String to_change = args[1];
+       System.out.println(to_change);
+       String answer = null;
+       if ("decode".equals(command)) {
+            answer = new String(Base64.decode(to_change));
+       }
+       else if ("encode".equals(command)) {
+            answer = Base64.encodeBytes(to_change.getBytes());   
+       }
+       else {
+            System.out.println("invalid command, 'decode' and 'encode' are valid commands");
+            System.exit(1);
+       }
+       System.out.println(answer);
+       System.exit(0);
+   }
+
+}   // end class Base64
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Math.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Math.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Math.java	(revision 15023)
@@ -0,0 +1,1035 @@
+package ise.antelope.tasks.util.math;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.math.BigInteger;
+import java.math.BigDecimal;
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ * Provides access to java.lang.Math and java.lang.StrictMath for Ant. Provides
+ * add, subtract, multiply, divide and mod methods as well as access to all methods
+ * java.lang.Math and java.lang.StrictMath via reflection. 
+ * <p>Copyright 2003, Dale Anson, all rights reserved
+ * @author Dale Anson, danson@germane-software.com
+ */
+public class Math {
+
+   private boolean strict = false;
+
+   public static Class BIGDECIMAL_TYPE;
+   public static Class BIGINT_TYPE;
+   static {
+      try {
+         BIGDECIMAL_TYPE = Class.forName( "java.math.BigDecimal" );
+      }
+      catch ( ClassNotFoundException e ) {
+         BIGDECIMAL_TYPE = null;
+      }
+      try {
+         BIGINT_TYPE = Class.forName( "java.math.BigInteger" );
+      }
+      catch ( Exception e ) {
+         BIGINT_TYPE = null;
+      }
+   }
+
+   public Math() {}
+
+   public Math( boolean strict ) {
+      this.strict = strict;
+   }
+
+   public void setStrict( boolean strict ) {
+      this.strict = strict;
+   }
+
+   public boolean isStrict() {
+      return strict;
+   }
+
+   public static BigDecimal add( BigDecimal a, BigDecimal b ) {
+      return a.add( b );
+   }
+
+   public static BigInteger add( BigInteger a, BigInteger b ) {
+      return a.add( b );
+   }
+
+   public static BigInteger and( BigInteger a, BigInteger b ) {
+      return a.and( b );
+   }
+
+   public static int and( int a, int b ) {
+      return a & b;
+   }
+
+   public static BigInteger or( BigInteger a, BigInteger b ) {
+      return a.or( b );
+   }
+
+   public static int or( int a, int b ) {
+      return a | b;
+   }
+
+   public static BigInteger not( BigInteger a ) {
+      return a.not();
+   }
+
+   public static int not( int a ) {
+      return ~a;
+   }
+
+   public static BigInteger xor( BigInteger a, BigInteger b ) {
+      return a.xor( b );
+   }
+
+   public static int xor( int a, int b ) {
+      return a ^ b;
+   }
+
+   public static double add( double a, double b ) {
+      return a + b;
+   }
+   public static float add( float a, float b ) {
+      return a + b;
+   }
+   public static long add( long a, long b ) {
+      return a + b;
+   }
+   public static int add( int a, int b ) {
+      return a + b;
+   }
+   public static BigInteger add( BigInteger[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigInteger b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.add( a[ i ] );
+      return b;
+   }
+   public static double add( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static float add( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static long add( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+   public static int add( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b += a[ i ];
+      return b;
+   }
+
+   public static BigDecimal subtract( BigDecimal a, BigDecimal b ) {
+      return a.subtract( b );
+   }
+
+   public static BigInteger subtract( BigInteger a, BigInteger b ) {
+      return a.subtract( b );
+   }
+
+   public static double subtract( double a, double b ) {
+      return a - b;
+   }
+   public static float subtract( float a, float b ) {
+      return a - b;
+   }
+   public static long subtract( long a, long b ) {
+      return a - b;
+   }
+   public static int subtract( int a, int b ) {
+      return a - b;
+   }
+   public static BigDecimal subtract( BigDecimal[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigDecimal b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.subtract( a[ i ] );
+      return b;
+   }
+   public static BigInteger subtract( BigInteger[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigInteger b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.subtract( a[ i ] );
+      return b;
+   }
+   public static double subtract( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static float subtract( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static long subtract( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+   public static int subtract( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b -= a[ i ];
+      return b;
+   }
+
+   public static BigDecimal multiply( BigDecimal a, BigDecimal b ) {
+      return a.multiply( b );
+   }
+
+   public static BigInteger multiply( BigInteger a, BigInteger b ) {
+      return a.multiply( b );
+   }
+
+   public static double multiply( double a, double b ) {
+      return a * b;
+   }
+   public static float multiply( float a, float b ) {
+      return a * b;
+   }
+   public static long multiply( long a, long b ) {
+      return a * b;
+   }
+   public static int multiply( int a, int b ) {
+      return a * b;
+   }
+   public static BigDecimal multiply( BigDecimal[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigDecimal b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.multiply( a[ i ] );
+      return b;
+   }
+   public static BigInteger multiply( BigInteger[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigInteger b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.multiply( a[ i ] );
+      return b;
+   }
+   public static double multiply( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static float multiply( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static long multiply( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+   public static int multiply( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b *= a[ i ];
+      return b;
+   }
+
+   public static BigDecimal divide( BigDecimal a, BigDecimal b ) {
+      try {
+         return a.divide( b, BigDecimal.ROUND_HALF_EVEN );
+      }
+      catch ( Throwable e ) {
+         return a.divide( b, BigDecimal.ROUND_HALF_EVEN );
+      }
+   }
+
+   public static BigInteger divide( BigInteger a, BigInteger b ) {
+      return a.divide( b );
+   }
+
+   public static double divide( double a, double b ) {
+      if (b == 0)
+          throw new ArithmeticException("/ by zero");
+      return a / b;
+   }
+   public static float divide( float a, float b ) {
+      if (b == 0)
+          throw new ArithmeticException("/ by zero");
+      return a / b;
+   }
+   public static long divide( long a, long b ) {
+      if (b == 0)
+          throw new ArithmeticException("/ by zero");
+      return a / b;
+   }
+   public static int divide( int a, int b ) {
+      if (b == 0)
+          throw new ArithmeticException("/ by zero");
+      return a / b;
+   }
+   public static BigDecimal divide( BigDecimal[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigDecimal b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.divide( a[ i ], BigDecimal.ROUND_HALF_EVEN );
+      return b;
+   }
+   public static BigInteger divide( BigInteger[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigInteger b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.divide( a[ i ] );
+      return b;
+   }
+   public static double divide( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ ) {
+         if (a[i] == 0)
+             throw new ArithmeticException("/ by zero");
+         b /= a[ i ];
+      }
+      return b;
+   }
+   public static float divide( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ ) {
+         if (a[i] == 0)
+             throw new ArithmeticException("/ by zero");
+         b /= a[ i ];
+      }
+      return b;
+   }
+   public static long divide( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ ) {
+         if (a[i] == 0)
+             throw new ArithmeticException("/ by zero");
+         b /= a[ i ];
+      }
+      return b;
+   }
+   public static int divide( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ ) {
+         if (a[i] == 0)
+             throw new ArithmeticException("/ by zero");
+         b /= a[ i ];
+      }
+      return b;
+   }
+
+   public static BigInteger mod( BigInteger a, BigInteger b ) {
+      return a.mod( b );
+   }
+
+   public static double mod( double a, double b ) {
+      return a % b;
+   }
+   public static float mod( float a, float b ) {
+      return a % b;
+   }
+   public static long mod( long a, long b ) {
+      return a % b;
+   }
+   public static int mod( int a, int b ) {
+      return a % b;
+   }
+   public static BigInteger mod( BigInteger[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      BigInteger b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b = b.mod( a[ i ] );
+      return b;
+   }
+   public static double mod( double[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      double b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static float mod( float[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      float b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static long mod( long[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      long b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   public static int mod( int[] a ) {
+      if ( a.length == 0 )
+         throw new IllegalArgumentException();
+      if ( a.length == 1 )
+         return a[ 0 ];
+      int b = a[ 0 ];
+      for ( int i = 1; i < a.length; i++ )
+         b %= a[ i ];
+      return b;
+   }
+   
+   // comparisons
+   public static boolean greaterThan(int x, int y) {
+      return x > y;  
+   }
+   public static boolean greaterThan(long x, long y) {
+      return x > y;  
+   }
+   public static boolean greaterThan(double x, double y) {
+      return x > y;  
+   }
+   public static boolean greaterThan(BigInteger x, BigInteger y) {
+      return x.compareTo(y) > 0;      
+   }
+   public static boolean greaterThan(BigDecimal x, BigDecimal y) {
+      return x.compareTo(y) > 0;      
+   }
+   public static boolean lessThan(int x, int y) {
+      return x < y;  
+   }
+   public static boolean lessThan(long x, long y) {
+      return x < y;  
+   }
+   public static boolean lessThan(double x, double y) {
+      return x < y;  
+   }
+   public static boolean lessThan(BigInteger x, BigInteger y) {
+      return x.compareTo(y) < 0;      
+   }
+   public static boolean lessThan(BigDecimal x, BigDecimal y) {
+      return x.compareTo(y) < 0;      
+   }
+   public static boolean equal(int x, int y) {
+      return x == y;  
+   }
+   public static boolean equal(long x, long y) {
+      return x == y;  
+   }
+   public static boolean equal(double x, double y) {
+      return x == y;  
+   }
+   public static boolean equal(BigInteger x, BigInteger y) {
+      return x.compareTo(y) == 0;      
+   }
+   public static boolean equal(BigDecimal x, BigDecimal y) {
+      return x.compareTo(y) == 0;      
+   }
+   public static boolean notEqual(int x, int y) {
+      return x != y;  
+   }
+   public static boolean notEqual(long x, long y) {
+      return x != y;  
+   }
+   public static boolean notEqual(double x, double y) {
+      return x != y;  
+   }
+   public static boolean notEqual(BigInteger x, BigInteger y) {
+      return x.compareTo(y) != 0;      
+   }
+   public static boolean notEqual(BigDecimal x, BigDecimal y) {
+      return x.compareTo(y) != 0;      
+   }
+
+   public static BigInteger factorial( BigInteger x ) {
+      if ( x.compareTo( new BigInteger( "0" ) ) < 0 )
+         throw new IllegalArgumentException( "number must be greater than 0" );
+      BigInteger y = x;
+      for ( x = x.subtract( new BigInteger( "1" ) ); x.toString().compareTo( "1" ) > 0; x = x.subtract( new BigInteger( "1" ) ) ) {
+         y = y.multiply( x );
+      }
+      return y;
+   }
+
+   public static int factorial( double x ) {
+      return factorial( ( int ) x );
+   }
+
+   public static int factorial( float x ) {
+      return factorial( ( int ) x );
+   }
+
+   public static int factorial( int x ) {
+      if ( x < 0 )
+         throw new IllegalArgumentException( "number must be greater than 0" );
+      int y = x;
+      for ( x -= 1; x > 1; x-- )
+         y *= x;
+      return y;
+   }
+
+   public static BigDecimal min( BigDecimal a, BigDecimal b ) {
+      return a.min( b );
+   }
+
+   public static BigInteger min( BigInteger a, BigInteger b ) {
+      return a.min( b );
+   }
+
+   public static BigDecimal max( BigDecimal a, BigDecimal b ) {
+      return a.max( b );
+   }
+
+   public static BigInteger max( BigInteger a, BigInteger b ) {
+      return a.max( b );
+   }
+
+   /**
+    * y raised to the x power   
+    */
+   public static BigInteger pow( BigInteger y, BigInteger x ) {
+      int exp = x.intValue();
+      if ( exp < 1 )
+         throw new IllegalArgumentException( "Exponent must be greater than 0" );
+      return y.pow( x.intValue() );
+   }
+
+   /**
+    * y raised to the x power   
+    */
+   public static BigDecimal pow( BigDecimal y, BigDecimal x ) {
+      if ( x.compareTo( new BigDecimal( "1" ) ) <= 0 ) {
+         throw new ArithmeticException( "Powers of BigDecimals must be integers greater than 1" );
+      }
+      String exp = x.toString();
+      if ( exp.indexOf( "." ) > 0 )
+         exp = exp.substring( 0, exp.indexOf( "." ) );
+      BigInteger e = new BigInteger( exp );
+      BigDecimal z = new BigDecimal( y.toString() );
+      for ( ;e.compareTo( BigInteger.ONE ) > 0; e = e.subtract( BigInteger.ONE ) ) {
+         y = y.multiply( z );
+      }
+      return y;
+   }
+   
+   /**
+    * Do a mathematical calculation. The allowed operations are all 
+    * operations supported by java.lang.Math and this class. Assumes data 
+    * type is "double".
+    * @param op the name of a mathematical operation to perform
+    * @param operands the operands for the operation, these strings must parse to numbers.  
+    */
+   public Number calculate( String op, String[] operands ) {
+      return calculate( op, "double", operands );
+   }
+
+   /**
+    * Do a mathematical calculation. The allowed operations are all 
+    * operations supported by java.lang.Math.
+    * @param op the name of a mathematical operation to perform
+    * @param type the data type of the operands
+    * @param operands the operands for the operation  
+    * @return the result of the calculation. For boolean operations, returns
+    * 1 for true, 0 for false;
+    */
+   public Number calculate( String op, String type, String[] operands ) {
+      try {
+         if ( operands.length >= 2 && ( op.equals( "add" ) ||
+                 op.equals( "subtract" ) ||
+                 op.equals( "multiply" ) ||
+                 op.equals( "divide" ) ||
+                 op.equals( "mod" ) ) ) {
+            return calculateArray( op, type, operands );
+         }
+
+         if ( operands.length > 2 )
+            throw new IllegalArgumentException( "too many operands" );
+
+         Class c;
+         Method m;
+         if ( strict )
+            c = Class.forName( "java.lang.StrictMath" );
+         else
+            c = Class.forName( "java.lang.Math" );
+
+         // check if op is 'random'. Random is a special case in that it is
+         // the only method in Math that takes no parameters.
+         if ( op.equals( "random" ) ) {
+            m = c.getDeclaredMethod( op, new Class[] {} );
+            Object result = m.invoke( c, null );
+            return ( Number ) result;
+         }
+
+         // find candidate methods for the requested operation
+         Vector candidates = new Vector();
+         Method[] methods = c.getDeclaredMethods();
+         for ( int i = 0; i < methods.length; i++ ) {
+            String name = methods[ i ].getName();
+            if ( name.equals( op ) ) {
+               candidates.addElement( new Candidate( c, methods[ i ] ) );
+            }
+         }
+
+         // also look for candidate methods in this class
+         c = this.getClass();
+         methods = c.getDeclaredMethods();
+         for ( int i = 0; i < methods.length; i++ ) {
+            String name = methods[ i ].getName();
+            if ( name.equals( op ) ) {
+               candidates.addElement( new Candidate( c, methods[ i ] ) );
+            }
+         }
+
+         if ( candidates.size() == 0 )
+            throw new RuntimeException( "Unknown operation: " + op );
+
+         // get the desired data type for the operation, default is
+         // Double.TYPE if no other match is found
+         Class wantTypeClass = getDataType( type );
+
+         // get the parameter count for the candidate methods -- in Math,
+         // all like named methods have the same number of parameters, just
+         // the data types are different. (Fix for bug # 724812 -- the above
+         // statement is true of java.lang.Math, but not of this class.)
+         //int paramCount = ( ( Method ) candidates.elementAt( 0 ) ).getParameterTypes().length;
+         int paramCount = -1;
+         try {
+            for ( int i = 0; i <= candidates.size(); i++ ) {
+               Candidate candidate = ( Candidate ) candidates.elementAt( i );
+               Method method = candidate.getCandidateMethod();
+               paramCount = method.getParameterTypes().length;
+               if ( paramCount == operands.length )
+                  break;
+            }
+         }
+         catch ( Exception e ) {
+            throw new RuntimeException( "Wrong number of arguments, have " +
+                  operands.length + ", but can't find corresponding method." );
+         }
+
+         // make sure there are enough arguments to pass to the method
+         // see bug fix above, this is no longer necessary
+         //if ( operands.length != paramCount )
+         //   throw new RuntimeException( "Wrong number of arguments, have " +
+         //         operands.length + ", expected " + paramCount );
+
+         // determine the actual type class for the method to invoke.
+         // Some methods have only one implementation so determine the
+         // typeClass from the method itself, not the desired.
+         Class typeClass = null;
+         if ( candidates.size() == 1 ) {
+            Candidate candidate = ( Candidate ) candidates.elementAt( 0 );
+            c = candidate.getCandidateClass();
+            m = candidate.getCandidateMethod();
+            typeClass = m.getParameterTypes() [ 0 ];
+         }
+         else {
+            // check each candidate to find one with the desired type
+            Enumeration en = candidates.elements();
+            while ( en.hasMoreElements() ) {
+               Candidate candidate = ( Candidate ) en.nextElement();
+               c = candidate.getCandidateClass();
+               m = candidate.getCandidateMethod();
+               if ( m.getParameterTypes() [ 0 ].equals( wantTypeClass ) ) {
+                  typeClass = wantTypeClass;
+                  break;
+               }
+            }
+            if ( typeClass == null )
+               throw new RuntimeException( "Can't find a method with parameters of type " + type );
+         }
+
+         // get the method to invoke
+         Class[] paramTypes = new Class[ paramCount ];
+         for ( int i = 0; i < paramCount; i++ ) {
+            paramTypes[ i ] = typeClass;
+         }
+         m = c.getDeclaredMethod( op, paramTypes );
+         //System.out.println( "Math.calculate, invoking: " + m.toString() );
+
+         // load the parameters and invoke the method
+         Object[] params = getParams( typeClass, operands );
+
+         try {
+            //System.out.println( "Math.calculateArray, invoking: " + m.toString() );
+            Object result = m.invoke( c, params );
+            if (result instanceof Boolean) {
+               result = new Integer(((Boolean)result).booleanValue() ? 1 : 0);  
+            }
+            return ( Number ) result;
+         }
+         catch ( InvocationTargetException ite ) {
+            Throwable t = ite.getCause();
+            if ( t != null && t instanceof ArithmeticException ) {
+               throw ( ArithmeticException ) t;
+            }
+            else {
+               throw ite;
+            }
+         }
+      }
+      catch ( Exception e ) {
+         if ( e instanceof RuntimeException )
+            throw ( RuntimeException ) e;
+      }
+      return null;
+   }
+
+   /**
+   * Performs a calculation on an array of numbers. The mathematical methods
+   * in this class will accept an array of numbers, so
+   * <code>add(new int[]{1, 2, 3})</code>
+   * is equivalent to
+   * <code>add(add(1, 2), 3)</code>
+   * which is equivalent to 1 + 2 + 3.
+   * @param op the operation to perform
+   * @type the data type of the operands. All operands will be cast to the same
+   * data type
+   * @param operands these strings must parse to numbers.
+   */
+   private Number calculateArray( String op, String type, String[] operands ) {
+      try {
+         Class c = this.getClass();
+
+         // find candidate methods for the requested operation
+         Vector candidates = new Vector();
+         Method[] methods = c.getDeclaredMethods();
+         for ( int i = 0; i < methods.length; i++ ) {
+            String name = methods[ i ].getName();
+            if ( name.equals( op ) ) {
+               if ( methods[ i ].getParameterTypes().length == 1 ) {
+                  if ( methods[ i ].getParameterTypes() [ 0 ].isArray() )
+                     candidates.addElement( methods[ i ] );
+               }
+            }
+         }
+         if ( candidates.size() == 0 )
+            throw new RuntimeException( "Unknown operation: " + op );
+
+         // get the desired data type for the operation, default is
+         // Double.TYPE if no other match is found
+         Object wantTypeClass = getDataTypeArray( type, operands.length );
+
+         // find the actual method to invoke and invoke it immediately once
+         // it is found
+         Class typeClass = null;
+         Enumeration en = candidates.elements();
+         while ( en.hasMoreElements() ) {
+            Method m = ( Method ) en.nextElement();
+            if ( m.getParameterTypes() [ 0 ].equals( wantTypeClass.getClass() ) ) {
+               typeClass = getDataType( type );
+               Object[] params = getParamsArray( typeClass, operands );
+               try {
+                  //System.out.println( "Math.calculateArray, invoking: " + m.toString() );
+                  Object result = m.invoke( c, params );
+                  return ( Number ) result;
+               }
+               catch ( InvocationTargetException ite ) {
+                  Throwable t = ite.getCause();
+                  if ( t != null && t instanceof ArithmeticException ) {
+                     //System.out.println( "caught ArithmeticException in Math" );
+                     throw ( ArithmeticException ) t;
+                  }
+                  else {
+                     //System.out.println( "throwing " + ite.getMessage() );
+                     throw ite;
+                  }
+               }
+            }
+         }
+      }
+      catch ( Exception e ) {
+         //e.printStackTrace();
+         if ( e instanceof ArithmeticException ) {
+            //System.out.println("rethrowing " + e.getMessage());
+            throw ( ArithmeticException ) e;
+         }
+      }
+      return null;
+   }
+
+   /**
+   * Converts a string representing a data type into the actual type.
+   * @param type one of "int", "long", "float", or "double"
+   * @return one of Integer.TYPE, Long.TYPE, Float.TYPE, or Double.TYPE. If the
+   * given type is null or not one of the allowed types, Double.TYPE will be
+   * returned.
+   */
+   private Class getDataType( String type ) {
+      if ( type == null )
+         return Double.TYPE;
+      if ( type.equals( "int" ) ) {
+         return Integer.TYPE;
+      }
+      else if ( type.equals( "long" ) ) {
+         return Long.TYPE;
+      }
+      else if ( type.equals( "float" ) ) {
+         return Float.TYPE;
+      }
+      else if ( type.equals( "bigint" ) ) {
+         try {
+            return Class.forName( "java.math.BigInteger" );
+         }
+         catch ( Exception e ) {
+            //e.printStackTrace();
+         }
+      }
+      else if ( type.equals( "bigdecimal" ) ) {
+         try {
+            return Class.forName( "java.math.BigDecimal" );
+         }
+         catch ( Exception e ) {
+            //e.printStackTrace();
+         }
+      }
+      return Double.TYPE;
+   }
+
+   /**
+   * Converts a string representing a data type into an Array.
+   * @param type one of "int", "long", "float", or "double"
+   * @param length how long to make the array
+   * @return an Array representing the data type
+   */
+   private Object getDataTypeArray( String type, int length ) {
+      if ( type == null )
+         return Array.newInstance( Double.TYPE, length );
+      if ( type.equals( "int" ) ) {
+         return Array.newInstance( Integer.TYPE, length );
+      }
+      else if ( type.equals( "long" ) ) {
+         return Array.newInstance( Long.TYPE, length );
+      }
+      else if ( type.equals( "float" ) ) {
+         return Array.newInstance( Float.TYPE, length );
+      }
+      else if ( type.equals( "bigdecimal" ) ) {
+         return Array.newInstance( BIGDECIMAL_TYPE, length );
+      }
+      else if ( type.equals( "bigint" ) ) {
+         return Array.newInstance( BIGINT_TYPE, length );
+      }
+      else {
+         return Array.newInstance( Double.TYPE, length );
+      }
+   }
+
+   /**
+   * @returns the given operands as an array of the given type.
+   */
+   private Object[] getParams( Class typeClass, String[] operands ) {
+      int paramCount = operands.length;
+      Object[] params = new Object[ paramCount ];
+      if ( typeClass == BIGDECIMAL_TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new BigDecimal( operands[ i ] );
+         }
+      }
+      else if ( typeClass == BIGINT_TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new BigInteger( operands[ i ] );
+         }
+      }
+      else if ( typeClass == Double.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Double( operands[ i ] );
+         }
+      }
+      else if ( typeClass == Long.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Long( operands[ i ] );
+         }
+      }
+      else if ( typeClass == Float.TYPE ) {
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Float( operands[ i ] );
+         }
+      }
+      else {
+         // Integer.TYPE is only other choice
+         for ( int i = 0; i < paramCount; i++ ) {
+            params[ i ] = new Integer( operands[ i ] );
+         }
+      }
+      if ( paramCount > 2 )
+         params = new Object[] {params};
+      return params;
+   }
+
+   /**
+   * Converts the given operands into an array of the given type.
+   */
+   private Object[] getParamsArray( Class typeClass, String[] operands ) {
+      int paramCount = operands.length;
+      if ( typeClass == BIGDECIMAL_TYPE ) {
+         BigDecimal[] array = ( BigDecimal[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            array[ i ] = new BigDecimal( operands[ i ] );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == BIGINT_TYPE ) {
+         BigInteger[] array = ( BigInteger[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            array[ i ] = new BigInteger( operands[ i ] );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == Double.TYPE ) {
+         double[] array = ( double[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setDouble( array, i, new Double( operands[ i ] ).doubleValue() );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == Long.TYPE ) {
+         long[] array = ( long[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setLong( array, i, new Long( operands[ i ] ).longValue() );
+         }
+         return new Object[] {array};
+      }
+      else if ( typeClass == Float.TYPE ) {
+         float[] array = ( float[] ) Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            Array.setFloat( array, i, new Float( operands[ i ] ).floatValue() );
+         }
+         return new Object[] {array};
+      }
+      else {
+         // Integer.TYPE is only other choice
+         Object array = Array.newInstance( typeClass, operands.length );
+         for ( int i = 0; i < paramCount; i++ ) {
+            if (operands[i].indexOf(".") > 0)
+               operands[i] = operands[i].substring(0, operands[i].indexOf("."));
+            Array.setInt( array, i, new Integer( operands[ i ] ).intValue() );
+         }
+         return new Object[] {array};
+      }
+   }
+
+   public class Candidate {
+      private Class c;
+      private Method m;
+      public Candidate( Class c, Method m ) {
+         this.c = c;
+         this.m = m;
+      }
+      public Class getCandidateClass() {
+         return c;
+      }
+      public Method getCandidateMethod() {
+         return m;
+      }
+   }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Num.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Num.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Num.java	(revision 15023)
@@ -0,0 +1,88 @@
+package ise.antelope.tasks.util.math;
+
+
+/**
+ * Represents a number. 
+ * <p>Copyright 2003, Dale Anson, all rights reserved
+ * @author Dale Anson, danson@germane-software.com  
+ */
+public class Num {
+
+   // the value of this number
+   private String value = null;
+
+   private String datatype = null;
+
+   public Num() {
+   }
+
+   public Num( String value ) {
+      setValue( value );
+   }
+
+   /**
+    * Set the value for this number. This string must parse to the set
+    * datatype, for example, setting value to "7.992" and datatype to INT
+    * will cause a number format exception to be thrown. Supports two special
+    * numbers, "E" and "PI".
+    * @param value the value for this number   
+    */
+   public void setValue( String value ) {
+      if ( value.equals( "E" ) )
+         value = String.valueOf( java.lang.Math.E );
+      else if ( value.equals( "PI" ) )
+         value = String.valueOf( java.lang.Math.PI );
+      this.value = value;
+   }
+
+   /**
+    * @return the value for this number as a Number. Cast as appropriate to
+    * Integer, Long, Float, or Double.
+    */
+   public Number getValue() {
+      try {
+         if ( datatype == null )
+            datatype = "double";
+         if ( datatype.equals( "int" ) )
+            return new Integer( value );
+         if ( datatype.equals( "long" ) )
+            return new Long( value );
+         if ( datatype.equals( "float" ) )
+            return new Float( value );
+         if ( datatype.equals( "double" ) )
+            return new Double( value );
+         if ( datatype.equals( "bigint" ) )
+            return new java.math.BigInteger( value );
+         if ( datatype.equals( "bigdecimal" ) )
+            return new java.math.BigDecimal( value );
+         throw new RuntimeException( "Invalid datatype." );
+      }
+      catch ( NumberFormatException nfe ) {
+         return new Double( value );
+      }
+   }
+
+   /**
+    * Sets the datatype of this number. Allowed values are
+    * "int", "long", "float", or "double".    
+    */
+   public void setDatatype( String p ) {
+      datatype = p;
+   }
+
+   /**
+    * @return the datatype as one of the defined types.   
+    */
+   public String getDatatype() {
+      if ( datatype == null )
+         datatype = "double";
+      return datatype;
+   }
+
+   public String toString() {
+      if (value == null)
+         return null;
+      return getValue().toString();
+   }
+}
+
Index: /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Op.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Op.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/antelope/src/ise/antelope/tasks/util/math/Op.java	(revision 15023)
@@ -0,0 +1,154 @@
+package ise.antelope.tasks.util.math;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+/**
+ * Represents a mathematical operation.
+ * <p>Copyright 2003, Dale Anson, all rights reserved
+ * @author Dale Anson, danson@germane-software.com   
+ */
+public class Op {
+   // datatype for the result of this operation
+   private String datatype = null;
+
+   // storage for the numbers to execute the operation on
+   Vector nums = new Vector();
+
+   // storage for nested Ops
+   Vector ops = new Vector();
+
+   // storage for operation
+   String operation = null;
+
+   // should the StrictMath library be used?
+   private boolean _strict = false;
+   
+   public Op() {
+      
+   }
+   
+   public Op(String op) {
+      setOp(op);
+   }  
+   
+   public Op(String op, String type) {
+      setOp(op);
+      setDatatype(type);
+   }  
+   
+  /**
+    * Set the operation.
+    */
+   public void setOp( String op ) {
+      if (op.equals("+"))
+         operation = "add";
+      else if (op.equals("-"))
+         operation = "subtract";
+      else if (op.equals("*") || op.equals("x"))
+         operation = "multiply";
+      else if (op.equals("/") || op.equals( "÷" ) )
+         operation = "divide";
+      else if (op.equals("%") || op.equals("\\"))
+         operation = "mod";
+      else 
+         operation = op;
+   }
+
+   /**
+    * Add a number to this operation. An operation can hold any number of
+    * numbers to support formulas like 5 + 4 + 3 + 2 + 1.
+    * @param num a number to use in this operation   
+    */
+   public void addConfiguredNum( Num num ) {
+      nums.addElement( num );
+      //System.out.println("Op.addNum " + num);
+      
+   }
+
+   /**
+    * Sets the datatype of this calculation. Allowed values are
+    * "int", "long", "float", or "double".    
+    */
+   public void setDatatype( String p ) {
+      if ( p.equals( "int" ) ||
+              p.equals( "long" ) ||
+              p.equals( "float" ) ||
+              p.equals( "double" ) ||
+              p.equals( "bigint") ||
+              p.equals( "bigdecimal"))
+         datatype = p;
+      else
+         throw new IllegalArgumentException( "Invalid datatype: " + p +
+               ". Must be one of int, long, float, double, bigint, or bigdouble." );
+   }
+
+   /**
+    * Add a nested operation.
+    * @param op the operation to add.
+    */
+   public void addConfiguredOp( Op op ) {
+      if ( datatype != null )
+         op.setDatatype( datatype );
+      //ops.addElement( op );
+      //System.out.println("Op.addConfiguredOp");
+      addConfiguredNum(op.calculate());
+   }
+   
+   /**
+    * Use the StrictMath library.   
+    */
+   public void setStrict( boolean b ) {
+      _strict = b;
+   }
+
+   /**
+    * Perform this operation.
+    * @return the value resulting from the calculation as a Num.   
+    */
+   public Num calculate() {
+      if ( operation == null )
+         throw new RuntimeException( "Operation not specified." );
+
+      // calculate nested Ops
+      /*
+      Enumeration en = ops.elements();
+      while ( en.hasMoreElements() ) {
+         Op op = ( Op ) en.nextElement();
+         if ( datatype != null )
+            op.setDatatype( datatype );
+         nums.addElement( op.calculate() );
+      }
+      */
+      
+      // make an array of operands
+      //System.out.println("operation is " + operation + " on these numbers:");
+      String[] operands = new String[ nums.size() ];
+      Enumeration en = nums.elements();
+      int i = 0;
+      while ( en.hasMoreElements() ) {
+         Num num = (Num)en.nextElement();
+         if (datatype != null)
+            num.setDatatype(datatype);
+         //System.out.println(num.toString());
+         operands[ i++ ] = num.toString();
+      }
+
+      Math math = new Math(_strict);
+
+      Number number = null;
+      try {
+         number = math.calculate( operation, datatype, operands );  
+      }
+      catch(ArithmeticException e) {
+         throw e;
+      }
+      if (number == null)
+         throw new ArithmeticException("math error");
+      Num num = new Num();
+      num.setValue(number.toString());
+      num.setDatatype(datatype);
+      return num;
+
+   }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/RegexSearchReplace.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/RegexSearchReplace.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/RegexSearchReplace.java	(revision 15023)
@@ -0,0 +1,116 @@
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import java.util.*;
+import java.io.*;
+import java.util.regex.*;
+
+
+public class RegexSearchReplace extends Task {
+	private File file = null;
+	private String pattern = null;
+	private String replacement = null;
+	
+
+	/**
+	 * for testing
+	 */
+	public static void main( String[] args ) {
+		RegexSearchReplace rsr = new RegexSearchReplace();
+		rsr.setFile(new File (args[0]));
+		rsr.setPattern(args[1]);
+		rsr.setReplacement(args[2]);
+
+		rsr.execute();
+
+	}
+
+	public void execute() {
+
+		if ( file == null ) {
+			throw new BuildException( "Error - No file specified !!" );
+		}
+
+		if ( pattern == null ) {
+			throw new BuildException( "Error - No pattern specified !!" );
+		}
+
+		if (replacement == null) {
+			replacement = "";
+		}
+
+
+		//create the output stream
+		BufferedWriter out = null;
+		File temp = null;
+		try {
+			// Create temp file.
+			temp = File.createTempFile("rsr", ".tmp");
+
+			// Delete temp file when program exits.
+			temp.deleteOnExit();
+
+			// Write to temp file
+			out = new BufferedWriter(new FileWriter(temp));
+
+		} catch (IOException e) {}
+
+
+		//create the input stream
+		BufferedReader in = null;
+		try {
+			in = new BufferedReader(new FileReader( file ));
+		} catch ( Exception e ) {}
+
+		//pass the file through, searching and replacing
+		String line;
+		try {
+			while ( (line = in.readLine()) != null ) {
+				line = line.replaceAll( pattern, replacement);
+				out.write(line);
+				out.newLine();
+			}
+			//close them both up
+			in.close();
+			out.close();
+
+		} catch ( Exception e ) {
+			e.printStackTrace();
+		}
+
+
+
+		//copy the new file (temp) over the original
+		try {
+			InputStream i = new FileInputStream(temp);
+			OutputStream o = new FileOutputStream(file);
+
+			// Transfer bytes from in to out
+			byte[] buf = new byte[1024];
+			int len;
+			while ((len = i.read(buf)) > 0) {
+			   o.write(buf, 0, len);
+			}
+
+			//close them up
+			i.close();
+			o.close();
+		} catch ( Exception e ) {}
+		
+	}
+
+   
+	public void setFile(File file) {
+			this.file = file;
+	}
+
+	public void setPattern(String pattern) {
+			this.pattern = pattern;
+	}
+
+	public void setReplacement(String replacement) {
+			this.replacement = replacement;
+	}
+
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/SetLogLevel.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/SetLogLevel.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/SetLogLevel.java	(revision 15023)
@@ -0,0 +1,49 @@
+import java.util.*;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.taskdefs.Echo.EchoLevel;
+
+public class SetLogLevel extends Task
+{
+    private int logLevel = -1;
+
+    public void execute()
+    {
+        if (logLevel == -1)
+        {
+            throw new BuildException("Error - No Loglevel specified !!");
+        }
+        Vector listeners = this.getProject().getBuildListeners();
+        for (Iterator i = listeners.iterator(); i.hasNext();)
+        {
+            BuildListener listener = (BuildListener) i.next();
+            if (listener instanceof BuildLogger)
+            {
+                BuildLogger logger = (BuildLogger) listener;
+                logger.setMessageOutputLevel(logLevel);
+            }
+        }
+    }
+
+    /**
+     * 
+     *  @see org.apache.tools.ant.taskdefs.Echo$EchoLevel
+     * 
+     */
+    
+    public void setLevel(EchoLevel echoLevel) {
+        String option = echoLevel.getValue();
+        if (option.equals("error")) {
+            logLevel = Project.MSG_ERR;
+        } else if (option.equals("warning")) {
+            logLevel = Project.MSG_WARN;
+        } else if (option.equals("info")) {
+            logLevel = Project.MSG_INFO;
+        } else if (option.equals("verbose")) {
+            logLevel = Project.MSG_VERBOSE;
+        } else {
+            // must be "debug"
+            logLevel = Project.MSG_DEBUG;
+        }
+    }
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/TreeCallTarget.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/TreeCallTarget.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/TreeCallTarget.java	(revision 15023)
@@ -0,0 +1,454 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+import org.apache.tools.ant.taskdefs.*;
+import java.io.IOException;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.PropertySet;
+
+/**
+ * Call another target in the same project.
+ *
+ *  <pre>
+ *    &lt;target name="foo"&gt;
+ *      &lt;antcall target="bar"&gt;
+ *        &lt;param name="property1" value="aaaaa" /&gt;
+ *        &lt;param name="foo" value="baz" /&gt;
+ *       &lt;/antcall&gt;
+ *    &lt;/target&gt;
+ *
+ *    &lt;target name="bar" depends="init"&gt;
+ *      &lt;echo message="prop is ${property1} ${foo}" /&gt;
+ *    &lt;/target&gt;
+ * </pre>
+ *
+ * <p>This only works as expected if neither property1 nor foo are
+ * defined in the project itself.
+ *
+ *
+ * @since Ant 1.2
+ *
+ * @ant.task name="antcall" category="control"
+ */
+public class TreeCallTarget extends Task {
+
+    private Ant callee;
+    // must match the default value of Ant#inheritAll
+    private boolean inheritAll = true;
+    // must match the default value of Ant#inheritRefs
+    private boolean inheritRefs = false;
+	
+    private boolean targetSet = false;
+	private String theTarget = null;
+	private String address = null;
+
+    /**
+     * If true, pass all properties to the new Ant project.
+     * Defaults to true.
+     * @param inherit <code>boolean</code> flag.
+     */
+    public void setInheritAll(boolean inherit) {
+       inheritAll = inherit;
+    }
+
+    /**
+     * If true, pass all references to the new Ant project.
+     * Defaults to false.
+     * @param inheritRefs <code>boolean</code> flag.
+     */
+    public void setInheritRefs(boolean inheritRefs) {
+        this.inheritRefs = inheritRefs;
+    }
+
+    /**
+     * Initialize this task by creating new instance of the ant task and
+     * configuring it by calling its own init method.
+     */
+    public void init() {
+        callee = (Ant) getProject().createTask("ant");
+        callee.setOwningTarget(getOwningTarget());
+        callee.setTaskName(getTaskName());
+        callee.setLocation(getLocation());
+        callee.init();
+    }
+
+    /**
+     * Delegate the work to the ant task instance, after setting it up.
+     * @throws BuildEximport org.apache.tools.ant.Task;ception on validation failure or if the target didn't
+     * execute.
+     */
+    public void execute() throws BuildException {
+        if (callee == null) {
+            init();
+        }
+        if (!targetSet) {
+            throw new BuildException(
+                "Attribute target or at least one nested target is required.",
+                 getLocation());
+        }
+
+			//figure out what the address of this instance should be
+			String callingAddress = this.getOwningTarget().getAddress();
+			int subAddress = this.getOwningTarget().getNextSubAddress();
+			this.getOwningTarget().incrementNextSubAddress();
+
+			if ( callingAddress == null ) {
+				address = "" + subAddress;
+			} else {
+				address = callingAddress + "." + subAddress;
+			}
+			
+			
+			//check that the target should be run given address,resume.mode, rusume.from and resume.to
+			String resumeFrom = this.getProject().getProperty("resume.from");
+			String resumeTo = this.getProject().getProperty("resume.to");
+			String resumeMode = this.getProject().getProperty("resume.mode");
+
+			boolean shouldExecOnFrom = false, shouldExecOnTo = false;
+
+			//given resumeFrom, might we execute?
+			if ( resumeFrom == null ) {
+				shouldExecOnFrom = true;
+
+			} else {
+
+				//if the resumeFrom is a descendent of this, we must execute it no matter the Mode
+				if ( isDescendantOf(resumeFrom,address) ) {
+						shouldExecOnFrom = true;
+
+				} else {
+
+					if ( resumeMode == null ) {
+						//fallthrough mode
+						if ( isAfter(address,resumeFrom) ) {
+							shouldExecOnFrom = true;
+						} else {
+							shouldExecOnFrom = false;
+						}
+
+					} else if ( resumeMode.equals("descend") ) {
+						//descend mode
+						if ( isDescendantOf(address,resumeFrom) ) {
+							shouldExecOnFrom = true;
+						} else {
+							shouldExecOnFrom = false;
+						}
+
+					} else {
+		            throw new BuildException(
+	   	             "Only 'fallthrough' and 'descend' resume-modes are supported.",
+	      	           getLocation()
+						);
+					}
+				
+				}
+			
+			}
+
+			//given resumeTo, might we execute?
+			if ( resumeTo == null ) {
+				shouldExecOnTo = true;
+			} else {
+				if ( !isAfter(address,resumeTo) || isEqualTo(address,resumeTo) ) {
+					shouldExecOnTo = true;
+				} else {
+					shouldExecOnTo = false;
+				}
+			}
+
+			//check that both are true
+			boolean execute = ( shouldExecOnFrom && shouldExecOnTo );
+
+			if ( execute ) {
+				callee.setAntfile(getProject().getProperty("ant.file"));
+				callee.setInheritAll(inheritAll);
+				callee.setInheritRefs(inheritRefs);
+				Target calleeTarget = (Target)callee.getProject().getTargets().get(theTarget);
+				calleeTarget.setAddress(address);
+
+				if( false ) {
+					throw new BuildException(
+						"\n theTarget " + theTarget + "\n calleeTarget: " + calleeTarget + "\n address: " + calleeTarget.getAddress(),
+						getLocation()
+					);
+				}
+	        callee.execute(theTarget,address);
+			}
+    }
+
+    /**
+     * Create a new Property to pass to the invoked target(s).
+     * @return a <code>Property</code> object.
+     */
+    public Property createParam() {
+        if (callee == null) {
+            init();
+        }
+        return callee.createProperty();
+    }
+
+    /**
+     * Reference element identifying a data type to carry
+     * over to the invoked target.
+     * @param r the specified <code>Ant.Reference</code>.
+     * @since Ant 1.5
+     */
+    public void addReference(Ant.Reference r) {
+        if (callee == null) {
+            init();
+        }
+        callee.addReference(r);
+    }
+
+    /**
+     * Set of properties to pass to the new project.
+     * @param ps the <code>PropertySet</code> to pass.
+     * @since Ant 1.6
+     */
+    public void addPropertyset(PropertySet ps) {
+        if (callee == null) {
+            init();
+        }
+        callee.addPropertyset(ps);
+    }
+
+
+    /**
+     * Set target to execute.
+     * @param target the name of the target to execute.
+     */
+    public void setTarget(String target) {
+        if (callee == null) {
+            init();
+        }
+        callee.setTarget(target);
+			theTarget = target;
+        targetSet = true;
+    }
+
+    /**
+     * Add a target to the list of targets to invoke.
+     * @param t <code>Ant.TargetElement</code> representing the target.
+     * @since Ant 1.6.3
+     */
+    public void addConfiguredTarget(Ant.TargetElement t) {
+        if (callee == null) {
+            init();
+        }
+        callee.addConfiguredTarget(t);
+        targetSet = true;
+    }
+
+    /**
+     * @see Task#handleOutput(String)
+     *
+     * @since Ant 1.5
+     */
+    public void handleOutput(String output) {
+        if (callee != null) {
+            callee.handleOutput(output);
+        } else {
+            super.handleOutput(output);
+        }
+    }
+
+    /**
+     * @see Task#handleInput(byte[], int, int)
+     *
+     * @since Ant 1.6
+     */
+    public int handleInput(byte[] buffer, int offset, int length)
+        throws IOException {
+        if (callee != null) {
+            return callee.handleInput(buffer, offset, length);
+        } else {
+            return super.handleInput(buffer, offset, length);
+        }
+    }
+
+    /**
+     * @see Task#handleFlush(String)
+     *
+     * @since Ant 1.5.2
+     */
+    public void handleFlush(String output) {
+        if (callee != null) {
+            callee.handleFlush(output);
+        } else {
+            super.handleFlush(output);
+        }
+    }
+
+    /**
+     * @see Task#handleErrorOutput(String)
+     *
+     * @since Ant 1.5
+     */
+    public void handleErrorOutput(String output) {
+        if (callee != null) {
+            callee.handleErrorOutput(output);
+        } else {
+            super.handleErrorOutput(output);
+        }
+    }
+
+    /**
+     * @see Task#handleErrorFlush(String)
+     *
+     * @since Ant 1.5.2
+     */
+    public void handleErrorFlush(String output) {
+        if (callee != null) {
+            callee.handleErrorFlush(output);
+        } else {
+            super.handleErrorFlush(output);
+        }
+    }
+
+
+
+
+
+
+	/* --- node address relations --- */
+    public static boolean isAfter(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are higher than or equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = i<xs.length ? Integer.parseInt( xs[i] ) : 0;
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue < yValue ) {
+				System.out.println("x not after y");
+				return false;
+			}
+
+			if(  xValue > yValue ) {
+				System.out.println("x is after y");
+				return true;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is after y");
+		return true;
+    }
+
+
+    public static boolean isDescendantOf(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is at least as deep as y
+		if ( xs.length < ys.length ) {
+			System.out.println("x not descendant of y");
+			return false;
+		}
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not descendant of y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is descendant of y");
+		return true;
+    }
+
+    public static boolean isEqualTo(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is exactly as deep as y
+		if ( xs.length != ys.length ) {
+			System.out.println("x not equal to y");
+			return false;
+		}
+
+		//figure out n
+		int n = xs.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not equal to y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first all places
+		System.out.println("x is equal to y");
+		return true;
+    }
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/old/AddressedCallTarget.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/old/AddressedCallTarget.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/old/AddressedCallTarget.java	(revision 15023)
@@ -0,0 +1,442 @@
+/*
+ * Copyright  2000-2004 The Apache Software Foundation
+ *
+ *  Licensed 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.
+ *
+ */
+
+import org.apache.tools.ant.taskdefs.*;
+import java.io.IOException;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.PropertySet;
+
+/**
+ * Call another target in the same project.
+ *
+ *  <pre>
+ *    &lt;target name="foo"&gt;
+ *      &lt;antcall target="bar"&gt;
+ *        &lt;param name="property1" value="aaaaa" /&gt;
+ *        &lt;param name="foo" value="baz" /&gt;
+ *       &lt;/antcall&gt;
+ *    &lt;/target&gt;
+ *
+ *    &lt;target name="bar" depends="init"&gt;
+ *      &lt;echo message="prop is ${property1} ${foo}" /&gt;
+ *    &lt;/target&gt;
+ * </pre>
+ *
+ * <p>This only works as expected if neither property1 nor foo are
+ * defined in the project itself.
+ *
+ *
+ * @since Ant 1.2
+ *
+ * @ant.task name="antcall" category="control"
+ */
+public class AddressedCallTarget extends Task {
+
+    private Ant callee;
+    // must match the default value of Ant#inheritAll
+    private boolean inheritAll = true;
+    // must match the default value of Ant#inheritRefs
+    private boolean inheritRefs = false;
+	
+	//the address of the target
+	private String address = "";
+
+    private boolean targetSet = false;
+
+    /**
+     * If true, pass all properties to the new Ant project.
+     * Defaults to true.
+     * @param inherit <code>boolean</code> flag.
+     */
+    public void setInheritAll(boolean inherit) {
+       inheritAll = inherit;
+    }
+
+    /**
+     * If true, pass all references to the new Ant project.
+     * Defaults to false.
+     * @param inheritRefs <code>boolean</code> flag.
+     */
+    public void setInheritRefs(boolean inheritRefs) {
+        this.inheritRefs = inheritRefs;
+    }
+
+    /**
+     * Initialize this task by creating new instance of the ant task and
+     * configuring it by calling its own init method.
+     */
+    public void init() {
+        callee = (Ant) getProject().createTask("ant");
+        callee.setOwningTarget(getOwningTarget());
+        callee.setTaskName(getTaskName());
+        callee.setLocation(getLocation());
+        callee.init();
+    }
+
+    /**
+     * Delegate the work to the ant task instance, after setting it up.
+     * @throws BuildException on validation failure or if the target didn't
+     * execute.
+     */
+    public void execute() throws BuildException {
+        if (callee == null) {
+            init();
+        }
+
+        if (!targetSet) {
+            throw new BuildException(
+                "Attribute target or at least one nested target is required.",
+                 getLocation());
+        }
+
+			//check that the target should be run given its address, the resume mode and the rusumefrom property
+			String resumeFrom = this.getProject().getProperty("resume.from");
+			String resumeTo = this.getProject().getProperty("resume.to");
+			String resumeMode = this.getProject().getProperty("resume.mode");
+
+			boolean shouldExecOnFrom = false, shouldExecOnTo = false, shouldExecOnMode = false;
+
+			//given resumeFrom, might we execute?
+			System.out.println("checking if we should execute given that resumeFrom=" + resumeFrom);
+			if ( resumeFrom == null ) {
+				shouldExecOnFrom = true;
+			} else {
+				if ( isAfter(address,resumeFrom) || isDescendantOf(resumeFrom,address) ) {
+					shouldExecOnFrom = true;
+				} else {
+					shouldExecOnFrom = false;
+				}
+			}
+
+			System.out.println("checking if we should execute given that resumeTo=" + resumeTo);
+			//given resumeTo, might we execute?
+			if ( resumeTo == null ) {
+				shouldExecOnTo = true;
+			} else {
+				if ( !isAfter(address,resumeTo ) ) {
+					shouldExecOnTo = true;
+				} else {
+					shouldExecOnTo = false;
+				}
+			}
+
+			System.out.println("checking if we should execute given that resumeMode=" + resumeMode);
+			//given resumeMode, might we execute?
+			if ( resumeMode == null ) {
+				shouldExecOnMode = true;
+			} else if ( resumeMode.equals("descend") ) {
+				if ( resumeFrom == null ) {
+					shouldExecOnMode = true;
+				} else if ( isDescendantOf(address,resumeFrom ) ) {
+					shouldExecOnMode = true;
+				} else {
+					shouldExecOnMode = false;
+				}
+			}
+
+			System.out.println("check that all three are true");
+			boolean execute = ( shouldExecOnFrom && shouldExecOnTo && shouldExecOnMode );
+
+
+			if ( execute ) {
+*/
+				callee.setAntfile(getProject().getProperty("ant.file"));
+				callee.setInheritAll(inheritAll);
+				callee.setInheritRefs(inheritRefs);
+				callee.execute();
+//			}
+    }
+
+    /**
+     * Create a new Property to pass to the invoked target(s).
+     * @return a <code>Property</code> object.
+     */
+    public Property createParam() {
+        if (callee == null) {
+            init();
+        }
+        return callee.createProperty();
+    }
+
+    /**
+     * Reference element identifying a data type to carry
+     * over to the invoked target.
+     * @param r the specified <code>Ant.Reference</code>.
+     * @since Ant 1.5
+     */
+    public void addReference(Ant.Reference r) {
+        if (callee == null) {
+            init();
+        }
+        callee.addReference(r);
+    }
+
+    /**
+     * Set of properties to pass to the new project.
+     * @param ps the <code>PropertySet</code> to pass.
+     * @since Ant 1.6
+     */
+    public void addPropertyset(PropertySet ps) {
+        if (callee == null) {
+            init();
+        }
+        callee.addPropertyset(ps);
+    }
+
+	/**
+	 * setter for address
+	 */
+	public void setAddress(String address) {
+		this.address=address;
+	}
+
+	/**
+	 * getter for address
+	 */
+	public String getAddress() {
+		return address;
+	}
+
+
+    /**
+     * Set target to execute.
+     * @param target the name of the target to execute.
+     */
+    public void setTarget(String target) {
+        if (callee == null) {
+            init();
+        }
+        callee.setTarget(target);
+        targetSet = true;
+    }
+
+    /**
+     * Add a target to the list of targets to invoke.
+     * @param t <code>Ant.TargetElement</code> representing the target.
+     * @since Ant 1.6.3
+     */
+    public void addConfiguredTarget(Ant.TargetElement t) {
+        if (callee == null) {
+            init();
+        }
+        callee.addConfiguredTarget(t);
+        targetSet = true;
+    }
+
+    /**
+     * @see Task#handleOutput(String)
+     *
+     * @since Ant 1.5
+     */
+    public void handleOutput(String output) {
+        if (callee != null) {
+            callee.handleOutput(output);
+        } else {
+            super.handleOutput(output);
+        }
+    }
+
+    /**
+     * @see Task#handleInput(byte[], int, int)
+     *
+     * @since Ant 1.6
+     */
+    public int handleInput(byte[] buffer, int offset, int length)
+        throws IOException {
+        if (callee != null) {
+            return callee.handleInput(buffer, offset, length);
+        } else {
+            return super.handleInput(buffer, offset, length);
+        }
+    }
+
+    /**
+     * @see Task#handleFlush(String)
+     *
+     * @since Ant 1.5.2
+     */
+    public void handleFlush(String output) {
+        if (callee != null) {
+            callee.handleFlush(output);
+        } else {
+            super.handleFlush(output);
+        }
+    }
+
+    /**
+     * @see Task#handleErrorOutput(String)
+     *
+     * @since Ant 1.5
+     */
+    public void handleErrorOutput(String output) {
+        if (callee != null) {
+            callee.handleErrorOutput(output);
+        } else {
+            super.handleErrorOutput(output);
+        }
+    }
+
+    /**
+     * @see Task#handleErrorFlush(String)
+     *
+     * @since Ant 1.5.2
+     */
+    public void handleErrorFlush(String output) {
+        if (callee != null) {
+            callee.handleErrorFlush(output);
+        } else {
+            super.handleErrorFlush(output);
+        }
+    }
+
+
+
+
+
+	/* --- node address relations --- */
+    public boolean isAfter(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are higher than or equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = i<xs.length ? Integer.parseInt( xs[i] ) : 0;
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue < yValue ) {
+				System.out.println("x not after y");
+				return false;
+			}
+
+			if(  xValue > yValue ) {
+				System.out.println("x is after y");
+				return true;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is after y");
+		return true;
+    }
+
+
+    public boolean isDescendantOf(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is at least as deep as y
+		if ( xs.length < ys.length ) {
+			System.out.println("x not descendant of y");
+			return false;
+		}
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not descendant of y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is descendant of y");
+		return true;
+    }
+
+
+    public boolean isBetweenYAndRoot(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure y is at least as deep as n
+		if (  ys.length < xs.length ) {
+			System.out.println("x not between y and root");
+			return false;
+		}
+
+		//figure out n
+		int n = xs.length;
+
+		//step through, making sure y values are equal to x values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not between y and root");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is between y and root");
+		return true;
+    }
+
+
+
+
+
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/old/IsAfter.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/old/IsAfter.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/old/IsAfter.java	(revision 15023)
@@ -0,0 +1,68 @@
+import java.util.*;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.taskdefs.condition.*;
+
+/**
+ * takes node addresses as arguments. E.g., 1.4.3.2
+ *
+ * node address x is after node address y iff, where y has n places,
+ * the values in the first n places of x are greater or equal to
+ * their corresponding values in y
+ */
+
+public class IsAfter implements Condition {
+
+	private String x = "";
+	private String y = "";
+
+    public boolean eval() {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are higher than or equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = i<xs.length ? Integer.parseInt( xs[i] ) : 0;
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue < yValue ) {
+				System.out.println("x not after y");
+				return false;
+			}
+
+			if(  xValue > yValue ) {
+				System.out.println("x is after y");
+				return true;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is after y");
+		return true;
+    }
+
+    
+	public void setX(String x) {
+		this.x=x;
+	}
+
+	public void setY(String y) {
+		this.y=y;
+	}
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/old/IsBetweenYAndRoot.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/old/IsBetweenYAndRoot.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/old/IsBetweenYAndRoot.java	(revision 15023)
@@ -0,0 +1,69 @@
+import java.util.*;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.taskdefs.condition.*;
+
+/**
+ * takes node addresses as arguments. E.g., 1.4.3.2
+ *
+ * node address x is between node address y and root iff, where x has n places,
+ * y has n or more places, and the values in the first n places of y are equal
+ * to the values in their corresponding places in y
+ */
+
+public class IsBetweenYAndRoot implements Condition {
+
+	private String x = "";
+	private String y = "";
+
+    public boolean eval() {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure y is at least as deep as n
+		if (  ys.length < xs.length ) {
+			System.out.println("x not between y and root");
+			return false;
+		}
+
+		//figure out n
+		int n = xs.length;
+
+		//step through, making sure y values are equal to x values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not between y and root");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is between y and root");
+		return true;
+    }
+
+    
+	public void setX(String x) {
+		this.x=x;
+	}
+
+	public void setY(String y) {
+		this.y=y;
+	}
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/orans/old/IsDescendantOf.java
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/orans/old/IsDescendantOf.java	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/orans/old/IsDescendantOf.java	(revision 15023)
@@ -0,0 +1,69 @@
+import java.util.*;
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.taskdefs.condition.*;
+
+/**
+ * takes node addresses as arguments. E.g., 1.4.3.2
+ *
+ * node address x is a descendant of node address y iff, where y has n places,
+ * x has n or more places, and the values in the first n places of x are equal
+ * to the values in their corresponding places in y
+ */
+
+public class IsDescendantOf implements Condition {
+
+	private String x = "";
+	private String y = "";
+
+    public boolean eval() {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is at least as deep as y
+		if ( xs.length < ys.length ) {
+			System.out.println("x not descendant of y");
+			return false;
+		}
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not descendant of y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is descendant of y");
+		return true;
+    }
+
+    
+	public void setX(String x) {
+		this.x=x;
+	}
+
+	public void setY(String y) {
+		this.y=y;
+	}
+
+}
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/build.properties
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/build.properties	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/build.properties	(revision 15023)
@@ -0,0 +1,20 @@
+# -----------------------------------------------------------------------------
+# build.properties
+# This file is referenced by the sample build.xml file.
+# -----------------------------------------------------------------------------
+
+svnant.version=1.0.0
+
+# -----------------------------------------------------------------------------
+# all jar needed
+# -----------------------------------------------------------------------------
+lib.dir=lib
+svnant.jar=${lib.dir}/svnant.jar
+svnClientAdapter.jar=${lib.dir}/svnClientAdapter.jar
+svnjavahl.jar=${lib.dir}/svnjavahl.jar
+
+svnant.latest.url=http://subclipse.tigris.org/svn/subclipse/trunk/svnant/
+svnant.this.url=http://subclipse.tigris.org/svn/subclipse/tags/svnant/${svnant.version}/
+
+svnant.repository.user=guest
+svnant.repository.passwd=""
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/build.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/build.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/build.xml	(revision 15023)
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!-- Sample build file used to retrieve svnant's sources -->
+<project name="svn-test" basedir="." default="checkoutThis">
+  
+  <!--  all properties are in build.properties --> 
+  <property file="build.properties" /> 
+
+  <!-- path to the svnant libraries. Usually they will be located in ANT_HOME/lib -->
+  <path id="project.classpath">
+    <pathelement location="${svnjavahl.jar}" /> 
+    <pathelement location="${svnant.jar}" />
+    <pathelement location="${svnClientAdapter.jar}" />
+  </path>  
+  
+  <!-- load the svn task -->
+  <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+  
+  <target name="clean">
+    <delete dir="src_latest"/>
+    <delete dir="src_${svnant.version}"/>  
+  </target>
+
+  <target name="checkoutLatest">
+    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+      <checkout url="${svnant.latest.url}" revision="HEAD" destPath="src_latest" />
+    </svn>
+  </target>
+
+  <target name="checkoutThis">
+    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}">
+      <checkout url="${svnant.this.url}" revision="HEAD" destPath="src_${svnant.version}" />
+    </svn>
+  </target>
+
+</project>
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/changelog.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/changelog.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/changelog.txt	(revision 15023)
@@ -0,0 +1,50 @@
+* 1.0.0
+- Built against svnClientAdapter r2401 and Subversion 1.3.1,
+  incorporating numerous bug fixes and improvements from both.
+  Removed dependency on commons-lang-2.0.jar.
+  Removed dependency on jakarta-regexp-1.4.jar.
+- Fixed revision parameter in Switch task (#305)
+- Added url property to Status task (#327)
+- Still lacks support for Subversion locking (introduced in SVN 1.2.0).
+
+* 1.0.0-rc1
+- Built against svnClientAdapter r1384 and Subversion 1.2.0,
+  incorporating numerous bug fixes and improvements from both.
+- Lacks support for Subversion locking (introduced in SVN 1.2.0).
+- Improved documentation.
+- New 'switch' and 'propget' commands for <svn> task.
+- Repository creation handles SVN file system type.
+- New JAR dependencies added (regexp, lang).
+- Add new/improved tests (e.g. of 'status', 'info', 'annotate',
+  'switch', svnserve, etc.).
+- Adjustments to distribution packaging, including the removal of the
+  bundled JavaHL win32 DLLs.
+
+* 0.9.13
+- createRepository command added
+- status command added
+- linked with subversion 1.0.5
+
+* 0.9.1
+- ignore and diff commands added
+- more improvements to command line interface to subversion
+
+* 0.8.6
+- improvements to command line interface to subversion
+  (should work better on Linux)
+
+* 0.8.5
+- linked with subversion 0.35.1 and Berkeley DB 4.2.52
+- improvements to command line interface to subversion
+- cat, revert, propdel commands added
+
+* 0.8.2
+- linked with subversion 0.31.2
+- command line interface to subversion (experimental)
+- keywordadd, keywordsremove, keywordsset and diff commands added
+
+* 0.6.0 
+- linked with Subversion 0.24.2
+- propset added
+
+* 0.1.0 - Initial Release
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/doc/svn.html
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/doc/svn.html	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/doc/svn.html	(revision 15023)
@@ -0,0 +1,1132 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+
+<head>
+	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
+	<TITLE>Svn Task</TITLE>
+	<META HTTP-EQUIV="Content-Language" CONTENT="en-us">
+  <link rel="stylesheet" type="text/css" href="http://tortoisesvn.tigris.org/branding/css/print.css" media="print" />
+<style type="text/css">	
+body {
+	font: 80% Verdana, Arial, Helvetica, sans-serif;
+	margin: 12px; padding: 12px;
+/*	background: rgb(95%,95%,80%);  */
+	color: black;
+}
+h1 {
+	font-size: 200%; text-transform: lowercase; letter-spacing: 3px;
+	margin-bottom: 1em; 
+	padding: 0.66em 0 0.33em 1em;
+	background: rgb(85%,85%,70%);
+}
+h2 {
+	background: rgb(85%,85%,70%);
+}
+h3 {
+	border:1px solid rgb(85%,85%,70%);
+	color: rgb(55%,55%,40%);
+	padding: 0.66em 0 0.33em 1em;
+	background-color: #f3f1f4;
+}
+.sample {
+	font-family: Courier, "Courier New", monospace;
+	background-color: #f3f1f4;
+	margin-left: 10px;
+	margin-right: 10px;
+	padding-top: 3px;
+	padding-bottom: 3px;
+	padding-left: 3px;
+	padding-right: 3px;
+	border:1px dashed black;
+	width: 50%;
+ }
+ table {
+	width: 80%;
+	border: 1px solid gray;
+	margin-bottom:1em;
+ }
+ th, td {
+	padding: 0 0.5em;
+	border-left: 1px solid #DDD;
+	border-bottom: 1px solid #DDD;
+	font: 70%
+}
+th {
+	
+}
+</style>
+</head>
+
+<body lang="en-US" dir="LTR">
+
+<H1>&lt;Svn&gt;</H1>
+By <A HREF="mailto:users@subclipse.tigris.org">C&eacute;dric Chabanois et al.</A>
+
+
+<H2>Description</H2>
+<p>This task provides an interface to <A HREF="http://subversion.tigris.org/">Subversion</A> 
+revision control system that is a compelling replacement for CVS in the open source community.
+<br>
+With the help of the underlying svnClientAdapter, &lt;svn&gt; task uses JavaHL (a 
+native JNI interface to the subversion api) if it
+can find the corresponding library (e.g. svnjavahl.dll on windows).
+Otherwise it uses svn command line interface.</p>
+<H2>Parameters</H2>
+
+<table>
+	<tr>
+		<th>Attribute</th>
+		<th>Description</th>
+		<th>Required</th>
+	</tr>
+	<tr>
+		<td>username</td>
+		<td>username that will be used for all nested svn commands.</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>password</td>
+		<td>password that will be used for all nested svn commands.</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>javahl</td>
+		<td>Set to &ldquo;false&rdquo; to use command line client interface instead of JNI JavaHL binding.</td>
+		<td>No (Defaults to true)</td>
+	</tr>
+</table>
+
+<H2>Svn commands specified as nested elements</H2>
+<table>
+	<tr>
+		<td><a href="#add">add </a></td>
+		<td><a href="#createRepository">createRepository</a></td>
+		<td><a href="#import">import</a></td>
+		<td><a href="#move">move</a></td>
+		<td><a href="#status">status</a></td>
+	</tr>
+	<tr>
+		<td><a href="#cat">cat</a></td>
+		<td><a href="#delete">delete</a></td>
+		<td><a href="#keywordsset">keywordsset</a></td>
+		<td><a href="#propdel">propdel</a></td>
+		<td><a href="#switch">switch</a></td>
+	</tr>
+	<tr>
+		<td><a href="#checkout">checkout</a></td>
+		<td><a href="#diff">diff</a></td>
+		<td><a href="#keywordsadd">keywordsadd</a></td>
+		<td><a href="#propget">propget</a></td>
+		<td><a href="#update">update</a></td>
+	</tr>
+	<tr>
+		<td><a href="#commit">commit</a></td>
+		<td><a href="#export">export</a></td>
+		<td><a href="#keywordsremove">keywordsremove</a></td>
+		<td><a href="#propset">propset</a></td>
+		<td></td>
+	</tr>
+	<tr>
+		<td><a href="#copy">copy</a></td>
+		<td><a href="#ignore">ignore</a></td>
+		<td><a href="#mkdir">mkdir</a></td>
+		<td><a href="#revert">revert</a></td>
+		<td></td>
+	</tr>
+	</table>
+<p> </p>
+
+<H3><a name="add">add</a></H3>
+<p>You can add files and directories to svn repository with nested
+<CODE>&lt;add&gt;</CODE> elements.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to add to the repository</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to add to the repository</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+<li>fileset <br>
+	Filesets are used to select sets of files to add to the repository. <br>
+	<B>Note	that directories needed to add selected files will be added to the
+	repository even if they are not selected by the fileset.</B>
+</li>
+</ul>
+</p>
+
+<H3><a name="cat">cat</a></H3>
+<p>Get the content of a file on repository.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>destFile</td>
+		<td>Name of the destination file</td>
+		<td>No <BR>(default is the name of the file on the url)</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>Url of the file in repository</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to get.<BR>Possible values are :<BR>- a date with the
+			following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision number<BR>-
+			HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+
+<H3><a name="checkout">checkout</a></H3>
+<p>Check out a working copy from a repository.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to checkout from</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination directory</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to checkout.<BR>Possible values are :<BR>- a date with
+			the following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision
+			number<BR>- HEAD, BASE, COMMITED or PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<br>
+	Filesets are used to select sets of files to add to the repository. <br>
+	<B>Note that directories needed to add selected files will be added to the
+	repository even if they are not selected by the fileset.</B>
+	</li>
+</ul>
+</p>
+
+<p>
+<div class="sample">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;checkout</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}&quot;</FONT>
+<FONT COLOR="#000080">destPath=</FONT><FONT COLOR="#008000">&quot;workingcopy&quot;</FONT>
+<FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+</p>
+
+<H3><a name="commit">commit</a></H3>
+<p>Send changes from your working copy to the repository.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to commit</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;<BR>Apply only when dir attribute is
+			set.
+		</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to commit</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to commit. 
+	</li>
+</ul>
+</p>
+
+<H3><a name="copy">copy</a></H3>
+<p>Duplicate something in working copy or repository, remembering
+history.<BR>
+source and destination can each be either a working copy (WC) path or URL:
+<ul>
+	<li>WC-&gt;WC: copy and schedule for addition (with history)</li>
+	<li>WC-&gt;URL: immediately commit a copy of WC to URL</li>
+	<li>URL-&gt;WC: check out URL into WC, schedule for addition</li>
+	<li>URL-&gt;URL: complete server-side copy;&nbsp; used to branch &amp; tag</li>
+</ul>
+</p>
+<br/>
+
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path</td>
+		<TD ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url</td>
+	</tr>
+	<tr>
+		<td>testPath</td>
+		<td>destination path</td>
+		<TD ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>destUrl</td>
+		<td>destination url</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>when destUrl is set</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision to copy from (when srcUrl is set)<BR>Possible values
+			are :<BR>- a date with the following format : MM/DD/YYYY HH:MM
+			AM_PM<BR>- a revision number<BR>- HEAD, BASE, COMMITED or
+			PREV<BR>Default is &quot;HEAD&quot;
+		</td>
+		<td>no</td>
+	</tr>
+</table>
+
+<H3><a name="createRepository">createRepository</a></H3>
+<p>Create a new, empty repository at path.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>Path where to create the new repository</td>
+		<td>Yes</td>
+	</tr>
+</table>
+<div class="sample" style="width: 597px; height: 77px">
+<p>Example: <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;false&quot;</FONT><FONT COLOR="#000080">&gt;<BR>&lt;createRepository</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;repository&quot;</FONT><FONT COLOR="#000080">/&gt;<BR>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="delete">delete</a></H3>
+<p>If run on a working copy target, the item is scheduled for
+deletion upon the next commit.&nbsp; Files, and directories that have
+not been committed, are immediately removed from the working copy.&nbsp;
+<BR>The command will not remove targets that are, or contain,
+unversioned or modified items; use the force attribute to override
+this behaviour.
+<BR>If run on an url, the item is deleted from the repository via an immediate commit.
+</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to delete</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>when url attribute is set</td>
+	</tr>
+	<tr>
+		<td>force</td>
+		<td>default is &quot;false&quot;</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to delete.. 
+	</li>
+</ul>
+</p>
+
+<H3><a name="diff">diff</a></H3>
+<p>Display the differences between two paths (oldPath and newPath) or
+two urls (oldUrl and newUrl).
+</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>oldPath</td>
+		<td>If oldUrl is not set, defaults to the path '.'</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>oldUrl</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>oldTargetRevision</td>
+		<td>defaults to BASE or, if oldUrl is set, to HEAD</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newPath</td>
+		<td>defaults to oldPath if oldUrl is not set</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newUrl</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>newTargetRevision</td>
+		<td>defaults to the current working version or, if newUrl is set, to HEAD</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>outFile</td>
+		<td>Default is 'patch'</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample" style="width: 749px; height: 80px">
+<p>Example : diff between BASE and current working version <br>
+<FONT SIZE=2 FACE="Courier New"><FONT COLOR="#000080">&lt;svn</FONT>
+<FONT COLOR="#000080">javahl=</FONT><FONT COLOR="#008000">&quot;${javahl}&quot;</FONT><FONT COLOR="#000080">&gt;<BR>&lt;diff</FONT>
+<FONT COLOR="#000080">oldPath=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/file.txt&quot;</FONT>
+<FONT COLOR="#000080">outFile=</FONT><FONT COLOR="#008000">&quot;workingcopy/diffTest/patch.txt&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2><BR>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="export">export</a></H3>
+<p>
+<ol>
+	<li>
+	Exports a clean directory tree from the repository specified by <CODE>srcurl</CODE>, 
+	at revision <CODE>revision</CODE> if it is given, otherwise at HEAD, into <CODE>destPath</CODE>.
+	</li>
+	<li>Exports a clean directory tree from the working copy specified by
+	<CODE>srcPath</CODE> into <CODE>destPath</CODE>.&nbsp; all local changes will be preserved, 
+	but files not under revision control will not be copied.</li>
+</ol>
+</p>
+<br/>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url to export from</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path to export from</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination path</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision of the source url to export from. Defaults is
+			&quot;HEAD&quot;<BR>Possible values are :<BR>- a date with the
+			following format : MM/DD/YYYY HH:MM AM_PM<BR>- a revision number<BR>-
+			HEAD, BASE, COMMITED or PREV
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+
+<H3><a name="ignore">ignore</a></H3>
+<p>Add a given file or a pattern to the ignored files list (modifies
+svn:ignore property)</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to ignore</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory on which we will update svn:ignore property</td>
+	</tr>
+	<tr>
+		<td>pattern</td>
+		<td>pattern to add to svn:ignore on the directory<BR>Only when dir
+			is set
+		</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;true&quot; to add the pattern recursively to
+			directories. Default is &quot;false&quot;<BR>Only when dir is set
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample" style="width: 663px; height: 42px">
+<p>Example :<BR>
+<FONT SIZE=2><FONT FACE="Courier New"><FONT COLOR="#000080">&lt;ignore</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/ignoreTest/dir1&quot;</FONT>
+<FONT COLOR="#000080">pattern=</FONT><FONT COLOR="#008000">&quot;*.ignore&quot;</FONT>
+<FONT COLOR="#000080">recurse=</FONT><FONT COLOR="#008000">&quot;true&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="import">import</a></H3>
+<p>Commit an unversioned file or tree into the repository.<BR>
+Recursively commit a copy of <CODE>path</CODE> to <CODE>url</CODE>.<BR>
+If <CODE>newEntry </CODE>is not set, copy top-level contents of <CODE>path</CODE>into<CODE>url</CODE>directly.&nbsp;
+Otherwise, create <CODE>newEntry </CODE>underneath <CODE>url </CODE>and begin copy there.
+</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>source path to export from</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>source url to import to</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>newEntry</td>
+		<td>&nbsp;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on single directory only.
+			Default is &quot;true&quot;
+		</td>
+		<td>False</td>
+	</tr>
+</table>
+
+<H3><a name="keywordsset">keywordsset</a></H3>
+<p>Keywordsset controls which keywords will be substituted on the
+given files. Valid keywords are:
+<ul>
+	<li>URL, HeadURL : The URL for the head version of the object.</li>
+	<li>Author, LastChangedBy : The last person to modify the file.</li>
+	<li>Date, LastChangedDate : The date/time the object was last modified.</li>
+	<li>Rev, LastChangedRevision : The last revision the object	changed.</li>
+	<li>Id : A compressed summary of the previous</li>
+</ul>
+</p>
+<br/>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>File for which keywords will be substituted</td>
+		<td>Either file, dir or filesets</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>All files in this directory will have their keywords substituted (recursively)</td>
+		<td>Either file, dir or filesets</td>
+	</tr>
+	<tr>
+		<td>keywords</td>
+		<td>The keywords to substitute on the given files</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>HeadURL/URL<BR>Author, LastChangedBy<BR>Date,
+			LastChangedDate<BR>Rev, LastChangedRevision<BR>Id
+		</td>
+		<td>Set to &ldquo;true&ldquo; the keyword to substitute it on the
+			given file.
+		</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files on which to apply keywords substitution.
+	</li>
+</ul>
+</p>
+
+<H3><a name="keywordsadd">keywordsadd</a></H3>
+<p>Keywordsadd add some keywords to be substituted on the given
+files. Present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+
+<H3><a name="keywordsremove">keywordsremove</a></H3>
+<p>Keywordsadd remove some keywords to be substituted on the given
+files. Other present keywords are not modified.<BR>
+The attributes are the same than for keywordsset command.</p>
+
+<H3><a name="mkdir">mkdir</a></H3>
+<p>Create a new directory under revision control.<BR>
+If target is a working copy path the directory is scheduled for addition in the
+working copy.&nbsp; If target is an url the directory is created in
+the repository via an immediate commit.&nbsp; <BR>
+In both cases all the intermediate directories must already exist.
+</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path to create</td>
+		<td>One of the two</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>url to create</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+
+<H3><a name="move">move</a></H3>
+<p>Move/rename something in working copy or repository.<BR><BR>&nbsp;
+cource and destination can both be working copy (WC) paths or
+URLs:<BR>&nbsp;&nbsp;&nbsp; WC&nbsp; -&gt; WC:&nbsp;&nbsp; move and
+schedule for addition (with history)<BR>&nbsp;&nbsp;&nbsp; URL -&gt;
+URL:&nbsp; complete server-side rename.
+</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>srcPath</td>
+		<td>source path</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>srcUrl</td>
+		<td>source url</td>
+	</tr>
+	<tr>
+		<td>destPath</td>
+		<td>destination path</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>destUrl</td>
+		<td>destination url</td>
+	</tr>
+	<tr>
+		<td>message</td>
+		<td>commit message</td>
+		<td>Yes</td>
+	</tr>
+</table>
+
+<H3><a name="propdel">propdel</a></H3>
+<p>Remove a property from files or dirs.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to delete the property</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to delete</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>if set, property will be removed recursively</td>
+		<td>No</td>
+	</tr>
+</table>
+
+<H3><a name="propget">propget</a></H3>
+<p>Get a property from a file or a directory.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to get the property</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to get</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>property</td>
+		<td>the name of the property to set with the value of the svn property</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file that will contain the value of the property</td>
+	</tr>
+</table>
+<div class="sample" style="width: 800px; height: 48px">
+<p>
+Example :<br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propget</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">property=</FONT><FONT COLOR="#008000">&quot;propTest.mimeType&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="propset">propset</a></H3>
+<p>Set a property on files or dirs.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory on which to set the property</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>name</td>
+		<td>name of the property to set</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>value</td>
+		<td>the value of the property</td>
+		<td ROWSPAN=2>One of the two</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>the file that will be used as a value</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>if set, property will be set recursively</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>
+<I>Note:</I>svn recognizes the following special versioned properties but 
+will store any arbitrary properties set:
+<ul>
+	<li>svn:ignore : A newline separated list of file patterns to ignore. </li>
+	<li>svn:keywords : Keywords to be expanded.&nbsp; Valid keywords are:
+		<ul>
+			<li>URL, HeadURL : The URL for the head version of the object.</li>
+			<li>Author, LastChangedBy : The last person to modify the file.</li>
+			<li>Date, LastChangedDate : The date/time the object was last modified.</li>
+			<li>Rev, LastChangedRevision : The last revision the object changed.</li>
+			<li>Id : A compressed summary of the previous 4 keywords. </li>
+		</ul>
+	</li>
+	<li>svn:executable : If present, make the file executable. This property cannot be set on a directory.&nbsp;
+	A non-recursive attempt will fail, and a recursive attempt will set
+	the property only on the file children of the directory 
+	</li>
+	<li>svn:eol-style : One of 'native', 'LF', 'CR', 'CRLF'. </li>
+	<li>svn:mime-type :  The mimetype of the file.&nbsp; Used to determine whether to merge the file, and
+	how to serve it from Apache. <BR>
+	A mimetype beginning with 'text/' (or an absent mimetype) is treated as text.&nbsp; Anything else is
+	treated as binary. 
+	</li>
+	<li>svn:externals : A newline separated list of module
+	specifiers, each of which consists of a relative directory path,
+	optional revision flags, and an URL.&nbsp; For example<BR>
+ 	foo             http://example.com/repos/zig <br>
+ 	foo/bar -r 1234 http://example.com/repos/zag
+	</li>
+</ul>
+</p>
+
+<H3><a name="revert">revert</a></H3>
+<p>Restore pristine working copy file (undo most local edits).</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to revert</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to revert</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;false&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>Parameters specified as nested elements :
+<ul>
+	<li>fileset<BR>
+	Filesets are used to select sets of files to revert. 
+	</li>
+</ul>
+</p>
+
+<H3><a name="status">status</a></H3>
+<p>Get the status of working copy files and directories.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>path of the file or directory</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>textStatusProperty</td>
+		<td>Name of the property to set to the status of the item</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>propStatusProperty</td>
+		<td>Name of the property to set to the status of the item
+			properties</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revisionProperty</td>
+		<td>Name of the property to set to the revision of the item (or &ldquo;&rdquo;
+			if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>lastChangedRevisionProperty</td>
+		<td>Name of the property to set to the last changed revision of the
+			item (or &ldquo;&rdquo; if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>lastCommitAuthorProperty</td>
+		<td>Name of the property to set to the last commit author (or &ldquo;&rdquo;
+			if unversioned)</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>urlProperty</td>
+		<td>Name of the property to set to the url of the item</td>
+		<td>No</td>
+	</tr>
+</table>
+<p>
+The value of TextStatusProperty can be :
+<ul>
+	<li>non-svn</li>
+	<li>normal : no modifications</li>
+	<li>added</li>
+	<li>missing : item is missing (removed by non-svn command)</li>
+	<li>incomplete</li>
+	<li>deleted</li>
+	<li>replaced</li>
+	<li>modified</li>
+	<li>merged</li>
+	<li>conflicted</li>
+	<li>obstructed</li>
+	<li>ignored</li>
+	<li>external</li>
+	<li>unversioned</li>
+</ul>
+The value of propStatusProperty can be :
+<ul>
+	<li>normal : no	modifications</li>
+	<li>conflicted</li>
+	<li>modified</li>
+</ul>
+</p>
+<p></p>
+<div class="sample">
+<p>
+Example : <br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;status</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/statusTest/added.txt&quot;</FONT>
+</FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>textStatusProperty=<FONT COLOR="#008000">&quot;testStatus.textStatus&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">propStatusProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.propStatus&quot;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastChangedRevisionProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitRevision&quot;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2>revisionProperty=<FONT COLOR="#008000">&quot;testStatus.revision&quot;</FONT></FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">lastCommitAuthorProperty=</FONT><FONT COLOR="#008000">&quot;testStatus.lastCommitAuthor&quot;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="switch">switch</a></H3>
+<p>Update the working copy to mirror a new URL within the repository.
+This behaviour is similar to 'svn update', and is the way to move a
+working copy to a branch or tag within the same repository.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>path</td>
+		<td>The working copy to switch to the given url</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>url</td>
+		<td>The url to switch to</td>
+		<td>Yes</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only.
+			Default is &quot;true&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+<div class="sample" style="width: 674px; height: 85px">
+<p>
+Example :
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080"><br>&lt;svn&gt;</FONT></FONT></FONT>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080"><br>&lt;switch</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/switchTest&quot;</FONT>
+<FONT COLOR="#000080">url=</FONT><FONT COLOR="#008000">&quot;${urlRepos}/switchTestBranch&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080"><FONT FACE="Courier New"><FONT SIZE=2><br>&lt;/svn&gt;</FONT></FONT></FONT>
+</p>
+</div>
+
+<H3><a name="update">update</a></H3>
+<p>Bring changes from the repository into the working copy.<BR>If no
+revision given, bring working copy up-to-date with HEAD rev.&nbsp;
+Else synchronize working copy to revision.</p>
+<table>
+	<tr>
+		<td>Attribute</td>
+		<td>Description</td>
+		<td>Required</td>
+	</tr>
+	<tr>
+		<td>file</td>
+		<td>file to update</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>dir</td>
+		<td>directory to update</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>recurse</td>
+		<td>Set to &quot;false&quot; to operate on a single directory only
+			(applies only when <CODE>dir</CODE> attribute is set). Default is
+			&quot;true&quot;</td>
+		<td>No</td>
+	</tr>
+	<tr>
+		<td>revision</td>
+		<td>revision. Defaults is &quot;HEAD&quot;<BR>Possible values are
+			:<BR>- a date with the following format : MM/DD/YYYY HH:MM AM_PM<BR>-
+			a revision number<BR>- HEAD, BASE, COMMITED or PREV</td>
+		<td>No</td>
+	</tr>
+</table>
+Parameters specified as nested elements :
+<ul>
+<li>fileset<BR>
+Filesets are used to select sets of files to update. 
+</li>
+</ul>
+
+<H2>Examples</H2>
+
+<p>
+<div class="sample" style="width: 843px; height: 128px">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">    <FONT FACE="Courier New"><FONT SIZE=2>&lt;fileset</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">      <FONT FACE="Courier New"><FONT SIZE=2>&lt;include</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;**/*.del&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT>
+<FONT COLOR="#000080">    <FONT FACE="Courier New"><FONT SIZE=2>&lt;/fileset&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;/delete&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;commit
+deleted files&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/deleteTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>
+deletes some files from repository (and commit changes)
+</p>
+
+<p>
+<div class="sample" style="width: 842px; height: 117px">
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;svn javahl=&quot;false&quot;&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;add</FONT>
+<FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT COLOR="#000080">  <FONT FACE="Courier New"><FONT SIZE=2>&lt;commit</FONT>
+<FONT COLOR="#000080">message=</FONT><FONT COLOR="#008000">&quot;propTest
+added&quot;</FONT> <FONT COLOR="#000080">dir=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+  <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;svn:mime-type&quot;</FONT>
+<FONT COLOR="#000080">value=</FONT><FONT COLOR="#008000">&quot;image/png&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+  <FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;propset</FONT>
+<FONT COLOR="#000080">path=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/file.png&quot;</FONT>
+<FONT COLOR="#000080">name=</FONT><FONT COLOR="#008000">&quot;myPicture&quot;</FONT>
+<FONT COLOR="#000080">file=</FONT><FONT COLOR="#008000">&quot;workingcopy/propTest/icon.gif&quot;</FONT><FONT COLOR="#000080">/&gt;</FONT></FONT></FONT><br>
+<FONT FACE="Courier New"><FONT SIZE=2><FONT COLOR="#000080">&lt;/svn&gt;</FONT></FONT></FONT>
+</div>add my_repos/propTest to repository and set two properties on file.png <br>
+subversion command line interface is used (javahl=&quot;false&quot;).
+</p>
+
+<HR>
+
+</BODY>
+</HTML>
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/lib/JAVAHL-LICENSE
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/lib/JAVAHL-LICENSE	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/lib/JAVAHL-LICENSE	(revision 15023)
@@ -0,0 +1,55 @@
+This license applies to all portions of Subversion which are not
+externally-maintained libraries (e.g. apr/, apr-util/, and neon/).
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+This is version 1 of this license.  It is also available online at
+http://subversion.tigris.org/license-1.html.  If newer versions of
+this license are posted there (the same URL, but with the version
+number incremented: .../license-2.html, .../license-3.html, and so
+on), you may use a newer version instead, at your option.
+
+====================================================================
+Copyright (c) 2000-2005 CollabNet.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if
+any, must include the following acknowledgment: "This product includes
+software developed by CollabNet (http://www.Collab.Net/)."
+Alternately, this acknowledgment may appear in the software itself, if
+and wherever such third-party acknowledgments normally appear.
+
+4. The hosted project names must not be used to endorse or promote
+products derived from this software without prior written
+permission. For written permission, please contact info@collab.net.
+
+5. Products derived from this software may not use the "Tigris" name
+nor may "Tigris" appear in their names without prior written
+permission of CollabNet.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL COLLABNET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+====================================================================
+
+This software consists of voluntary contributions made by many
+individuals on behalf of CollabNet.
+
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/lib/SVNCLIENTADAPTER-LICENSE	(revision 15023)
@@ -0,0 +1,185 @@
+SVNClientAdapter Library License
+
+This license applies to all portions of SVNClientAdapter library, which 
+are not externally-maintained libraries (e.g. JavaHL or JavaSVN).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+=============================================================================
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/license.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/license.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/license.txt	(revision 15023)
@@ -0,0 +1,64 @@
+SvnAnt license
+
+This license applies to all portions of svnant library, which 
+are not externally-maintained libraries (e.g. JavaHL).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+
Index: /release-kits/wirk3/ant-scripts/tasks/svnant/readme.txt
===================================================================
--- /release-kits/wirk3/ant-scripts/tasks/svnant/readme.txt	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/tasks/svnant/readme.txt	(revision 15023)
@@ -0,0 +1,38 @@
+SvnAnt
+======
+You can find latest version of svnant on http://subclipse.tigris.org
+
+Installation
+============
+Put the svnant.jar and svnClientAdapter.jar files to classpath of your ant build file.
+(Or directly to your ANT_HOME/lib directory.)
+If you plan to use JavaHL instead of commandline, put the svnjavahl.jar to the classpath too.
+(An of course put the appropriate native OS library on your PATH/LD_PATH too)
+
+In the build file, load the <svn> task.
+E.g. like this:
+  <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+(where svnant.jar lies in the "project.classpath")
+
+To provide access to the Subversion API, svnant uses svnClientAdapter on top of 
+either the JavaHL native Subversion Java (JNI) bindings or Subverion's
+command line programs (which must be installed and in your PATH).
+See the subclipse's FAQ <http://subclipse.tigris.org/faq.html#get-javahl">
+for info how to get JavaHL for your operating system.
+
+Documentation
+=============
+Documentation of the <svn> task is in the /doc directory.
+
+Play around
+===========
+To access the sources, just type "ant" in the directory containing the
+build.xml bundled with the distribution.  The default target will
+retrieve the sources corresponding to the version you have.  If you
+want to get the latest sources, type "ant checkoutLatest".
+
+Once you have the sources, svnant unit tests can be invoked using the
+top level build.xml by typing "ant runTests".  These tests provide a
+great set of examples of how to use svnant's Ant tasks and data types.
+
+Please send any usage questions to <mailto:users@subclipse.tigris.org>.
Index: /release-kits/wirk3/ant-scripts/wrap.xml
===================================================================
--- /release-kits/wirk3/ant-scripts/wrap.xml	(revision 15023)
+++ /release-kits/wirk3/ant-scripts/wrap.xml	(revision 15023)
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+		.......................................................... 
+		September 2007
+		Greenstone3 'release maker' script
+		Oran Fry
+		..........................................................
+-->
+
+<project name="wirk3-wrap" default="wrap">
+	<property name="java.installer" value="jre-6u3-windows-i586-p-s.exe"/>
+
+
+	<target name="wrap">
+		<addressedcall target="setup-for-wrapping"/>
+		<addressedcall target="compile-wrapper"/>
+		<addressedcall target="clean-up-after-wrapping"/>
+	</target>
+
+
+	<target name="setup-for-wrapping">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<mkdir dir="${basedir}/wrapped-installer/build"/>
+			<copy todir="${basedir}/wrapped-installer/build" file="${wirk3.home}/wrapper/wrapper.cpp"/>
+			<copy todir="${basedir}/wrapped-installer/build" file="${wirk3.home}/wrapper/wrapper.rc"/>
+			<copy todir="${basedir}/wrapped-installer/build" file="${wirk3.home}/wrapper/wrapper-with-jre.rc"/>
+
+			<!-- resources to bundle -->
+			<copy todir="${basedir}/wrapped-installer/build" file="${wirk3.home}/icon/gs3.ico"/>
+			<copy todir="${basedir}/wrapped-installer/build" file="${wirk3.home}/wrapper/${java.installer}"/>
+			<copy tofile="${basedir}/wrapped-installer/build/greenstone3.jar" file="${basedir}/installer/greenstone-${version}-win32.jar"/>
+			<copy todir="${basedir}/wrapped-installer/build" file="${basedir}/launcher/launch-installer.exe"/>
+
+			<!-- substitute in the real java installer filename -->
+			<rsr file="${basedir}/wrapped-installer/build/wrapper.rc" pattern="@java.installer@" replacement="${java.installer}"/>
+			<rsr file="${basedir}/wrapped-installer/build/wrapper-with-jre.rc" pattern="@java.installer@" replacement="${java.installer}"/>
+			<rsr file="${basedir}/wrapped-installer/build/wrapper.cpp" pattern="@java.installer@" replacement="${java.installer}"/>
+
+			
+		</if>
+	</target>
+
+	<target name="compile-wrapper">
+		<if><bool><istrue value="${execute}"/></bool>
+
+			<echo>Compiling the resources</echo>
+			<exec executable="rc" dir="${basedir}/wrapped-installer/build">
+				<arg line="wrapper.rc"/>
+			</exec>
+			<exec executable="rc" dir="${basedir}/wrapped-installer/build">
+				<arg line="wrapper-with-jre.rc"/>
+			</exec>
+
+			
+			<echo>Compiling the wrapper</echo>
+			<exec executable="cl" dir="${basedir}/wrapped-installer/build">
+				<arg line="/c -GX wrapper.cpp /out:wrapper.obj"/>
+			</exec>
+			
+			<echo>Linking</echo>
+			<exec executable="link" dir="${basedir}/wrapped-installer/build">
+				<arg line="/OUT:..\greenstone-${version}-win32.exe wrapper.obj wrapper.res"/>
+			</exec>
+			<exec executable="link" dir="${basedir}/wrapped-installer/build">
+				<arg line="/OUT:..\greenstone-${version}-win32-with-jre.exe wrapper.obj wrapper-with-jre.res"/>
+			</exec>
+		</if>
+	</target>
+
+	<target name="clean-up-after-wrapping">
+		<if><bool><istrue value="${execute}"/></bool>
+			<delete dir="${basedir}/wrapped-installer/build"/>
+		</if>
+	</target>
+
+
+
+</project>
Index: /release-kits/wirk3/bin/launch4j/.classpath
===================================================================
--- /release-kits/wirk3/bin/launch4j/.classpath	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/.classpath	(revision 15023)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry output="demo/SimpleApp/build" kind="src" path="demo/SimpleApp/src"/>
+	<classpathentry output="demo/ConsoleApp/build" kind="src" path="demo/ConsoleApp/src"/>
+	<classpathentry kind="lib" path="lib/formsrt.jar"/>
+	<classpathentry kind="lib" path="lib/xstream.jar"/>
+	<classpathentry kind="lib" path="lib/commons-beanutils.jar"/>
+	<classpathentry kind="lib" path="lib/commons-logging.jar"/>
+	<classpathentry kind="lib" path="lib/looks.jar"/>
+	<classpathentry kind="lib" path="lib/foxtrot.jar"/>
+	<classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.apache.ant_1.6.5/lib/ant.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/j2sdk1.4.2"/>
+	<classpathentry kind="output" path="build"/>
+</classpath>
Index: /release-kits/wirk3/bin/launch4j/.project
===================================================================
--- /release-kits/wirk3/bin/launch4j/.project	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/.project	(revision 15023)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>launch4j</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: /release-kits/wirk3/bin/launch4j/LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/LICENSE.txt	(revision 15023)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /release-kits/wirk3/bin/launch4j/bin/COPYING
===================================================================
--- /release-kits/wirk3/bin/launch4j/bin/COPYING	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/bin/COPYING	(revision 15023)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /release-kits/wirk3/bin/launch4j/build.xml
===================================================================
--- /release-kits/wirk3/bin/launch4j/build.xml	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/build.xml	(revision 15023)
@@ -0,0 +1,62 @@
+<project name="launch4j" default="compile" basedir=".">
+	<property name="src" location="src" />
+	<property name="lib" location="lib" />
+	<property name="build" location="build" />
+	<property name="jar" location="./${ant.project.name}.jar" />
+	<property name="launch4j.dir" location="." />
+
+	<path id="dist.classpath">
+		<pathelement path="${build}" />
+		<fileset dir="${lib}">
+			<include name="**/*.jar" />
+		</fileset>
+	</path>
+
+	<target name="init">
+		<tstamp />
+		<mkdir dir="${build}" />
+	</target>
+
+	<target name="compile" depends="init" description="compile the source">
+		<javac srcdir="${src}" destdir="${build}" classpathref="dist.classpath" source="1.4" debug="on" />
+		<copy todir="${build}/images">
+			<fileset dir="${src}/images">
+				<include name="**/*" />
+			</fileset>
+		</copy>
+		<copy todir="${build}">
+			<fileset dir="${src}">
+				<include name="**/*.properties" />
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="jar" depends="compile" description="create jar">
+		<fileset dir="${lib}" id="lib.dist.fileset">
+			<include name="**/*.jar" />
+		</fileset>
+		<pathconvert pathsep=" " property="dist.classpath" refid="lib.dist.fileset">
+			<map from="${lib}" to="./lib" />
+		</pathconvert>
+		<!-- Put everything in ${build} into a jar file -->
+		<jar jarfile="${jar}">
+			<fileset dir="${build}" includes="**/*" />
+			<manifest>
+				<attribute name="Main-Class" value="net.sf.launch4j.Main" />
+				<attribute name="Class-Path" value=". ${dist.classpath}" />
+			</manifest>
+		</jar>
+	</target>
+
+	<target name="demo" depends="jar" description="build the demos">
+		<ant dir="./demo/ConsoleApp" inheritAll="false" />
+		<ant dir="./demo/SimpleApp" inheritAll="false" />
+	</target>
+
+	<target name="clean" description="clean up">
+		<delete dir="${build}" />
+		<delete file="${jar}" />
+		<ant dir="./demo/ConsoleApp" target="clean" inheritAll="false" />
+		<ant dir="./demo/SimpleApp" target="clean" inheritAll="false" />
+	</target>
+</project>
Index: /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.bat
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.bat	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.bat	(revision 15023)
@@ -0,0 +1,14 @@
+@echo off
+if "%ANT_HOME%"=="" goto noAntHome
+if "%JAVA_HOME%"=="" goto noJavaHome
+call "%ANT_HOME%\bin\ant.bat" exe
+goto end
+
+:noAntHome
+echo ANT_HOME environment variable is not set
+goto end
+
+:noJavaHome
+echo JAVA_HOME environment variable is not set
+
+:end
Index: /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.xml
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.xml	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/build.xml	(revision 15023)
@@ -0,0 +1,56 @@
+<project name="ConsoleApp" default="exe" basedir=".">
+	<property name="src" location="src" />
+	<property name="lib" location="lib" />
+	<property name="build" location="build" />
+	<property name="launch4j.dir" location="../.." />
+
+	<path id="dist.classpath">
+		<pathelement path="${build}" />
+		<fileset dir="${lib}">
+			<include name="**/*.jar" />
+		</fileset>
+	</path>
+
+	<target name="init">
+		<tstamp />
+		<mkdir dir="${build}" />
+	</target>
+
+	<target name="compile" depends="init" description="compile the source">
+		<javac srcdir="${src}" destdir="${build}" classpathref="dist.classpath" source="1.4" debug="on" />
+	</target>
+
+	<target name="jar" depends="compile" description="create the jar">
+		<fileset dir="${lib}" id="lib.dist.fileset">
+			<include name="**/*.jar" />
+		</fileset>
+		<pathconvert pathsep=" " property="dist.classpath" refid="lib.dist.fileset">
+			<map from="${lib}" to=".\lib" />
+		</pathconvert>
+		<!-- Put everything in ${build} into a jar file -->
+		<jar jarfile="${ant.project.name}.jar">
+			<fileset dir="${build}" includes="**/*" />
+			<manifest>
+				<!-- SET YOUR MAIN CLASS HERE -->
+				<attribute name="Main-Class" value="net.sf.launch4j.example.ConsoleApp" />
+				<attribute name="Class-Path" value=". ${dist.classpath}" />
+			</manifest>
+		</jar>
+	</target>
+
+	<target name="exe" depends="jar">
+		<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar
+		    :${launch4j.dir}/lib/xstream.jar" />
+		<launch4j>
+			<config headerType="1" jar="ConsoleApp.jar" outfile="ConsoleApp.exe" errTitle="ConsoleApp" chdir="." customProcName="true" icon="l4j/ConsoleApp.ico">
+				<jre minVersion="1.4.0" />
+			</config>
+		</launch4j>
+	</target>
+
+	<target name="clean" description="clean up">
+		<delete dir="${build}" />
+		<delete file="${ant.project.name}.jar" />
+		<delete file="${ant.project.name}.exe" />
+	</target>
+</project>
Index: /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/lib/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/lib/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/lib/readme.txt	(revision 15023)
@@ -0,0 +1,8 @@
+Put your jar libs here and the build script will include them
+in the classpath stored inside the jar manifest.
+In order to run your application move the output exe file from
+the dist directory to the same level as lib. 
+
+SimpleApp.exe
+lib/
+lib/xml.jar
Index: /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/readme.txt	(revision 15023)
@@ -0,0 +1,1 @@
+To build the example application set JAVA_HOME and ANT_HOME environment variables.
Index: /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java	(revision 15023)
@@ -0,0 +1,59 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.example;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class ConsoleApp {
+    public static void main(String[] args) {
+		StringBuffer sb = new StringBuffer("Hello World!\n\nJava version: ");
+		sb.append(System.getProperty("java.version"));
+		sb.append("\nJava home: ");
+		sb.append(System.getProperty("java.home"));
+		sb.append("\nCurrent dir: ");
+		sb.append(System.getProperty("user.dir"));
+		if (args.length > 0) {
+			sb.append("\nArgs: ");
+			for (int i = 0; i < args.length; i++) {
+				sb.append(args[i]);
+				sb.append(' ');
+			}
+		}
+		sb.append("\n\nEnter a line of text, Ctrl-C to stop.\n\n>");
+		System.out.print(sb.toString());
+		try {
+			BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
+			String line;
+			while ((line = is.readLine()) != null) {
+				System.out.print("You wrote: " + line + "\n\n>");
+			}
+			is.close();
+		} catch (IOException e) {
+			System.err.print(e);
+		}
+    }
+}
Index: /release-kits/wirk3/bin/launch4j/demo/LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/LICENSE.txt	(revision 15023)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.bat
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.bat	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.bat	(revision 15023)
@@ -0,0 +1,14 @@
+@echo off
+if "%ANT_HOME%"=="" goto noAntHome
+if "%JAVA_HOME%"=="" goto noJavaHome
+call "%ANT_HOME%\bin\ant.bat" exe
+goto end
+
+:noAntHome
+echo ANT_HOME environment variable is not set
+goto end
+
+:noJavaHome
+echo JAVA_HOME environment variable is not set
+
+:end
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.xml
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.xml	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/build.xml	(revision 15023)
@@ -0,0 +1,52 @@
+<project name="SimpleApp" default="exe" basedir=".">
+	<property name="src" location="src" />
+	<property name="lib" location="lib" />
+	<property name="build" location="build" />
+	<property name="launch4j.dir" location="../.." />
+
+	<path id="dist.classpath">
+		<pathelement path="${build}" />
+		<fileset dir="${lib}">
+			<include name="**/*.jar" />
+		</fileset>
+	</path>
+
+	<target name="init">
+		<tstamp />
+		<mkdir dir="${build}" />
+	</target>
+
+	<target name="compile" depends="init" description="compile the source">
+		<javac srcdir="${src}" destdir="${build}" classpathref="dist.classpath" source="1.4" debug="on" />
+	</target>
+
+	<target name="jar" depends="compile" description="create the jar">
+		<fileset dir="${lib}" id="lib.dist.fileset">
+			<include name="**/*.jar" />
+		</fileset>
+		<pathconvert pathsep=" " property="dist.classpath" refid="lib.dist.fileset">
+			<map from="${lib}" to=".\lib" />
+		</pathconvert>
+		<!-- Put everything in ${build} into a jar file -->
+		<jar jarfile="${ant.project.name}.jar">
+			<fileset dir="${build}" includes="**/*" />
+			<manifest>
+				<!-- SET YOUR MAIN CLASS HERE -->
+				<attribute name="Main-Class" value="net.sf.launch4j.example.SimpleApp" />
+				<attribute name="Class-Path" value=". ${dist.classpath}" />
+			</manifest>
+		</jar>
+	</target>
+
+	<target name="exe" depends="jar">
+		<taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar
+		    :${launch4j.dir}/lib/xstream.jar" />
+		<launch4j configFile="./l4j/SimpleApp.xml" />
+	</target>
+
+	<target name="clean" description="clean up">
+		<delete dir="${build}" />
+		<delete file="${ant.project.name}.jar" />
+		<delete file="${ant.project.name}.exe" />
+	</target>
+</project>
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/l4j/SimpleApp.xml
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/l4j/SimpleApp.xml	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/l4j/SimpleApp.xml	(revision 15023)
@@ -0,0 +1,18 @@
+<launch4jConfig>
+  <headerType>0</headerType>
+  <jar>../SimpleApp.jar</jar>
+  <outfile>../SimpleApp.exe</outfile>
+  <errTitle>SimpleApp</errTitle>
+  <chdir>.</chdir>
+  <customProcName>true</customProcName>
+  <icon>SimpleApp.ico</icon>
+  <jre>
+    <minVersion>1.4.0</minVersion>
+  </jre>
+  <splash>
+    <file>splash.bmp</file>
+    <waitForWindow>true</waitForWindow>
+    <timeout>60</timeout>
+    <timeoutErr>true</timeoutErr>
+  </splash>
+</launch4jConfig>
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/lib/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/lib/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/lib/readme.txt	(revision 15023)
@@ -0,0 +1,8 @@
+Put your jar libs here and the build script will include them
+in the classpath stored inside the jar manifest.
+In order to run your application move the output exe file from
+the dist directory to the same level as lib. 
+
+SimpleApp.exe
+lib/
+lib/xml.jar
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/readme.txt	(revision 15023)
@@ -0,0 +1,1 @@
+To build the example application set JAVA_HOME and ANT_HOME environment variables.
Index: /release-kits/wirk3/bin/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java	(revision 15023)
@@ -0,0 +1,92 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.example;
+
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.UIManager;
+
+public class SimpleApp extends JFrame {
+    public SimpleApp(String[] args) {
+        super("Java Application");
+        final int inset = 100;
+        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+		setBounds (inset, inset,
+				screenSize.width - inset * 2, screenSize.height - inset * 2);
+
+		JMenu menu = new JMenu("File");
+		menu.add(new JMenuItem("Open"));
+		menu.add(new JMenuItem("Save"));
+		JMenuBar mb = new JMenuBar();
+		mb.setOpaque(true);
+		mb.add(menu);
+		setJMenuBar(mb);
+
+		this.addWindowListener(new WindowAdapter() {
+	    	public void windowClosing(WindowEvent e) {
+				System.exit(0);
+		}});
+		setVisible(true);
+
+		StringBuffer sb = new StringBuffer("Java version: ");
+		sb.append(System.getProperty("java.version"));
+		sb.append("\nJava home: ");
+		sb.append(System.getProperty("java.home"));
+		sb.append("\nCurrent dir: ");
+		sb.append(System.getProperty("user.dir"));
+		if (args.length > 0) {
+			sb.append("\nArgs: ");
+			for (int i = 0; i < args.length; i++) {
+				sb.append(args[i]);
+				sb.append(' ');
+			}
+		}
+		JOptionPane.showMessageDialog(this,
+				sb.toString(),
+				"Info",
+				JOptionPane.INFORMATION_MESSAGE);
+    }
+
+	public static void setLAF() {
+		JFrame.setDefaultLookAndFeelDecorated(true);
+		Toolkit.getDefaultToolkit().setDynamicLayout(true);
+		System.setProperty("sun.awt.noerasebackground","true");
+		try {
+			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
+		} catch (Exception e) {
+			System.err.println("Failed to set LookAndFeel");
+		}
+	}
+
+   	public static void main(String[] args) {
+   		setLAF();
+		new SimpleApp(args);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/demo/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/demo/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/demo/readme.txt	(revision 15023)
@@ -0,0 +1,3 @@
+JRE/SDK 1.4.0 or higher must be installed on your system to run this demo.
+
+try running it with some command line arguments...
Index: /release-kits/wirk3/bin/launch4j/head/LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/head/LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head/LICENSE.txt	(revision 15023)
@@ -0,0 +1,513 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /release-kits/wirk3/bin/launch4j/head_src/LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/LICENSE.txt	(revision 15023)
@@ -0,0 +1,513 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /release-kits/wirk3/bin/launch4j/head_src/consolehead/Makefile.win
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/consolehead/Makefile.win	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/consolehead/Makefile.win	(revision 15023)
@@ -0,0 +1,33 @@
+# Project: consolehead
+# Makefile created by Dev-C++ 4.9.9.2
+
+CPP  = g++.exe
+CC   = gcc.exe
+WINDRES = windres.exe
+RES  = 
+OBJ  = consolehead.o ../head.o $(RES)
+LINKOBJ  = consolehead.o ../head.o $(RES)
+LIBS =  -L"C:/Dev-Cpp/lib" -n  -s 
+INCS =  -I"C:/Dev-Cpp/include" 
+CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
+BIN  = consolehead.exe
+CXXFLAGS = $(CXXINCS)   -fexpensive-optimizations -O3
+CFLAGS = $(INCS)   -fexpensive-optimizations -O3
+RM = rm -f
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before consolehead.exe all-after
+
+
+clean: clean-custom
+	${RM} $(OBJ) $(BIN)
+
+$(BIN): $(OBJ)
+	$(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS)
+
+consolehead.o: consolehead.c
+	$(CC) -c consolehead.c -o consolehead.o $(CFLAGS)
+
+../head.o: ../head.c
+	$(CC) -c ../head.c -o ../head.o $(CFLAGS)
Index: /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.c
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.c	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.c	(revision 15023)
@@ -0,0 +1,66 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "../resource.h"
+#include "../head.h"
+
+int main(int argc, char* argv[])
+{
+    setConsoleFlag();
+	HMODULE hLibrary = NULL;
+	char cmdLine[BIG_STR] = {0};
+    int i; // causes error: 'for' loop initial declaration used outside C99 mode.
+	for (i = 1; i < argc; i++) {
+        BOOL quote = strchr(argv[i], ' ') != NULL;
+        if (quote) {
+           strcat(cmdLine, "\"");
+        }
+		strcat(cmdLine, argv[i]);
+        if (quote) {
+           strcat(cmdLine, "\"");
+        }
+		if (i < argc - 1) {
+			strcat(cmdLine, " ");
+		}
+	}
+	if (!prepare(hLibrary, cmdLine)) {
+		if (hLibrary != NULL) {
+			FreeLibrary(hLibrary);
+		}
+		return 1;
+	}
+	FreeLibrary(hLibrary);
+
+	int result = (int) execute(TRUE);
+	if (result == -1) {
+		char errMsg[BIG_STR];
+        strcpy(errMsg, "could not start the application: ");
+		strcat(errMsg, strerror(errno));
+		msgBox(errMsg);
+		return 1;
+	} else {
+		return result;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.dev
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.dev	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/consolehead/consolehead.dev	(revision 15023)
@@ -0,0 +1,108 @@
+[Project]
+FileName=consolehead.dev
+Name=consolehead
+UnitCount=4
+Type=1
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=-n_@@_
+IsCpp=0
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=0
+OverrideOutputName=consolehead.exe
+HostApplication=
+Folders=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000000001001000000100
+
+[Unit1]
+FileName=consolehead.c
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit2]
+FileName=..\resource.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=..\head.c
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit4]
+FileName=..\head.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=..\head.rc
+Folder=consolehead
+Compile=1
+Link=0
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit6]
+FileName=..\resid.h
+CompileCpp=0
+Folder=consolehead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
Index: /release-kits/wirk3/bin/launch4j/head_src/guihead/Makefile.win
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/guihead/Makefile.win	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/guihead/Makefile.win	(revision 15023)
@@ -0,0 +1,33 @@
+# Project: guihead
+# Makefile created by Dev-C++ 4.9.9.2
+
+CPP  = g++.exe
+CC   = gcc.exe
+WINDRES = windres.exe
+RES  = 
+OBJ  = guihead.o ../head.o $(RES)
+LINKOBJ  = guihead.o ../head.o $(RES)
+LIBS =  -L"C:/Dev-Cpp/lib" -mwindows -n  -s 
+INCS =  -I"C:/Dev-Cpp/include" 
+CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
+BIN  = guihead.exe
+CXXFLAGS = $(CXXINCS)   -fexpensive-optimizations -O3
+CFLAGS = $(INCS)   -fexpensive-optimizations -O3
+RM = rm -f
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before guihead.exe all-after
+
+
+clean: clean-custom
+	${RM} $(OBJ) $(BIN)
+
+$(BIN): $(OBJ)
+	$(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS)
+
+guihead.o: guihead.c
+	$(CC) -c guihead.c -o guihead.o $(CFLAGS)
+
+../head.o: ../head.c
+	$(CC) -c ../head.c -o ../head.o $(CFLAGS)
Index: /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.c
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.c	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.c	(revision 15023)
@@ -0,0 +1,158 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "../resource.h"
+#include "../head.h"
+#include "guihead.h"
+
+extern PROCESS_INFORMATION pi;
+
+HWND hWnd;
+DWORD dwExitCode = 0;
+BOOL stayAlive = FALSE;
+BOOL splash = FALSE;
+BOOL splashTimeoutErr;
+BOOL waitForWindow;
+int splashTimeout;		// tick count (s)
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPSTR     lpCmdLine,
+                     int       nCmdShow) {
+	HMODULE hLibrary = NULL;
+	if (!prepare(hLibrary, lpCmdLine)) {
+		if (hLibrary != NULL) {
+			FreeLibrary(hLibrary);
+		}
+		return 1;
+	}
+
+	splash = loadBoolString(hLibrary, SHOW_SPLASH);
+	stayAlive = loadBoolString(hLibrary, GUI_HEADER_STAYS_ALIVE);
+	if (splash || stayAlive) {
+		hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "",
+				WS_POPUP | SS_BITMAP,
+				0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
+		if (splash) {
+			char timeout[10] = {0};
+			if (!loadString(hLibrary, SPLASH_TIMEOUT, timeout)) {
+				msgBox("Cannot load splash timeout property.");
+				return 1;
+			}
+			splashTimeout = atoi(timeout);
+			if (splashTimeout <= 0 || splashTimeout > 60 * 15 /* 15 minutes */) {
+				msgBox("Invalid splash timeout property.");
+				return 1;
+			}
+			splashTimeoutErr = loadBoolString(hLibrary, SPLASH_TIMEOUT_ERR);
+			waitForWindow = loadBoolString(hLibrary, SPLASH_WAITS_FOR_WINDOW);
+			HANDLE hImage = LoadImage(hInstance,	// handle of the instance containing the image
+					MAKEINTRESOURCE(SPLASH_BITMAP),	// name or identifier of image
+					IMAGE_BITMAP,					// type of image
+					0,								// desired width
+					0,								// desired height
+					LR_DEFAULTSIZE);
+			if (hImage == NULL) {
+				msgBox("Cannot load splash screen.");
+				return 1;
+			}
+			SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage);
+			RECT rect;
+			GetWindowRect(hWnd, &rect);
+			int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2;
+			int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2;
+			SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE);
+			ShowWindow(hWnd, nCmdShow);
+			UpdateWindow (hWnd);
+		}
+		if (!SetTimer (hWnd, ID_TIMER, 1000 /* 1s */, TimerProc)) {
+			return 1;
+		}
+	}
+	FreeLibrary(hLibrary);
+	if (execute(FALSE) == -1) {
+		char errMsg[BIG_STR];
+        strcpy(errMsg, "Error occured while starting the application...\n");
+		strcat(errMsg, strerror(errno));
+		msgBox(errMsg);
+		return 1;
+	}
+	if (!(splash || stayAlive)) {
+		closeHandles();
+		return 0;
+	}
+	MSG msg;
+	while (GetMessage(&msg, NULL, 0, 0)) {
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+	closeHandles();
+	return dwExitCode;
+}
+
+BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) {
+	DWORD processId;
+	GetWindowThreadProcessId(hwnd, &processId);
+	if (pi.dwProcessId == processId) {
+		LONG styles = GetWindowLong(hwnd, GWL_STYLE);
+		if ((styles & WS_VISIBLE) != 0) {
+			splash = FALSE;
+			ShowWindow(hWnd, SW_HIDE);
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
+VOID CALLBACK TimerProc(
+	HWND hwnd,			// handle of window for timer messages
+	UINT uMsg,			// WM_TIMER message
+	UINT idEvent,		// timer identifier
+	DWORD dwTime) {		// current system time
+	
+	if (splash) {
+		if (splashTimeout == 0) {
+			splash = FALSE;
+			ShowWindow(hWnd, SW_HIDE);
+			if (waitForWindow && splashTimeoutErr) {
+				KillTimer(hwnd, ID_TIMER);
+				msgBox("Could not start the application, operation timed out.");
+				PostQuitMessage(0);
+			}
+		} else {
+			splashTimeout--;
+			if (waitForWindow) {
+				EnumWindows(enumwndfn, 0);
+			}
+		}
+	}
+	GetExitCodeProcess(pi.hProcess, &dwExitCode);
+	if (dwExitCode != STILL_ACTIVE
+			|| !(splash || stayAlive)) {
+		KillTimer(hWnd, ID_TIMER);
+		PostQuitMessage(0);	
+		return;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.dev
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.dev	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.dev	(revision 15023)
@@ -0,0 +1,119 @@
+[Project]
+FileName=guihead.dev
+Name=guihead
+UnitCount=5
+Type=0
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=-n_@@_
+IsCpp=0
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=0
+OverrideOutputName=guihead.exe
+HostApplication=
+Folders=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=0000000001001000000100
+
+[Unit1]
+FileName=guihead.c
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit2]
+FileName=guihead.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit4]
+FileName=..\head.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit6]
+FileName=..\resource.h
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+CompileCpp=0
+
+[Unit7]
+FileName=..\resid.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=..\head.c
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=..\resource.h
+CompileCpp=0
+Folder=guihead
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
Index: /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.h
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.h	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/guihead/guihead.h	(revision 15023)
@@ -0,0 +1,33 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#define ID_TIMER 1
+
+VOID CALLBACK TimerProc(
+  HWND hwnd,     // handle of window for timer messages
+  UINT uMsg,     // WM_TIMER message
+  UINT idEvent,  // timer identifier
+  DWORD dwTime   // current system time
+);
Index: /release-kits/wirk3/bin/launch4j/head_src/head.c
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/head.c	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/head.c	(revision 15023)
@@ -0,0 +1,478 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#include "resource.h"
+#include "head.h"
+
+BOOL debug = FALSE;
+BOOL console = FALSE;
+int foundJava = NO_JAVA_FOUND;
+
+struct _stat statBuf;
+PROCESS_INFORMATION pi;
+
+char errTitle[STR] = "Launch4j";
+char javaMinVer[STR] = {0};
+char javaMaxVer[STR] = {0};
+char foundJavaVer[STR] = {0};
+
+char workingDir[_MAX_PATH] = {0};
+char cmd[_MAX_PATH] = {0};
+char args[MAX_ARGS] = {0};
+
+void setConsoleFlag() {
+     console = TRUE;
+}
+
+void titledMsgBox(const char* title, const char* text) {
+    if (console) {
+        printf("%s: %s\n", title, text);
+    } else {
+    	MessageBox(NULL, text, title, MB_OK);
+    }
+}
+
+void msgBox(const char* text) {
+    titledMsgBox(errTitle, text);
+}
+
+void showJavaWebPage() {
+	ShellExecute(NULL, "open", "http://java.com/download", NULL, NULL, SW_SHOWNORMAL);
+}
+
+BOOL loadString(HMODULE hLibrary, int resID, char* buffer) {
+	HRSRC hResource;
+	HGLOBAL hResourceLoaded;
+	LPBYTE lpBuffer;
+
+	hResource = FindResourceEx(hLibrary, RT_RCDATA, MAKEINTRESOURCE(resID),
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));
+	if (NULL != hResource) {
+		hResourceLoaded = LoadResource(hLibrary, hResource);
+		if (NULL != hResourceLoaded) {
+			lpBuffer = (LPBYTE) LockResource(hResourceLoaded);            
+			if (NULL != lpBuffer) {     
+				int x = 0;
+				do {
+					buffer[x] = (char) lpBuffer[x];
+				} while (buffer[x++] != 0);
+				return TRUE;
+			}
+		}    
+	}
+	return FALSE;
+}
+
+BOOL loadBoolString(HMODULE hLibrary, int resID) {
+	char boolStr[10] = {0};
+	loadString(hLibrary, resID, boolStr);
+	return strcmp(boolStr, TRUE_STR) == 0;
+}
+
+void regSearch(HKEY hKey, const char* keyName, int searchType) {
+	DWORD x = 0;
+	unsigned long size = BIG_STR;
+	FILETIME time;
+	char buffer[BIG_STR] = {0};
+	while (RegEnumKeyEx(
+				hKey,			// handle to key to enumerate
+				x++,			// index of subkey to enumerate
+				buffer,			// address of buffer for subkey name
+				&size,			// address for size of subkey buffer
+				NULL,			// reserved
+				NULL,			// address of buffer for class string
+				NULL,			// address for size of class buffer
+				&time) == ERROR_SUCCESS) {
+		if (strcmp(buffer, javaMinVer) >= 0
+				&& (javaMaxVer[0] == 0 || strcmp(buffer, javaMaxVer) <= 0)
+				&& strcmp(buffer, foundJavaVer) > 0) {
+			strcpy(foundJavaVer, buffer);
+			foundJava = searchType;
+		}
+		size = BIG_STR;
+	}
+}
+
+BOOL findJavaHome(char* path) {
+	HKEY hKey;
+	const char jre[] = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
+	const char sdk[] = "SOFTWARE\\JavaSoft\\Java Development Kit";
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(jre),
+			0,
+            KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+			&hKey) == ERROR_SUCCESS) {
+		regSearch(hKey, jre, FOUND_JRE);
+		RegCloseKey(hKey);
+	}
+	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(sdk),
+			0,
+            KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+			&hKey) == ERROR_SUCCESS) {
+		regSearch(hKey, sdk, FOUND_SDK);
+		RegCloseKey(hKey);
+	}
+	if (foundJava != NO_JAVA_FOUND) {
+		char keyBuffer[BIG_STR];
+		unsigned long datatype;
+		unsigned long bufferlength = BIG_STR;
+		if (foundJava == FOUND_JRE)	{
+			strcpy(keyBuffer, jre);
+		} else {
+			strcpy(keyBuffer, sdk);
+		}
+		strcat(keyBuffer, "\\");
+		strcat(keyBuffer, foundJavaVer);
+		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			TEXT(keyBuffer),
+			0,
+            KEY_QUERY_VALUE,
+			&hKey) == ERROR_SUCCESS) {
+			unsigned char buffer[BIG_STR] = {0};
+			if (RegQueryValueEx(hKey, "JavaHome", NULL, &datatype, buffer, &bufferlength)
+					== ERROR_SUCCESS) {
+				int i = 0;
+				do {
+					path[i] = buffer[i];
+				} while (path[i++] != 0);
+				if (foundJava == FOUND_SDK) {
+					strcat(path, "\\jre");
+				}
+				RegCloseKey(hKey);
+				return TRUE;
+			}
+			RegCloseKey(hKey);
+		}
+	}
+	return FALSE;
+}
+
+/*
+ * Extract the executable name, returns path length.
+ */
+int getExePath(char* exePath) {
+	HMODULE hModule = GetModuleHandle(NULL);
+    if (hModule == 0
+			|| GetModuleFileName(hModule, exePath, _MAX_PATH) == 0) {
+        return -1;
+    }
+	return strrchr(exePath, '\\') - exePath;
+}
+
+void appendJavaw(char* jrePath) {
+    if (console) {
+	    strcat(jrePath, "\\bin\\java.exe");
+    } else {
+        strcat(jrePath, "\\bin\\javaw.exe");
+    }
+}
+
+void appendLauncher(BOOL setProcName, char* exePath, int pathLen, char* cmd) {
+	if (setProcName) {
+		char tmpspec[_MAX_PATH];
+		char tmpfile[_MAX_PATH];
+		strcpy(tmpspec, cmd);
+		strcat(tmpspec, LAUNCH4J_TMP_DIR);
+		tmpspec[strlen(tmpspec) - 1] = 0;
+		if (_stat(tmpspec, &statBuf) == 0) {
+			// remove temp launchers
+			struct _finddata_t c_file;
+			long hFile;
+			strcat(tmpspec, "\\*.exe");
+			strcpy(tmpfile, cmd);
+			strcat(tmpfile, LAUNCH4J_TMP_DIR);
+			char* filename = tmpfile + strlen(tmpfile);
+			if ((hFile = _findfirst(tmpspec, &c_file)) != -1L) {
+				do {
+					strcpy(filename, c_file.name);
+					_unlink(tmpfile);
+				} while (_findnext(hFile, &c_file) == 0);
+			}
+			_findclose(hFile);
+		} else {
+			if (_mkdir(tmpspec) != 0) {
+				appendJavaw(cmd);
+				return;
+			}
+		}
+		char javaw[_MAX_PATH];
+		strcpy(javaw, cmd);
+		appendJavaw(javaw);
+		strcpy(tmpfile, cmd);
+		strcat(tmpfile, LAUNCH4J_TMP_DIR);
+		char* exeFilePart = exePath + pathLen + 1;
+		strcat(tmpfile, exeFilePart);
+		if (CopyFile(javaw, tmpfile, FALSE)) {
+			strcpy(cmd, tmpfile);
+			return;
+		} else if (_stat(javaw, &statBuf) == 0) {
+			long fs = statBuf.st_size;
+			if (_stat(tmpfile, &statBuf) == 0 && fs == statBuf.st_size) {
+				strcpy(cmd, tmpfile);
+				return;
+			}
+		}
+	}
+	appendJavaw(cmd);
+}
+
+BOOL isJrePathOk(char* path) {
+	if (!*path) {
+		return FALSE;
+	}
+	char javaw[_MAX_PATH];
+	strcpy(javaw, path);
+	appendJavaw(javaw);
+	return _stat(javaw, &statBuf) == 0;
+}
+
+BOOL prepare(HMODULE hLibrary, char *lpCmdLine) {
+    char tmp[MAX_ARGS] = {0};
+    GetEnvironmentVariable("launch4j", tmp, STR);
+    debug = _stricmp(tmp, "debug") == 0;
+
+	// Open executable
+	char exePath[_MAX_PATH] = {0};
+	int pathLen = getExePath(exePath);
+	if (pathLen == -1) {
+		msgBox("Cannot determinate exe file name.");
+		return FALSE;
+	}
+	hLibrary = LoadLibrary(exePath);
+	if (hLibrary == NULL) {
+		char msg[BIG_STR];
+        strcpy(msg, "Cannot find file: ");
+		strcat(msg, exePath);
+		msgBox(msg);
+		return FALSE;
+	}
+
+	// Error message box title
+	loadString(hLibrary, ERR_TITLE, errTitle);
+
+	// Working dir
+	char tmp_path[_MAX_PATH] = {0};
+	if (loadString(hLibrary, CHDIR, tmp_path)) {
+		strncpy(workingDir, exePath, pathLen);
+		strcat(workingDir, "\\");
+		strcat(workingDir, tmp_path);
+		_chdir(workingDir);
+	}
+
+	// Custom process name
+	const BOOL setProcName = loadBoolString(hLibrary, SET_PROC_NAME);
+
+	// Use bundled jre or find java
+	if (loadString(hLibrary, JRE_PATH, tmp_path)) {
+		if (tmp_path[0] == '\\' || tmp_path[1] == ':') {
+			// Absolute
+			strcpy(cmd, tmp_path);
+		} else {
+			// Relative
+			strncpy(cmd, exePath, pathLen);
+			strcat(cmd, "\\");
+			strcat(cmd, tmp_path);
+		}
+    }
+	if (!isJrePathOk(cmd)) {
+		if (!loadString(hLibrary, JAVA_MIN_VER, javaMinVer)) {
+			msgBox("Cannot find bundled JRE or javaw.exe is missing.");
+			return FALSE;
+		}
+		loadString(hLibrary, JAVA_MAX_VER, javaMaxVer);
+		if (!findJavaHome(cmd)) {
+			char txt[BIG_STR];
+			strcpy(txt, "Cannot find Java ");
+			strcat(txt, javaMinVer);
+			if (*javaMaxVer) {
+				strcat(txt, " - ");
+				strcat(txt, javaMaxVer);
+			}
+			msgBox(txt);
+			showJavaWebPage();
+			return FALSE;
+		}
+		if (!isJrePathOk(cmd)) {
+			msgBox("Java found, but javaw.exe seems to be missing.");
+			return FALSE;
+		}
+	}
+
+    // Append a path to the Path environment variable
+	char jreBinPath[_MAX_PATH];
+	strcpy(jreBinPath, cmd);
+	strcat(jreBinPath, "\\bin");
+	if (!appendToPathVar(jreBinPath)) {
+		msgBox("Cannot set the Path environment variable.");
+		return FALSE;
+	}
+
+	appendLauncher(setProcName, exePath, pathLen, cmd);
+
+    // JVM args
+	if (loadString(hLibrary, JVM_ARGS, tmp)) {
+		strcat(tmp, " ");
+	} else {
+        *tmp = 0;
+    }
+	// Load additional JVM arguments from ini file
+	strncpy(tmp_path, exePath, strlen(exePath) - 3);
+	strcat(tmp_path, "ini");
+	long hFile;
+	if ((hFile = _open(tmp_path, _O_RDONLY)) != -1) {
+		const int jvmArgsLen = strlen(tmp);
+		char* src = tmp + jvmArgsLen;
+		char* dst = src;
+		const int len = _read(hFile, src, MAX_ARGS - jvmArgsLen - BIG_STR);
+		int i;
+		for (i = 0; i < len; i++) {
+			if (*src == 13 || *src == 10) {
+				if (dst > tmp && *(dst - 1) != ' ') {
+					*dst++ = ' ';
+				}
+				src++;
+			} else {
+				*dst++ = *src++;
+			}
+		}
+		*dst = 0;
+		if (len > 0 && *(dst - 1) != ' ') {
+			strcat(tmp, " ");
+		}
+		_close(hFile);
+	}
+
+    // Expand environment %variables%
+    if (*tmp) {
+        char varName[STR];
+        char varValue[MAX_VAR_SIZE];
+        char *pos = tmp;
+        while (strlen(pos) > 0) {
+            char *start = strchr(pos, '%');
+            if (start != NULL) {
+                char *end = strchr(start + 1, '%');
+                if (end == NULL) {
+                    return FALSE;
+                }
+                // Copy content up to %VAR%
+                strncat(args, pos, start - pos);
+                // Insert value of %VAR%
+                varName[0] = 0;
+                strncat(varName, start + 1, end - start - 1);
+                if (strcmp(varName, "EXEDIR") == 0) {
+                    strncat(args, exePath, pathLen);
+                } else if (strcmp(varName, "EXEFILE") == 0) {
+                    strcat(args, exePath);                    
+                } else if (GetEnvironmentVariable(varName, varValue, MAX_VAR_SIZE) > 0) {
+                    strcat(args, varValue);
+                }
+                pos = end + 1;
+            } else {
+                // Copy remaining content
+                strcat(args, pos);
+                break;
+            }
+        }
+	}
+
+	// Jar
+	strcat(args, "-jar \"");
+	if (loadString(hLibrary, JAR, tmp)) {
+        strncat(args, exePath, pathLen);
+        strcat(args, "\\");
+        strcat(args, tmp);
+    } else {
+    	strcat(args, exePath);
+    }
+	strcat(args, "\"");
+
+	// Constant command line args
+	char jarArgs[BIG_STR] = {0};
+	if (loadString(hLibrary, JAR_ARGS, jarArgs)) {
+		strcat(args, " ");
+		strcat(args, jarArgs);
+	}
+
+	// Command line args
+	if (*lpCmdLine) {
+		strcat(args, " ");
+		strcat(args, lpCmdLine);
+	}
+
+    if (debug) {
+        printf("*** Launch4j debug info ***\nWorking dir:\t%s\n", workingDir);
+		printf("Launcher:\t%s\n", cmd);
+        _itoa(strlen(args), tmp, 10);     // 10 -- radix
+		printf("Args length:\t%s/32768 chars\n", tmp);
+		printf("Launcher args:\t%s\n\n", args);
+    }
+	return TRUE;
+}
+
+void closeHandles() {
+	CloseHandle(pi.hThread);
+	CloseHandle(pi.hProcess);
+}
+
+/*
+ * Append a path to the Path environment variable
+ */
+BOOL appendToPathVar(char* path) {
+	char chBuf[MAX_VAR_SIZE] = {0};
+
+	const int pathSize = GetEnvironmentVariable("Path", chBuf, MAX_VAR_SIZE);
+	if (MAX_VAR_SIZE - pathSize - 1 < strlen(path)) {
+		return FALSE;
+	}
+	strcat(chBuf, ";");
+	strcat(chBuf, path);
+	return SetEnvironmentVariable("Path", chBuf);
+}
+
+DWORD execute(BOOL wait) {
+	STARTUPINFO si;
+    memset(&pi, 0, sizeof(pi));
+    memset(&si, 0, sizeof(si));
+    si.cb = sizeof(si);
+
+	DWORD dwExitCode = -1;
+	char cmdline[MAX_ARGS];
+    strcpy(cmdline, "\"");
+	strcat(cmdline, cmd);
+	strcat(cmdline, "\" ");
+	strcat(cmdline, args);
+	if (CreateProcess(NULL, cmdline, NULL, NULL,
+			TRUE, 0, NULL, NULL, &si, &pi)) {
+		if (wait) {
+			WaitForSingleObject(pi.hProcess, INFINITE);
+			GetExitCodeProcess(pi.hProcess, &dwExitCode);
+			closeHandles();
+		} else {
+			dwExitCode = 0;
+		}
+	}
+	return dwExitCode;
+}
Index: /release-kits/wirk3/bin/launch4j/head_src/head.h
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/head.h	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/head.h	(revision 15023)
@@ -0,0 +1,76 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+#ifndef _LAUNCH4J_HEAD__INCLUDED_
+#define _LAUNCH4J_HEAD__INCLUDED_
+
+#define WIN32_LEAN_AND_MEAN		// VC - Exclude rarely-used stuff from Windows headers
+
+// Windows Header Files:
+#include <windows.h>
+
+// C RunTime Header Files
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+#include <shellapi.h>
+#include <direct.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <io.h>
+#include <process.h>
+
+#define NO_JAVA_FOUND 0
+#define FOUND_JRE 1
+#define FOUND_SDK 2
+
+#define LAUNCH4J_TMP_DIR "\\launch4j-tmp\\"
+
+#define STR 128
+#define BIG_STR 1024
+#define MAX_VAR_SIZE 32767
+#define MAX_ARGS 32768
+
+#define TRUE_STR "true"
+#define FALSE_STR "false"
+
+void titledMsgBox(const char* title, const char* text);
+void msgBox(const char* text);
+void showJavaWebPage();
+BOOL loadString(HMODULE hLibrary, int resID, char* buffer);
+BOOL loadBoolString(HMODULE hLibrary, int resID);
+void regSearch(HKEY hKey, const char* keyName, int searchType);
+BOOL findJavaHome(char* path);
+int getExePath(char* exePath);
+void catJavaw(char* jrePath);
+BOOL isJrePathOk(char* path);
+BOOL prepare(HMODULE hLibrary, char *lpCmdLine);
+void closeHandles();
+BOOL appendToPathVar(char* path);
+DWORD execute(BOOL wait);
+
+#endif // _LAUNCH4J_HEAD__INCLUDED_
Index: /release-kits/wirk3/bin/launch4j/head_src/resource.h
===================================================================
--- /release-kits/wirk3/bin/launch4j/head_src/resource.h	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/head_src/resource.h	(revision 15023)
@@ -0,0 +1,46 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This library is free software; you can redistribute it and/or
+	modify it under the terms of the GNU Lesser General Public
+	License as published by the Free Software Foundation; either
+	version 2.1 of the License, or (at your option) any later version.
+
+	This library is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+	Lesser General Public License for more details.
+
+	You should have received a copy of the GNU Lesser General Public
+	License along with this library; if not, write to the Free Software
+	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+	Compiled with Mingw port of GCC,
+	Bloodshed Dev-C++ IDE (http://www.bloodshed.net/devcpp.html)
+*/
+
+// ICON
+#define APP_ICON 1
+
+// BITMAP
+#define SPLASH_BITMAP 1
+
+// RCDATA
+#define JRE_PATH 1
+#define JAVA_MIN_VER 2
+#define JAVA_MAX_VER 3
+#define SHOW_SPLASH 4
+#define SPLASH_WAITS_FOR_WINDOW 5
+#define SPLASH_TIMEOUT 6
+#define SPLASH_TIMEOUT_ERR 7
+#define CHDIR 8
+#define SET_PROC_NAME 9
+#define ERR_TITLE 10
+#define GUI_HEADER_STAYS_ALIVE 11
+#define JVM_ARGS 12
+#define JAR_ARGS 13
+#define JAR 14
Index: /release-kits/wirk3/bin/launch4j/lib/JGoodies.Forms.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/JGoodies.Forms.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/JGoodies.Forms.LICENSE.txt	(revision 15023)
@@ -0,0 +1,31 @@
+
+              The BSD License for the JGoodies Forms
+              ======================================
+
+Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice, 
+   this list of conditions and the following disclaimer. 
+    
+ o Redistributions in binary form must reproduce the above copyright notice, 
+   this list of conditions and the following disclaimer in the documentation 
+   and/or other materials provided with the distribution. 
+    
+ o Neither the name of JGoodies Karsten Lentzsch nor the names of 
+   its contributors may be used to endorse or promote products derived 
+   from this software without specific prior written permission. 
+    
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /release-kits/wirk3/bin/launch4j/lib/JGoodies.Looks.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/JGoodies.Looks.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/JGoodies.Looks.LICENSE.txt	(revision 15023)
@@ -0,0 +1,30 @@
+           The BSD License for the JGoodies Looks
+           ======================================
+
+Copyright (c) 2003 JGoodies Karsten Lentzsch. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without 
+modification, are permitted provided that the following conditions are met:
+
+ o Redistributions of source code must retain the above copyright notice, 
+   this list of conditions and the following disclaimer. 
+    
+ o Redistributions in binary form must reproduce the above copyright notice, 
+   this list of conditions and the following disclaimer in the documentation 
+   and/or other materials provided with the distribution. 
+    
+ o Neither the name of JGoodies Karsten Lentzsch nor the names of 
+   its contributors may be used to endorse or promote products derived 
+   from this software without specific prior written permission. 
+    
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /release-kits/wirk3/bin/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt	(revision 15023)
@@ -0,0 +1,513 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Index: /release-kits/wirk3/bin/launch4j/lib/XStream.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/XStream.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/XStream.LICENSE.txt	(revision 15023)
@@ -0,0 +1,27 @@
+(BSD Style License)
+
+Copyright (c) 2003-2004, Joe Walnes
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of
+conditions and the following disclaimer. Redistributions in binary form must reproduce
+the above copyright notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the distribution.
+
+Neither the name of XStream nor the names of its contributors may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
Index: /release-kits/wirk3/bin/launch4j/lib/commons.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/commons.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/commons.LICENSE.txt	(revision 15023)
@@ -0,0 +1,50 @@
+/*
+
+ ============================================================================
+                   The Apache Software License, Version 1.1
+ ============================================================================
+ 
+ Copyright (C) @year@ The Apache Software Foundation. All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 
+ 1. Redistributions of  source code must  retain the above copyright  notice,
+    this list of conditions and the following disclaimer.
+ 
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ 
+ 3. The end-user documentation included with the redistribution, if any, must
+    include  the following  acknowledgment:  "This product includes  software
+    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
+    Alternately, this  acknowledgment may  appear in the software itself,  if
+    and wherever such third-party acknowledgments normally appear.
+ 
+ 4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
+    used to  endorse or promote  products derived from  this software without
+    prior written permission. For written permission, please contact
+    apache@apache.org.
+ 
+ 5. Products  derived from this software may not  be called "Apache", nor may
+    "Apache" appear  in their name,  without prior written permission  of the
+    Apache Software Foundation.
+ 
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software  Foundation and was  originally created by
+ Stefano Mazzocchi  <stefano@apache.org>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ 
+*/
Index: /release-kits/wirk3/bin/launch4j/lib/foxtrot.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/lib/foxtrot.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/lib/foxtrot.LICENSE.txt	(revision 15023)
@@ -0,0 +1,25 @@
+Copyright (c) 2002, Simone Bordet & Marco Cravero
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted 
+provided that the following conditions are met: 
+
+	- Redistributions of source code must retain the above copyright notice, 
+	  this list of conditions and the following disclaimer. 
+
+	- Redistributions in binary form must reproduce the above copyright notice, 
+	  this list of conditions and the following disclaimer in the documentation 
+	  and/or other materials provided with the distribution. 
+
+	- Neither the name of Foxtrot nor the names of the contributors may be used 
+	  to endorse or promote products derived from this software without specific prior 
+	  written permission.
+	  
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS 
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS 
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: /release-kits/wirk3/bin/launch4j/readme.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/readme.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/readme.txt	(revision 15023)
@@ -0,0 +1,37 @@
+Launch4j (http://launch4j.sourceforge.net/)
+Cross-platform Java application wrapper for creating Windows native executables.
+
+Copyright (C) 2004, 2006 Grzegorz Kowal
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+The Head subproject (the code which is attached to the wrapped jars) is
+licensed under the GNU Lesser General Public License.
+
+Launch4j may be used for wrapping closed source, commercial applications.
+
+The following projects are used by Launch4j...
+	MinGW binutils (http://www.mingw.org/)
+	Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)
+	Commons Logging (http://jakarta.apache.org/commons/logging/)
+	XStream (http://xstream.codehaus.org/)
+	JGoodies Forms (http://www.jgoodies.com/freeware/forms/)
+	JGoodies Looks (http://www.jgoodies.com/freeware/looks/)
+	Foxtrot (http://foxtrot.sourceforge.net/)
+	Nuvola Icon Theme (http://www.icon-king.com)
+	Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/)
+
+This product includes software developed by the Apache Software Foundation (http://www.apache.org/).
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Builder.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Builder.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Builder.java	(revision 15023)
@@ -0,0 +1,210 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2005-04-24
+ */
+package net.sf.launch4j;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import net.sf.launch4j.binding.InvariantViolationException;
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.ConfigPersister;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Builder {
+	private final Log _log;
+
+	public Builder(Log log) {
+		_log = log;
+	}
+
+	/**
+	 * @return Output file path.
+	 */
+	public File build() throws BuilderException {
+		final Config c = ConfigPersister.getInstance().getConfig();
+		try {
+			c.validate();
+		} catch (InvariantViolationException e) {
+			throw new BuilderException(e.getMessage());
+		}
+		File rc = null;
+		File ro = null;
+		File outfile = null;
+		FileInputStream is = null;
+		FileOutputStream os = null;
+		final RcBuilder rcb = new RcBuilder();
+		try {
+			File basedir = Util.getJarBasedir();
+			rc = rcb.build(c);
+			ro = Util.createTempFile("o"); //$NON-NLS-1$
+			outfile = ConfigPersister.getInstance().getOutputFile();
+
+			Cmd resCmd = new Cmd(basedir);
+			resCmd.addExe("windres") //$NON-NLS-1$
+					.add(Util.WINDOWS_OS ? "--preprocessor=type" : "--preprocessor=cat") //$NON-NLS-1$ //$NON-NLS-2$
+					.add("-J rc -O coff -F pe-i386") //$NON-NLS-1$
+					.addAbsFile(rc)
+					.addAbsFile(ro);
+			_log.append(Messages.getString("Builder.compiling.resources")); //$NON-NLS-1$
+			resCmd.exec(_log);
+
+			Cmd ldCmd = new Cmd(basedir);
+			ldCmd.addExe("ld") //$NON-NLS-1$
+					.add("-mi386pe") //$NON-NLS-1$
+					.add("--oformat pei-i386") //$NON-NLS-1$
+					.add((c.getHeaderType() == Config.GUI_HEADER)
+							? "--subsystem windows" : "--subsystem console") //$NON-NLS-1$ //$NON-NLS-2$
+					.add("-s")		// strip symbols //$NON-NLS-1$
+					.addFiles(c.getHeaderObjects())
+					.addAbsFile(ro)
+					.addFiles(c.getLibs())
+					.add("-o") //$NON-NLS-1$
+					.addAbsFile(outfile);
+			_log.append(Messages.getString("Builder.linking")); //$NON-NLS-1$
+			ldCmd.exec(_log);
+
+			if (!c.isDontWrapJar()) {
+				_log.append(Messages.getString("Builder.wrapping")); //$NON-NLS-1$
+				int len;
+				byte[] buffer = new byte[1024];
+				is = new FileInputStream(
+						Util.getAbsoluteFile(ConfigPersister.getInstance().getConfigPath(),	c.getJar()));
+				os = new FileOutputStream(outfile, true);
+				while ((len = is.read(buffer)) > 0) {
+					os.write(buffer, 0, len);
+				}
+			}
+			_log.append(Messages.getString("Builder.success") + outfile.getPath()); //$NON-NLS-1$
+			return outfile;
+		} catch (IOException e) {
+			Util.delete(outfile);
+			_log.append(e.getMessage());
+			throw new BuilderException(e);
+		} catch (ExecException e) {
+			Util.delete(outfile);
+			String msg = e.getMessage(); 
+			if (msg != null && msg.indexOf("windres") != -1) { //$NON-NLS-1$
+				_log.append(Messages.getString("Builder.generated.resource.file")); //$NON-NLS-1$
+				_log.append(rcb.getContent());
+			}
+			throw new BuilderException(e);
+		} finally {
+			Util.close(is);
+			Util.close(os);
+			Util.delete(rc);
+			Util.delete(ro);
+		}
+	}
+}
+
+class Cmd {
+	private final StringBuffer _sb = new StringBuffer();
+	private final File _basedir;
+	private final File _bindir;
+	private final boolean _quote;
+
+	public Cmd(File basedir) {
+		_basedir = basedir;
+		_quote = basedir.getPath().indexOf(' ') != -1;
+		String path = System.getProperty("launch4j.bindir");
+		if (path == null) {
+			_bindir = new File(basedir, "bin");
+		} else {
+			File bindir = new File(path);
+			_bindir = bindir.isAbsolute() ? bindir : new File(basedir, path);
+		}
+	}
+
+	public Cmd add(String s) {
+		space();
+		_sb.append(s);
+		return this;
+	}
+
+	public Cmd addAbsFile(File file) {
+		space();
+		boolean quote = file.getPath().indexOf(' ') != -1;
+		if (quote) {
+			_sb.append('"');
+		}
+		_sb.append(file.getPath());
+		if (quote) {
+			_sb.append('"');
+		}
+		return this;
+	}
+
+	public Cmd addFile(String pathname) {
+		space();
+		if (_quote) {
+			_sb.append('"');
+		}
+		_sb.append(new File(_basedir, pathname).getPath());
+		if (_quote) {
+			_sb.append('"');
+		}
+		return this;
+	}
+
+	public Cmd addExe(String pathname) {
+		space();
+		if (_quote) {
+			_sb.append('"');
+		}
+		if (Util.WINDOWS_OS) {
+			pathname += ".exe";	//$NON-NLS-1$
+		}
+		_sb.append(new File(_bindir, pathname).getPath());
+		if (_quote) {
+			_sb.append('"');
+		}
+		return this;
+	}
+
+	public Cmd addFiles(String[] files) {
+		for (int i = 0; i < files.length; i++) {
+			addFile(files[i]);
+		}
+		return this;
+	}
+
+	private void space() {
+		if (_sb.length() > 0) {
+			_sb.append(' ');
+		}
+	}
+	
+	public String toString() {
+		return _sb.toString();
+	}
+
+	public void exec(Log log) throws ExecException {
+		Util.exec(_sb.toString(), log);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/BuilderException.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/BuilderException.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/BuilderException.java	(revision 15023)
@@ -0,0 +1,40 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 13, 2005
+ */
+package net.sf.launch4j;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class BuilderException extends Exception {
+	public BuilderException() {}
+
+	public BuilderException(Throwable t) {
+		super(t);
+	}
+	
+	public BuilderException(String msg) {
+		super(msg);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ExecException.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ExecException.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ExecException.java	(revision 15023)
@@ -0,0 +1,40 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 14, 2005
+ */
+package net.sf.launch4j;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class ExecException extends Exception {
+	public ExecException() {}
+
+	public ExecException(Throwable t) {
+		super(t);
+	}
+	
+	public ExecException(String msg) {
+		super(msg);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/FileChooserFilter.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/FileChooserFilter.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/FileChooserFilter.java	(revision 15023)
@@ -0,0 +1,64 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2004-01-15
+ */
+package net.sf.launch4j;
+
+import java.io.File;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * @author Copyright (C) 2004 Grzegorz Kowal
+ */
+public class FileChooserFilter extends FileFilter {
+	String _description;
+	String[] _extensions;
+
+	public FileChooserFilter(String description, String extension) {
+		_description = description;
+		_extensions = new String[] {extension};
+	}
+	
+	public FileChooserFilter(String description, String[] extensions) {
+		_description = description;
+		_extensions = extensions;
+	}
+
+	public boolean accept(File f) {
+		if (f.isDirectory()) {
+			return true;
+		}
+		String ext = Util.getExtension(f);
+		for (int i = 0; i < _extensions.length; i++) {
+			if (ext.toLowerCase().equals(_extensions[i].toLowerCase())) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public String getDescription() {
+		return _description;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Log.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Log.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Log.java	(revision 15023)
@@ -0,0 +1,93 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 12, 2005
+ */
+package net.sf.launch4j;
+
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public abstract class Log {
+	private static final Log _consoleLog = new ConsoleLog();
+	private static final Log _antLog = new AntLog();
+
+	public abstract void clear();
+	public abstract void append(String line);
+
+	public static Log getConsoleLog() {
+		return _consoleLog;
+	}
+	
+	public static Log getAntLog() {
+		return _antLog;
+	}
+
+	public static Log getSwingLog(JTextArea textArea) {
+		return new SwingLog(textArea);
+	}
+}
+
+class ConsoleLog extends Log {
+	public void clear() {
+		System.out.println("\n");
+	}
+
+	public void append(String line) {
+		System.out.println("launch4j: " + line);
+	}
+}
+
+class AntLog extends Log {
+	public void clear() {
+		System.out.println("\n");
+	}
+
+	public void append(String line) {
+		System.out.println(line);
+	}
+}
+
+class SwingLog extends Log {
+	private final JTextArea _textArea;
+
+	public SwingLog(JTextArea textArea) {
+		_textArea = textArea;
+	}
+
+	public void clear() {
+		SwingUtilities.invokeLater(new Runnable() {
+			public void run() {
+				_textArea.setText("");
+		}});
+	}
+
+	public void append(final String line) {
+		SwingUtilities.invokeLater(new Runnable() {
+			public void run() {
+				_textArea.append(line + "\n");
+		}});
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Main.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Main.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Main.java	(revision 15023)
@@ -0,0 +1,67 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 21, 2005
+ */
+package net.sf.launch4j;
+
+import java.io.File;
+
+import net.sf.launch4j.config.ConfigPersister;
+import net.sf.launch4j.config.ConfigPersisterException;
+import net.sf.launch4j.formimpl.MainFrame;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Main {
+
+	public static final String PROGRAM_NAME = "Launch4j 2.1.5"; 
+	public static final String PROGRAM_DESCRIPTION = PROGRAM_NAME + 
+		" (http://launch4j.sourceforge.net/)\n" +
+		"Cross-platform Java application wrapper for creating Windows native executables.\n\n" +
+		"Copyright (C) 2004, 2006 Grzegorz Kowal\n\n" +
+		"Launch4j comes with ABSOLUTELY NO WARRANTY.\n" +
+	    "This is free software, licensed under the GNU General Public License.\n" +
+		"This product includes software developed by the Apache Software Foundation (http://www.apache.org/).\n\n";
+
+	public static void main(String[] args) {
+		try {
+			if (args.length == 0) {
+				ConfigPersister.getInstance().createBlank();
+				MainFrame.createInstance();
+			} else if (args.length == 1 && !args[0].startsWith("-")) {
+				ConfigPersister.getInstance().load(new File(args[0]));
+				Builder b = new Builder(Log.getConsoleLog());
+				b.build();
+			} else {
+				System.out.println(PROGRAM_DESCRIPTION
+						+ Messages.getString("Main.usage")
+						+ ": launch4j config.xml");
+			}
+		} catch (ConfigPersisterException e) {
+			Log.getConsoleLog().append(e.getMessage());
+		} catch (BuilderException e) {
+			Log.getConsoleLog().append(e.getMessage());
+		} 
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Messages.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Messages.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Messages.java	(revision 15023)
@@ -0,0 +1,44 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "net.sf.launch4j.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		// TODO Auto-generated method stub
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/OptionParser.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/OptionParser.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/OptionParser.java	(revision 15023)
@@ -0,0 +1,59 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2005-04-24
+ */
+package net.sf.launch4j;
+
+//import net.sf.launch4j.config.Config;
+
+//import org.apache.commons.cli.CommandLine;
+//import org.apache.commons.cli.CommandLineParser;
+//import org.apache.commons.cli.HelpFormatter;
+//import org.apache.commons.cli.Options;
+//import org.apache.commons.cli.ParseException;
+//import org.apache.commons.cli.PosixParser;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class OptionParser {
+
+//	private final Options _options;
+//
+//	public OptionParser() {
+//		_options = new Options();
+//		_options.addOption("h", "header", true, "header");
+//	}
+//
+//	public Config parse(Config c, String[] args) throws ParseException {
+//		CommandLineParser parser = new PosixParser();
+//		CommandLine cl = parser.parse(_options, args);
+//		c.setJar(getFile(props, Config.JAR));
+//		c.setOutfile(getFile(props, Config.OUTFILE));
+//	}
+//
+//	public void printHelp() {
+//		HelpFormatter formatter = new HelpFormatter();
+//		formatter.printHelp("launch4j", _options);
+//	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/RcBuilder.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/RcBuilder.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/RcBuilder.java	(revision 15023)
@@ -0,0 +1,236 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2005-04-24
+ */
+package net.sf.launch4j;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.ConfigPersister;
+import net.sf.launch4j.config.Jre;
+import net.sf.launch4j.config.Splash;
+import net.sf.launch4j.config.VersionInfo;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class RcBuilder {
+
+	// winnt.h
+	public static final int LANG_NEUTRAL = 0;
+	public static final int SUBLANG_NEUTRAL	= 0;
+	public static final int SUBLANG_DEFAULT	= 1;
+	public static final int SUBLANG_SYS_DEFAULT	= 2;
+
+	// ICON
+	public static final int APP_ICON = 1;
+
+	// BITMAP
+	public static final int SPLASH_BITMAP = 1;
+
+	// RCDATA
+	public static final int JRE_PATH = 1;
+	public static final int JAVA_MIN_VER = 2;
+	public static final int JAVA_MAX_VER = 3;
+	public static final int SHOW_SPLASH = 4;
+	public static final int SPLASH_WAITS_FOR_WINDOW = 5;
+	public static final int SPLASH_TIMEOUT = 6;
+	public static final int SPLASH_TIMEOUT_ERR = 7;
+	public static final int CHDIR = 8;
+	public static final int SET_PROC_NAME = 9;
+	public static final int ERR_TITLE = 10;
+	public static final int GUI_HEADER_STAYS_ALIVE = 11;
+	public static final int JVM_ARGS = 12;
+	public static final int JAR_ARGS = 13;
+	public static final int JAR = 14;
+
+	private final StringBuffer _sb = new StringBuffer();
+
+	public String getContent() {
+		return _sb.toString();
+	}
+
+	public File build(Config c) throws IOException {
+		_sb.append("LANGUAGE ");
+		_sb.append(LANG_NEUTRAL);
+		_sb.append(", ");
+		_sb.append(SUBLANG_DEFAULT);
+		_sb.append('\n');
+		addVersionInfo(c.getVersionInfo());
+		addJre(c.getJre());
+		addIcon(APP_ICON, c.getIcon());
+		addText(ERR_TITLE, c.getErrTitle());
+		addText(JAR_ARGS, c.getJarArgs());
+		addWindowsPath(CHDIR, c.getChdir());
+		addTrue(SET_PROC_NAME, c.isCustomProcName());
+		addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive());
+		addSplash(c.getSplash());
+		if (c.isDontWrapJar()) {
+			addWindowsPath(JAR, c.getJar().getPath());
+		}
+		File f = Util.createTempFile("rc");
+		BufferedWriter w = new BufferedWriter(new FileWriter(f));
+		w.write(_sb.toString());
+		w.close();
+		return f;
+	}
+
+	private void addVersionInfo(VersionInfo v) {
+		if (v == null) {
+			return;
+		}
+		_sb.append("1 VERSIONINFO\n");
+		_sb.append("FILEVERSION ");
+		_sb.append(v.getFileVersion().replaceAll("\\.", ", "));
+		_sb.append("\nPRODUCTVERSION ");
+		_sb.append(v.getProductVersion().replaceAll("\\.", ", "));
+		_sb.append("\nFILEFLAGSMASK 0\n" +
+				"FILEOS 0x40000\n" +
+				"FILETYPE 1\n" +
+				"{\n" + 
+				" BLOCK \"StringFileInfo\"\n" +
+				" {\n" +
+				"  BLOCK \"040904E4\"\n" +	// English
+				"  {\n");
+		addVerBlockValue("CompanyName", v.getCompanyName());
+		addVerBlockValue("FileDescription", v.getFileDescription());
+		addVerBlockValue("FileVersion", v.getTxtFileVersion());
+		addVerBlockValue("InternalName", v.getInternalName());
+		addVerBlockValue("LegalCopyright", v.getCopyright());
+		addVerBlockValue("OriginalFilename", v.getOriginalFilename());
+		addVerBlockValue("ProductName", v.getProductName());
+		addVerBlockValue("ProductVersion", v.getTxtProductVersion());
+		_sb.append("  }\n }\n}\n");
+	}
+	
+	private void addJre(Jre jre) {
+		addWindowsPath(JRE_PATH, jre.getPath());
+		addText(JAVA_MIN_VER, jre.getMinVersion());
+		addText(JAVA_MAX_VER, jre.getMaxVersion());
+		StringBuffer jvmArgs = new StringBuffer();
+		if (jre.getInitialHeapSize() > 0) {
+			jvmArgs.append("-Xms");
+			jvmArgs.append(jre.getInitialHeapSize());
+			jvmArgs.append('m');
+		}
+		if (jre.getMaxHeapSize() > 0) {
+			addSpace(jvmArgs);
+			jvmArgs.append("-Xmx");
+			jvmArgs.append(jre.getMaxHeapSize());
+			jvmArgs.append('m');
+		}
+		if (jre.getArgs() != null && jre.getArgs().length() > 0) {
+			addSpace(jvmArgs);
+			jvmArgs.append(jre.getArgs().replaceAll("\n", " "));
+		}
+		addText(JVM_ARGS, jvmArgs.toString());
+	}
+	
+	private void addSplash(Splash splash) {
+		if (splash == null) {
+			return;
+		}
+		addTrue(SHOW_SPLASH, true);
+		addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow());
+		addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout()));
+		addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr());
+		addBitmap(SPLASH_BITMAP, splash.getFile());
+	}
+
+	private void addText(int id, String text) {
+		if (text == null || text.length() == 0) {
+			return;
+		}
+		_sb.append(id);
+		_sb.append(" RCDATA BEGIN \"");
+		_sb.append(text.replaceAll("\"", "\"\""));
+		_sb.append("\\0\" END\n");
+	}
+
+	/**
+	 * Stores path in Windows format with '\' separators. 
+	 */
+	private void addWindowsPath(int id, String path) {
+		if (path == null || path.equals("")) {
+			return;
+		}
+		_sb.append(id);
+		_sb.append(" RCDATA BEGIN \"");
+		_sb.append(path.replaceAll("\\\\", "\\\\\\\\")
+				.replaceAll("/", "\\\\\\\\"));
+		_sb.append("\\0\" END\n");
+	}
+
+	private void addTrue(int id, boolean value) {
+		if (value) {
+			addText(id, "true");
+		}
+	}
+
+	private void addIcon(int id, File icon) {
+		if (icon == null || icon.getPath().equals("")) {
+			return;
+		}
+		_sb.append(id);
+		_sb.append(" ICON DISCARDABLE \"");
+		_sb.append(getPath(Util.getAbsoluteFile(
+				ConfigPersister.getInstance().getConfigPath(), icon)));
+		_sb.append("\"\n");
+	}
+
+	private void addBitmap(int id, File bitmap) {
+		if (bitmap == null) {
+			return;
+		}
+		_sb.append(id);
+		_sb.append(" BITMAP \"");
+		_sb.append(getPath(Util.getAbsoluteFile(
+				ConfigPersister.getInstance().getConfigPath(), bitmap)));
+		_sb.append("\"\n");
+	}
+	
+	private String getPath(File f) {
+		return f.getPath().replaceAll("\\\\", "\\\\\\\\");
+	}
+	
+	private void addSpace(StringBuffer sb) {
+		int len = sb.length();
+		if (len-- > 0 && sb.charAt(len) != ' ') {
+			sb.append(' ');
+		}
+	}
+	
+	private void addVerBlockValue(String key, String value) {
+		_sb.append("   VALUE \"");
+		_sb.append(key);
+		_sb.append("\", \"");
+		if (value != null) {
+			_sb.append(value);
+		}
+		_sb.append("\"\n");
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Util.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Util.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/Util.java	(revision 15023)
@@ -0,0 +1,167 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2005-04-24
+ */
+package net.sf.launch4j;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Util {
+	public static final boolean WINDOWS_OS = System.getProperty("os.name")
+			.toLowerCase().startsWith("windows");
+
+	private Util() {}
+
+	public static File createTempFile(String suffix) throws IOException {
+		String tmpdir = System.getProperty("launch4j.tmpdir");
+		if (tmpdir != null) {
+			if (tmpdir.indexOf(' ') != -1) {
+				throw new IOException(Messages.getString("Util.tmpdir"));
+			}
+			return File.createTempFile("launch4j", suffix, new File(tmpdir));
+		} else {
+			return File.createTempFile("launch4j", suffix);
+		}
+	}
+
+	/**
+	 * Returns the base directory of a jar file or null if the class is a standalone file. 
+	 * @return System specific path
+	 * 
+	 * Based on a patch submitted by Josh Elsasser
+	 */
+	public static File getJarBasedir() {
+		String url = Util.class.getClassLoader()
+				.getResource(Util.class.getName().replace('.', '/') + ".class")
+				.getFile()
+				.replaceAll("%20", " ");
+		if (url.startsWith("file:")) {
+			String jar = url.substring(5, url.lastIndexOf('!'));
+			int x = jar.lastIndexOf('/');
+			if (x == -1) {
+				x = jar.lastIndexOf('\\');	
+			}
+			String basedir = jar.substring(0, x + 1);
+			return new File(basedir);
+		} else {
+			return new File(".");
+		}
+	}
+
+	public static File getAbsoluteFile(File basepath, File f) {
+		return f.isAbsolute() ? f : new File(basepath, f.getPath());
+	}
+
+	public static String getExtension(File f) {
+		String name = f.getName();
+		int x = name.lastIndexOf('.');
+		if (x != -1) {
+			return name.substring(x);
+		} else {
+			return "";
+		}
+	}
+
+	public static void exec(String cmd, Log log) throws ExecException {
+		BufferedReader is = null;
+		try {
+			if (WINDOWS_OS) {
+				cmd = cmd.replaceAll("/", "\\\\");
+			}
+			Process p = Runtime.getRuntime().exec(cmd);
+			is = new BufferedReader(new InputStreamReader(p.getErrorStream()));
+			String line;
+			while ((line = is.readLine()) != null) {
+				log.append(line);
+			}
+			is.close();
+			p.waitFor();
+			if (p.exitValue() != 0) {
+				String msg = Messages.getString("Util.exec.failed")
+						+ "(" + p.exitValue() + "): " + cmd;
+				log.append(msg);
+				throw new ExecException(msg);
+			}
+		} catch (IOException e) {
+			close(is);
+			throw new ExecException(e);
+		} catch (InterruptedException e) {
+			close(is);
+			throw new ExecException(e);
+		}
+	}
+
+	public static void close(final InputStream o) {
+		if (o != null) {
+			try {
+				o.close();
+			} catch (IOException e) {
+				System.err.println(e); // XXX log
+			}
+		}
+	}
+
+	public static void close(final OutputStream o) {
+		if (o != null) {
+			try {
+				o.close();
+			} catch (IOException e) {
+				System.err.println(e); // XXX log
+			}
+		}
+	}
+
+	public static void close(final Reader o) {
+		if (o != null) {
+			try {
+				o.close();
+			} catch (IOException e) {
+				System.err.println(e); // XXX log
+			}
+		}
+	}
+
+	public static void close(final Writer o) {
+		if (o != null) {
+			try {
+				o.close();
+			} catch (IOException e) {
+				System.err.println(e); // XXX log
+			}
+		}
+	}
+
+	public static boolean delete(File f) {
+		return (f != null) ? f.delete() : false;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/AntConfig.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/AntConfig.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/AntConfig.java	(revision 15023)
@@ -0,0 +1,68 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 24, 2005
+ */
+package net.sf.launch4j.ant;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.Jre;
+import net.sf.launch4j.config.Splash;
+import net.sf.launch4j.config.VersionInfo;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class AntConfig extends Config {
+
+	public void setJarPath(String path) {
+		setJar(new File(path));
+	}
+
+	public void addJre(Jre jre) {
+		checkNull(getJre(), "jre"); //$NON-NLS-1$
+		setJre(jre);
+	}
+
+	public void addSplash(Splash splash) {
+		checkNull(getSplash(), "splash"); //$NON-NLS-1$
+		setSplash(splash);
+	}
+
+	public void addVersionInfo(VersionInfo versionInfo) {
+		checkNull(getVersionInfo(), "versionInfo"); //$NON-NLS-1$
+		setVersionInfo(versionInfo);
+	}
+
+	private void checkNull(Object o, String name) {
+		if (o != null) {
+			throw new BuildException(
+					Messages.getString("AntConfig.duplicate.element")  //$NON-NLS-1$
+					+ ": "	//$NON-NLS-1$
+					+ name);
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java	(revision 15023)
@@ -0,0 +1,131 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 24, 2005
+ */
+package net.sf.launch4j.ant;
+
+import java.io.File;
+
+import net.sf.launch4j.Builder;
+import net.sf.launch4j.BuilderException;
+import net.sf.launch4j.Log;
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.ConfigPersister;
+import net.sf.launch4j.config.ConfigPersisterException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Launch4jTask extends Task {
+	private File _configFile;
+	private AntConfig _config;
+
+	// Override configFile settings
+	private File jar;
+	private File outfile;
+	private String fileVersion;
+	private String txtFileVersion;
+	private String productVersion;
+	private String txtProductVersion;
+
+	public void execute() throws BuildException {
+		try {
+			if (_configFile != null && _config != null) {
+				throw new BuildException(
+						Messages.getString("Launch4jTask.specify.config")); //$NON-NLS-1$
+			} else if (_configFile != null) {
+				ConfigPersister.getInstance().load(_configFile);
+				Config c = ConfigPersister.getInstance().getConfig();
+				if (jar != null) {
+					c.setJar(jar);
+				}
+				if (outfile != null) {
+					c.setOutfile(outfile);
+				}
+				if (fileVersion != null) {
+					c.getVersionInfo().setFileVersion(fileVersion);
+				}
+				if (txtFileVersion != null) {
+					c.getVersionInfo().setTxtFileVersion(txtFileVersion);
+				}
+				if (productVersion != null) {
+					c.getVersionInfo().setProductVersion(productVersion);
+				}
+				if (txtProductVersion != null) {
+					c.getVersionInfo().setTxtProductVersion(txtProductVersion);
+				}
+			} else if (_config != null) {
+				ConfigPersister.getInstance().setAntConfig(_config,
+						getProject().getBaseDir());
+			} else {
+				throw new BuildException(
+						Messages.getString("Launch4jTask.specify.config")); //$NON-NLS-1$
+			}
+			final Builder b = new Builder(Log.getAntLog());
+			b.build();
+		} catch (ConfigPersisterException e) {
+			throw new BuildException(e);
+		} catch (BuilderException e) {
+			throw new BuildException(e);
+		}
+	}
+
+	public void setConfigFile(File configFile) {
+		_configFile = configFile;
+	}
+
+	public void addConfig(AntConfig config) {
+		_config = config;
+	}
+
+	public void setFileVersion(String fileVersion) {
+		this.fileVersion = fileVersion;
+	}
+
+	public void setJar(File jar) {
+		this.jar = jar;
+	}
+
+	public void setJarPath(String path) {
+		this.jar = new File(path);
+	}
+
+	public void setOutfile(File outfile) {
+		this.outfile = outfile;
+	}
+
+	public void setProductVersion(String productVersion) {
+		this.productVersion = productVersion;
+	}
+
+	public void setTxtFileVersion(String txtFileVersion) {
+		this.txtFileVersion = txtFileVersion;
+	}
+
+	public void setTxtProductVersion(String txtProductVersion) {
+		this.txtProductVersion = txtProductVersion;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Messages.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Messages.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/Messages.java	(revision 15023)
@@ -0,0 +1,44 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.ant;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "net.sf.launch4j.ant.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		// TODO Auto-generated method stub
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages.properties	(revision 15023)
@@ -0,0 +1,21 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+Launch4jTask.specify.config=Specify configFile or config
+AntConfig.duplicate.element=Duplicate element
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages_es.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages_es.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/ant/messages_es.properties	(revision 15023)
@@ -0,0 +1,21 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+Launch4jTask.specify.config=Specify configFile or config
+AntConfig.duplicate.element=Duplicate element
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Binding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Binding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Binding.java	(revision 15023)
@@ -0,0 +1,50 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 30, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.Color;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public interface Binding {
+	/** Used to mark components with invalid data. */
+	public final static Color INVALID_COLOR = Color.PINK;
+
+	/** Java Bean property bound to a component */
+	public String getProperty();
+	/** Clear component, set it to the default value */ 
+	public void clear(IValidatable bean);
+	/** Java Bean property -> Component */
+	public void put(IValidatable bean);
+	/** Component -> Java Bean property */
+	public void get(IValidatable bean);
+	/** Mark component as valid */
+	public void markValid();
+	/** Mark component as invalid */
+	public void markInvalid();
+	/** Enable or disable the component */
+	public void setEnabled(boolean enabled);
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/BindingException.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/BindingException.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/BindingException.java	(revision 15023)
@@ -0,0 +1,40 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 30, 2005
+ */
+package net.sf.launch4j.binding;
+
+/**
+ * Signals a runtime error, a missing property in a Java Bean for example.
+ * 
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class BindingException extends RuntimeException {
+	public BindingException(Throwable t) {
+		super(t);
+	}
+	
+	public BindingException(String msg) {
+		super(msg);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Bindings.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Bindings.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Bindings.java	(revision 15023)
@@ -0,0 +1,257 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 30, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.swing.JComponent;
+import javax.swing.JRadioButton;
+import javax.swing.JTextArea;
+import javax.swing.JToggleButton;
+import javax.swing.text.JTextComponent;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+/**
+ * Creates and handles bindings.
+ * 
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Bindings implements PropertyChangeListener {
+	private final Map _bindings = new HashMap();
+	private final Map _optComponents = new HashMap();
+	private boolean _modified = false;
+
+	/**
+	 * Used to track component modifications.
+	 */
+	public void propertyChange(PropertyChangeEvent evt) {
+		if ("AccessibleValue".equals(evt.getPropertyName()) //$NON-NLS-1$
+				|| "AccessibleText".equals(evt.getPropertyName())) { //$NON-NLS-1$
+			_modified = true;
+		}
+	}
+
+	/** 
+	 * Any of the components modified?
+	 */
+	public boolean isModified() {
+		return _modified;
+	}
+
+	public Binding getBinding(String property) {
+		return (Binding) _bindings.get(property);
+	}
+
+	private void registerPropertyChangeListener(JComponent c) {
+		c.getAccessibleContext().addPropertyChangeListener(this);
+	}
+
+	private void registerPropertyChangeListener(JComponent[] cs) {
+		for (int i = 0; i < cs.length; i++) {
+			cs[i].getAccessibleContext().addPropertyChangeListener(this);
+		}
+	}
+
+	private boolean isPropertyNull(IValidatable bean, Binding b) {
+		try {
+			for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) {
+				String property = (String) iter.next();
+				if (b.getProperty().startsWith(property)) {
+					return PropertyUtils.getProperty(bean, property) == null;
+				}
+			}
+			return false;
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	/**
+	 * Enables or disables all components bound to properties that begin with given prefix.
+	 */
+	public void setComponentsEnabled(String prefix, boolean enabled) {
+		for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) {
+			Binding b = (Binding) iter.next();
+			if (b.getProperty().startsWith(prefix)) {
+				b.setEnabled(enabled);
+			}
+		}
+	}
+
+	/**
+	 * Clear all components, set them to their default values.
+	 * Clears the _modified flag.
+	 */
+	public void clear(IValidatable bean) {
+		for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) {
+			((Binding) iter.next()).clear(bean);
+		}
+		for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) {
+			((Binding) iter.next()).clear(bean);
+		}
+		_modified = false;
+	}
+
+	/**
+	 * Copies data from the Java Bean to the UI components.
+	 * Clears the _modified flag.
+	 */
+	public void put(IValidatable bean) {
+		for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) {
+			((Binding) iter.next()).put(bean);
+		}
+		for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) {
+			Binding b = (Binding) iter.next();
+			if (isPropertyNull(bean, b)) {
+				b.clear(null);
+			} else {
+				b.put(bean);
+			}
+		}
+		_modified = false;
+	}
+
+	/**
+	 * Copies data from UI components to the Java Bean and checks it's class invariants.
+	 * Clears the _modified flag.
+	 * @throws InvariantViolationException
+	 * @throws BindingException
+	 */
+	public void get(IValidatable bean) {
+		try {
+			for (Iterator iter = _optComponents.values().iterator(); iter.hasNext();) {
+				((Binding) iter.next()).get(bean);
+			}
+			for (Iterator iter = _bindings.values().iterator(); iter.hasNext();) {
+				Binding b = (Binding) iter.next();
+				if (!isPropertyNull(bean, b)) {
+					b.get(bean);
+				}
+			}
+			bean.checkInvariants();
+			for (Iterator iter = _optComponents.keySet().iterator(); iter.hasNext();) {
+				String property = (String) iter.next();
+				IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, property);
+				if (component != null) {
+					component.checkInvariants();
+				}
+			}
+			_modified = false;	// XXX
+		} catch (InvariantViolationException e) {
+			e.setBinding(getBinding(e.getProperty()));
+			throw e;
+		} catch (Exception e) {
+			throw new BindingException(e);
+		} 
+	}
+
+	private Bindings add(Binding b) {
+		if (_bindings.containsKey(b.getProperty())) {
+			throw new BindingException(Messages.getString("Bindings.duplicate.binding")); //$NON-NLS-1$
+		}
+		_bindings.put(b.getProperty(), b);
+		return this;
+	}
+
+	/**
+	 * Add an optional (nullable) Java Bean component of type clazz.
+	 */
+	public Bindings addOptComponent(String property, Class clazz, JToggleButton c,
+			boolean enabledByDefault) {
+		Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault);
+		if (_optComponents.containsKey(property)) {
+			throw new BindingException(Messages.getString("Bindings.duplicate.binding")); //$NON-NLS-1$
+		}
+		_optComponents.put(property, b);
+		return this;
+	}
+
+	/**
+	 * Add an optional (nullable) Java Bean component of type clazz.
+	 */
+	public Bindings addOptComponent(String property, Class clazz, JToggleButton c) {
+		return addOptComponent(property, clazz, c, false);
+	}
+
+	/**
+	 * Handles JEditorPane, JTextArea, JTextField
+	 */
+	public Bindings add(String property, JTextComponent c, String defaultValue) {
+		registerPropertyChangeListener(c);
+		return add(new JTextComponentBinding(property, c, defaultValue));
+	}
+
+	/**
+	 * Handles JEditorPane, JTextArea, JTextField
+	 */
+	public Bindings add(String property, JTextComponent c) {
+		registerPropertyChangeListener(c);
+		return add(new JTextComponentBinding(property, c, "")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Handles JToggleButton, JCheckBox 
+	 */
+	public Bindings add(String property, JToggleButton c, boolean defaultValue) {
+		registerPropertyChangeListener(c);
+		return add(new JToggleButtonBinding(property, c, defaultValue));
+	}
+
+	/**
+	 * Handles JToggleButton, JCheckBox
+	 */
+	public Bindings add(String property, JToggleButton c) {
+		registerPropertyChangeListener(c);
+		return add(new JToggleButtonBinding(property, c, false));
+	}
+
+	/**
+	 * Handles JRadioButton
+	 */
+	public Bindings add(String property, JRadioButton[] cs, int defaultValue) {
+		registerPropertyChangeListener(cs);
+		return add(new JRadioButtonBinding(property, cs, defaultValue));
+	}
+	
+	/**
+	 * Handles JRadioButton
+	 */
+	public Bindings add(String property, JRadioButton[] cs) {
+		registerPropertyChangeListener(cs);
+		return add(new JRadioButtonBinding(property, cs, 0));
+	}
+	
+	public Bindings add(String property, String stateProperty, 
+			JToggleButton button, JTextArea textArea) {
+		registerPropertyChangeListener(button);
+		registerPropertyChangeListener(textArea);
+		return add(new OptListBinding(property, stateProperty, button, textArea));
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/IValidatable.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/IValidatable.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/IValidatable.java	(revision 15023)
@@ -0,0 +1,32 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2004-01-30
+ */
+package net.sf.launch4j.binding;
+
+/**
+ * @author Copyright (C) 2004 Grzegorz Kowal
+ */
+public interface IValidatable {
+	public void checkInvariants();
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java	(revision 15023)
@@ -0,0 +1,55 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Jun 23, 2003
+ */
+package net.sf.launch4j.binding;
+
+/**
+ * @author Copyright (C) 2003 Grzegorz Kowal
+ */
+public class InvariantViolationException extends RuntimeException {
+	private final String _property;
+	private Binding _binding;
+
+	public InvariantViolationException(String msg) {
+		super(msg);
+		_property = null;
+	}
+
+	public InvariantViolationException(String property, String msg) {
+		super(msg);
+		_property = property;
+	}
+	
+	public String getProperty() {
+		return _property;
+	}
+	
+	public Binding getBinding() {
+		return _binding;
+	}
+
+	public void setBinding(Binding binding) {
+		_binding = binding;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java	(revision 15023)
@@ -0,0 +1,129 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 10, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.Color;
+
+import javax.swing.JRadioButton;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class JRadioButtonBinding implements Binding {
+	private final String _property;
+	private final JRadioButton[] _buttons;
+	private final int _defaultValue;
+	private final Color _validColor;
+
+	public JRadioButtonBinding(String property, JRadioButton[] buttons, int defaultValue) {
+		if (property == null || buttons == null) {
+			throw new NullPointerException();
+		}
+		for (int i = 0; i < buttons.length; i++) {
+			if (buttons[i] == null) {
+				throw new NullPointerException();
+			}
+		}
+		if (property.equals("") //$NON-NLS-1$
+				|| buttons.length == 0
+				|| defaultValue < 0 || defaultValue >= buttons.length) {
+			throw new IllegalArgumentException();
+		}
+		_property = property;
+		_buttons = buttons;
+		_defaultValue = defaultValue;
+		_validColor = buttons[0].getBackground();
+	}
+
+	public String getProperty() {
+		return _property;
+	}
+
+	public void clear(IValidatable bean) {
+		select(_defaultValue);
+	}
+
+	public void put(IValidatable bean) {
+		try {
+			Integer i = (Integer) PropertyUtils.getProperty(bean, _property);
+			if (i == null) {
+				throw new BindingException(Messages.getString("JRadioButtonBinding.property.null")); //$NON-NLS-1$
+			}
+			select(i.intValue());
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void get(IValidatable bean) {
+		try {
+			for (int i = 0; i < _buttons.length; i++) {
+				if (_buttons[i].isSelected()) {
+					PropertyUtils.setProperty(bean, _property, new Integer(i));
+					return;
+				}
+			}
+			throw new BindingException(Messages.getString("JRadioButtonBinding.nothing.selected")); //$NON-NLS-1$
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	private void select(int index) {
+		if (index < 0 || index >= _buttons.length) {
+			throw new BindingException(Messages.getString("JRadioButtonBinding.index.out.of.bounds")); //$NON-NLS-1$
+		}
+		_buttons[index].setSelected(true);
+	}
+
+	public void markValid() {
+		for (int i = 0; i < _buttons.length; i++) {
+			if (_buttons[i].isSelected()) {
+				_buttons[i].setBackground(_validColor);
+				_buttons[i].requestFocusInWindow();
+				return;
+			}
+		}
+		throw new BindingException(Messages.getString("JRadioButtonBinding.nothing.selected")); //$NON-NLS-1$
+	}
+
+	public void markInvalid() {
+		for (int i = 0; i < _buttons.length; i++) {
+			if (_buttons[i].isSelected()) {
+				_buttons[i].setBackground(Binding.INVALID_COLOR);
+				return;
+			}
+		}
+		throw new BindingException(Messages.getString("JRadioButtonBinding.nothing.selected")); //$NON-NLS-1$
+	}
+	
+	public void setEnabled(boolean enabled) {
+		for (int i = 0; i < _buttons.length; i++) {
+			_buttons[i].setEnabled(enabled);
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java	(revision 15023)
@@ -0,0 +1,94 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 30, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.Color;
+
+import javax.swing.text.JTextComponent;
+
+import org.apache.commons.beanutils.BeanUtils;
+
+/**
+ * Handles JEditorPane, JTextArea, JTextField
+ * 
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class JTextComponentBinding implements Binding {
+	private final String _property;
+	private final JTextComponent _textComponent;
+	private final String _defaultValue;
+	private final Color _validColor;
+
+	public JTextComponentBinding(String property, JTextComponent textComponent, String defaultValue) {
+		if (property == null || textComponent == null || defaultValue == null) {
+			throw new NullPointerException();
+		}
+		if (property.equals("")) {
+			throw new IllegalArgumentException();
+		}
+		_property = property;
+		_textComponent = textComponent;
+		_defaultValue = defaultValue;
+		_validColor = _textComponent.getBackground();
+	}
+
+	public String getProperty() {
+		return _property;
+	}
+
+	public void clear(IValidatable bean) {
+		_textComponent.setText(_defaultValue);
+	}
+
+	public void put(IValidatable bean) {
+		try {
+			String s = BeanUtils.getProperty(bean, _property);
+			_textComponent.setText(s != null && !s.equals("0") ? s : "");	// XXX displays zeros as blank
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void get(IValidatable bean) {
+		try {
+			BeanUtils.setProperty(bean, _property, _textComponent.getText());
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+	
+	public void markValid() {
+		_textComponent.setBackground(_validColor);
+		_textComponent.requestFocusInWindow();
+	}
+
+	public void markInvalid() {
+		_textComponent.setBackground(Binding.INVALID_COLOR);
+	}
+	
+	public void setEnabled(boolean enabled) {
+		_textComponent.setEnabled(enabled);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java	(revision 15023)
@@ -0,0 +1,96 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 30, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.Color;
+
+import javax.swing.JToggleButton;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+/**
+ * Handles JToggleButton, JCheckBox 
+ *
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class JToggleButtonBinding implements Binding {
+	private final String _property;
+	private final JToggleButton _button;
+	private final boolean _defaultValue;
+	private final Color _validColor;
+
+	public JToggleButtonBinding(String property, JToggleButton button, boolean defaultValue) {
+		if (property == null || button == null) {
+			throw new NullPointerException();
+		}
+		if (property.equals("")) {
+			throw new IllegalArgumentException();
+		}
+		_property = property;
+		_button = button;
+		_defaultValue = defaultValue;
+		_validColor = _button.getBackground();
+	}
+
+	public String getProperty() {
+		return _property;
+	}
+
+	public void clear(IValidatable bean) {
+		_button.setSelected(_defaultValue);
+	}
+
+	public void put(IValidatable bean) {
+		try {
+			// String s = BeanUtils.getProperty(o, _property);
+			// _checkBox.setSelected("true".equals(s));
+			Boolean b = (Boolean) PropertyUtils.getProperty(bean, _property);
+			_button.setSelected(b != null && b.booleanValue());
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void get(IValidatable bean) {
+		try {
+			PropertyUtils.setProperty(bean, _property, Boolean.valueOf(_button.isSelected()));
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+	
+	public void markValid() {
+		_button.setBackground(_validColor);
+		_button.requestFocusInWindow();
+	}
+
+	public void markInvalid() {
+		_button.setBackground(Binding.INVALID_COLOR);
+	}
+	
+	public void setEnabled(boolean enabled) {
+		_button.setEnabled(enabled);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Messages.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Messages.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Messages.java	(revision 15023)
@@ -0,0 +1,68 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.binding;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "net.sf.launch4j.binding.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+	private static final MessageFormat FORMATTER = new MessageFormat("");
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		// TODO Auto-generated method stub
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+	
+	public static String getString(String key, String arg0) {
+		return getString(key, new Object[] {arg0});
+	}
+
+	public static String getString(String key, String arg0, String arg1) {
+		return getString(key, new Object[] {arg0, arg1});
+	}
+
+	public static String getString(String key, String arg0, String arg1, String arg2) {
+		return getString(key, new Object[] {arg0, arg1, arg2});
+	}
+
+	public static String getString(String key, Object[] args) {
+		// TODO Auto-generated method stub
+		try {
+			FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key));
+			return FORMATTER.format(args);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java	(revision 15023)
@@ -0,0 +1,106 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 11, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Arrays;
+
+import javax.swing.JToggleButton;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class OptComponentBinding implements Binding, ActionListener {
+	private final Bindings _bindings;
+	private final String _property;
+	private final Class _clazz;
+	private final JToggleButton _button;
+	private final boolean _enabledByDefault;
+
+	public OptComponentBinding(Bindings bindings, String property, Class clazz,
+								JToggleButton button, boolean enabledByDefault) {
+		if (property == null || clazz == null || button == null) {
+			throw new NullPointerException();
+		}
+		if (property.equals("")) { //$NON-NLS-1$
+			throw new IllegalArgumentException();
+		}
+		if (!Arrays.asList(clazz.getInterfaces()).contains(IValidatable.class)) {
+			throw new IllegalArgumentException(Messages.getString("OptComponentBinding.must.implement") //$NON-NLS-1$
+					+ IValidatable.class);
+		}
+		_bindings = bindings;
+		_property = property;
+		_clazz = clazz;
+		_button = button;
+		_button.addActionListener(this);
+		_enabledByDefault = enabledByDefault;
+	}
+
+	public String getProperty() {
+		return _property;
+	}
+
+	public void clear(IValidatable bean) {
+		_button.setSelected(_enabledByDefault);
+		updateComponents();
+	}
+
+	public void put(IValidatable bean) {
+		try {
+			Object component = PropertyUtils.getProperty(bean, _property);
+			_button.setSelected(component != null);
+			updateComponents();
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void get(IValidatable bean) {
+		try {
+			PropertyUtils.setProperty(bean, _property, _button.isSelected()
+					? _clazz.newInstance() : null);
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void markValid() {}
+
+	public void markInvalid() {}
+
+	public void setEnabled(boolean enabled) {} // XXX implement?
+
+	public void actionPerformed(ActionEvent e) {
+		updateComponents();
+	}
+	
+	private void updateComponents() {
+		_bindings.setComponentsEnabled(_property, _button.isSelected());
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptListBinding.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptListBinding.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/OptListBinding.java	(revision 15023)
@@ -0,0 +1,115 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Sep 3, 2005
+ */
+package net.sf.launch4j.binding;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JTextArea;
+import javax.swing.JToggleButton;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class OptListBinding implements Binding, ActionListener {
+	private final String _property;
+	private final String _stateProperty;
+	private final JToggleButton _button;
+	private final JTextArea _textArea;
+	private final Color _validColor;
+
+	public OptListBinding(String property, String stateProperty, 
+			JToggleButton button, JTextArea textArea) {
+		if (property == null || button == null || textArea == null) {
+			throw new NullPointerException();
+		}
+		if (property.equals("")) {
+			throw new IllegalArgumentException();
+		}
+		_property = property;
+		_stateProperty = stateProperty;
+		_button = button;
+		_textArea = textArea;
+		_validColor = _textArea.getBackground();
+		button.addActionListener(this);
+	}
+
+	public String getProperty() {
+		return _property;
+	}
+
+	public void clear(IValidatable bean) {
+		put(bean);
+	}
+
+	public void put(IValidatable bean) {
+		try {
+			boolean selected = "true".equals(BeanUtils.getProperty(bean, _stateProperty));
+			_button.setSelected(selected);
+			_textArea.setEnabled(selected);
+			String[] items = (String[]) PropertyUtils.getProperty(bean, _property);
+			StringBuffer sb = new StringBuffer();
+			for (int i = 0; i < items.length; i++) {
+				sb.append(items[i]);
+				if (i < items.length - 1) {
+					sb.append("\n");
+				}
+			}
+			_textArea.setText(sb.toString());
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void get(IValidatable bean) {
+		try {
+			String[] items = _textArea.getText().split("\n");
+			PropertyUtils.setProperty(bean, _property, _button.isSelected() ? items : null);
+		} catch (Exception e) {
+			throw new BindingException(e);
+		}
+	}
+
+	public void markValid() {
+		_textArea.setBackground(_validColor);
+		_textArea.requestFocusInWindow();
+	}
+
+	public void markInvalid() {
+		_textArea.setBackground(Binding.INVALID_COLOR);
+	}
+	
+	public void setEnabled(boolean enabled) {
+		_textArea.setEnabled(enabled);
+	}
+
+	public void actionPerformed(ActionEvent e) {
+		_textArea.setEnabled(_button.isSelected());
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Validator.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Validator.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/Validator.java	(revision 15023)
@@ -0,0 +1,186 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2004-01-30
+ */
+package net.sf.launch4j.binding;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashSet;
+
+import net.sf.launch4j.Util;
+import net.sf.launch4j.config.ConfigPersister;
+
+/**
+ * @author Copyright (C) 2004 Grzegorz Kowal
+ */
+public class Validator {
+	public static final String ALPHANUMERIC_PATTERN = "[\\w]*?"; //$NON-NLS-1$
+	public static final String ALPHA_PATTERN = "[\\w&&\\D]*?"; //$NON-NLS-1$
+	public static final String NUMERIC_PATTERN = "[\\d]*?"; //$NON-NLS-1$
+	public static final String PATH_PATTERN = "[\\w|[ .,:\\-/\\\\]]*?"; //$NON-NLS-1$
+
+	public static final int MAX_PATH = 260;
+
+	private Validator() {}
+
+	public static boolean isEmpty(String s) {
+		return s == null || s.equals(""); //$NON-NLS-1$
+	}
+
+	public static void checkNotNull(Object o, String property, String name) {
+		if (o == null) {
+			signalViolation(property,
+					Messages.getString("Validator.empty.field", name)); //$NON-NLS-1$
+		}
+	}
+
+	public static void checkString(String s, int maxLength, String property, String name) {
+		if (s == null || s.length() == 0) {
+			signalViolation(property,
+					Messages.getString("Validator.empty.field", name)); //$NON-NLS-1$
+		}
+		if (s.length() > maxLength) {
+			signalLengthViolation(property, name, maxLength);
+		}
+	}
+
+	public static void checkString(String s, int maxLength, String pattern,
+			String property, String name) {
+		checkString(s, maxLength, property, name);
+		if (!s.matches(pattern)) {
+			signalViolation(property,
+					Messages.getString("Validator.invalid.data", name)); //$NON-NLS-1$
+		}
+	}
+
+	public static void checkOptString(String s, int maxLength, String property, String name) {
+		if (s == null || s.length() == 0) {
+			return;
+		}
+		if (s.length() > maxLength) {
+			signalLengthViolation(property, name, maxLength);
+		}
+	}
+
+	public static void checkOptString(String s, int maxLength, String pattern,
+			String property, String name) {
+		if (s == null || s.length() == 0) {
+			return;
+		}
+		if (s.length() > maxLength) {
+			signalLengthViolation(property, name, maxLength);
+		}
+		if (!s.matches(pattern)) {
+			signalViolation(property,
+					Messages.getString("Validator.invalid.data", name));	//$NON-NLS-1$
+		}
+	}
+
+	public static void checkRange(int value, int min, int max,
+			String property, String name) {
+		if (value < min || value > max) {
+			signalViolation(property,
+					Messages.getString("ValidatocheckFiler.must.be.in.range", //$NON-NLS-1$
+					name, String.valueOf(min), String.valueOf(max)));
+		}
+	}
+
+	public static void checkRange(char value, char min, char max,
+			String property, String name) {
+		if (value < min || value > max) {
+			signalViolation(property,
+					Messages.getString("Validator.must.be.in.range", //$NON-NLS-1$
+					name, String.valueOf(min), String.valueOf(max)));
+		}
+	}
+
+	public static void checkMin(int value, int min, String property, String name) {
+		if (value < min) {
+			signalViolation(property,
+					Messages.getString("Validator.must.be.at.least", //$NON-NLS-1$
+					name, String.valueOf(min)));
+		}
+	}
+
+	public static void checkTrue(boolean condition, String property, String msg) {
+		if (!condition) {
+			signalViolation(property, msg);
+		}
+	}
+	
+	public static void checkFalse(boolean condition, String property, String msg) {
+		if (condition) {
+			signalViolation(property, msg);
+		}
+	}
+	
+	public static void checkElementsNotNullUnique(Collection c, String property, String msg) {
+		if (c.contains(null)
+				|| new HashSet(c).size() != c.size()) {
+			signalViolation(property,
+					Messages.getString("Validator.already.exists", msg)); //$NON-NLS-1$ 
+		}
+	}
+
+	public static void checkElementsUnique(Collection c, String property, String msg) {
+		if (new HashSet(c).size() != c.size()) {
+			signalViolation(property,
+					Messages.getString("Validator.already.exists", msg)); //$NON-NLS-1$
+		}
+	}
+
+	public static void checkFile(File f, String property, String fileDescription) {
+		File cfgPath = ConfigPersister.getInstance().getConfigPath();
+		if (f == null || (!f.exists() && !Util.getAbsoluteFile(cfgPath, f).exists())) {
+			signalViolation(property,
+					Messages.getString("Validator.doesnt.exist", fileDescription)); //$NON-NLS-1$
+		}
+	}
+
+	public static void checkOptFile(File f, String property, String fileDescription) {
+		if (f != null && f.getPath().length() > 0) {
+			checkFile(f, property, fileDescription);
+		}
+	}
+
+	public static void checkRelativeWinPath(String path, String property, String msg) {
+		if (path == null
+				|| path.equals("")
+				|| path.startsWith("/") //$NON-NLS-1$
+				|| path.startsWith("\\") //$NON-NLS-1$
+				|| path.indexOf(':') != -1) {
+			signalViolation(property, msg);
+		}
+	}
+
+	public static void signalLengthViolation(String property, String name, int maxLength) {
+		signalViolation(property,
+				Messages.getString("Validator.exceeds.max.length", //$NON-NLS-1$
+						name, String.valueOf(maxLength)));
+	}
+
+	public static void signalViolation(String property, String msg)	{
+		throw new InvariantViolationException(property, msg);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages.properties	(revision 15023)
@@ -0,0 +1,34 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+OptComponentBinding.must.implement=Optional component must implement 
+
+Validator.empty.field=Enter: {0} 
+Validator.invalid.data=Invalid data: {0} 
+Validator.must.be.in.range={0} must be in range [{1}-{2}]
+Validator.must.be.at.least={0} must be at least 
+Validator.already.exists={0} already exists.
+Validator.doesnt.exist={0} doesn't exist.
+Validator.exceeds.max.length={0} exceeds the maximum length of {1} characters.
+
+Bindings.duplicate.binding=Duplicate binding
+
+JRadioButtonBinding.property.null=Property is null
+JRadioButtonBinding.nothing.selected=Nothing selected
+JRadioButtonBinding.index.out.of.bounds=Button index out of bounds
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages_es.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages_es.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/binding/messages_es.properties	(revision 15023)
@@ -0,0 +1,34 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+OptComponentBinding.must.implement=El componente opcional debe ser implementado 
+
+Validator.empty.field=Introduzca: {0} 
+Validator.invalid.data=Dato no válido: {0} 
+Validator.must.be.in.range={0} debe estar en el rango [{1}-{2}]
+Validator.must.be.at.least={0} deb ser al menos 
+Validator.already.exists={0} ya existe.
+Validator.doesnt.exist={0} no existe.
+Validator.exceeds.max.length={0} excede la longitud máxima de {1} caracteres.
+
+Bindings.duplicate.binding=Binding duplicado
+
+JRadioButtonBinding.property.null=La propiedad es nula
+JRadioButtonBinding.nothing.selected=Nada seleccionado
+JRadioButtonBinding.index.out.of.bounds=Índice de botón fuera de límite
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Config.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Config.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Config.java	(revision 15023)
@@ -0,0 +1,244 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 21, 2005
+ */
+package net.sf.launch4j.config;
+
+import java.io.File;
+
+import net.sf.launch4j.binding.IValidatable;
+import net.sf.launch4j.binding.Validator;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Config implements IValidatable {
+
+	public static final String HEADER = "header"; //$NON-NLS-1$
+	public static final String JAR = "jar"; //$NON-NLS-1$
+	public static final String OUTFILE = "outfile"; //$NON-NLS-1$
+	public static final String ERR_TITLE = "errTitle"; //$NON-NLS-1$
+	public static final String JAR_ARGS = "jarArgs"; //$NON-NLS-1$
+	public static final String CHDIR = "chdir"; //$NON-NLS-1$
+	public static final String CUSTOM_PROC_NAME = "customProcName"; //$NON-NLS-1$
+	public static final String STAY_ALIVE = "stayAlive"; //$NON-NLS-1$
+	public static final String ICON = "icon"; //$NON-NLS-1$
+
+	public static final int GUI_HEADER = 0;
+	public static final int CONSOLE_HEADER = 1;
+
+	private boolean dontWrapJar;
+	private int headerType;
+	private String[] headerObjects;
+	private String[] libs;
+	private File jar;
+	private File outfile;
+
+	// runtime configuration
+	private String errTitle;
+	private String jarArgs;
+	private String chdir;
+	private boolean customProcName;
+	private boolean stayAlive;
+	private File icon;
+	private Jre jre;
+	private Splash splash;
+	private VersionInfo versionInfo;
+
+	public void checkInvariants() {
+		Validator.checkTrue(outfile != null && outfile.getPath().endsWith(".exe"), //$NON-NLS-1$
+				"outfile", Messages.getString("Config.specify.output.exe")); //$NON-NLS-1$ //$NON-NLS-2$
+		if (dontWrapJar) {
+			Validator.checkRelativeWinPath(jar.getPath(), "jar", Messages.getString("Config.application.jar.path"));
+		} else {
+			Validator.checkFile(jar, "jar", Messages.getString("Config.application.jar")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if (!Validator.isEmpty(chdir)) {
+			Validator.checkRelativeWinPath(chdir,
+					"chdir", Messages.getString("Config.chdir.relative")); //$NON-NLS-1$ //$NON-NLS-2$
+			Validator.checkFalse(chdir.toLowerCase().equals("true") //$NON-NLS-1$
+					|| chdir.toLowerCase().equals("false"), //$NON-NLS-1$
+					"chdir", Messages.getString("Config.chdir.path")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		Validator.checkOptFile(icon, "icon", Messages.getString("Config.icon")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkOptString(jarArgs, 16384, "jarArgs", Messages.getString("Config.jar.arguments")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkOptString(errTitle, 128, "errTitle", Messages.getString("Config.error.title")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkRange(headerType, GUI_HEADER, CONSOLE_HEADER,
+				"headerType", Messages.getString("Config.invalid.header.type")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkTrue(headerType != CONSOLE_HEADER || splash == null,
+				"headerType", Messages.getString("Config.splash.not.impl.by.console.hdr")); //$NON-NLS-1$ //$NON-NLS-2$
+		jre.checkInvariants();
+	}
+	
+	public void validate() {
+		checkInvariants();
+		if (splash != null) {
+			splash.checkInvariants();
+		}
+		if (versionInfo != null) {
+			versionInfo.checkInvariants();
+		}
+	}
+
+	/** Change current directory to EXE location. */
+	public String getChdir() {
+		return chdir;
+	}
+
+	public void setChdir(String chdir) {
+		this.chdir = chdir;
+	}
+
+	/** Constant command line arguments passed to application jar. */
+	public String getJarArgs() {
+		return jarArgs;
+	}
+
+	public void setJarArgs(String jarArgs) {
+		this.jarArgs = jarArgs;
+	}
+
+	/** Optional, error message box title. */
+	public String getErrTitle() {
+		return errTitle;
+	}
+
+	public void setErrTitle(String errTitle) {
+		this.errTitle = errTitle;
+	}
+
+	/** launch4j header file. */
+	public int getHeaderType() {
+		return headerType;
+	}
+
+	public void setHeaderType(int headerType) {
+		this.headerType = headerType;
+	}
+	
+	public boolean isCustomHeaderObjects() {
+		return headerObjects != null && headerObjects.length > 0;
+	}
+
+	public String[] getHeaderObjects() {
+		return isCustomHeaderObjects() ? headerObjects
+				: headerType == GUI_HEADER
+						? LdDefaults.getInstance().getGuiHeaderObjects()
+						: LdDefaults.getInstance().getConsoleHeaderObjects();
+	}
+
+	public void setHeaderObjects(String[] headerObjects) {
+		this.headerObjects = headerObjects;
+	}
+
+	public boolean isCustomLibs() {
+		return libs != null && libs.length > 0;
+	}
+
+	public String[] getLibs() {
+		return isCustomLibs() ? libs : LdDefaults.getInstance().getLibs();
+	}
+
+	public void setLibs(String[] libs) {
+		this.libs = libs;
+	}
+
+	/** ICO file. */
+	public File getIcon() {
+		return icon;
+	}
+
+	public void setIcon(File icon) {
+		this.icon = icon;
+	}
+
+	/** Jar to wrap. */
+	public File getJar() {
+		return jar;
+	}
+
+	public void setJar(File jar) {
+		this.jar = jar;
+	}
+
+	/** JRE configuration */
+	public Jre getJre() {
+		return jre;
+	}
+
+	public void setJre(Jre jre) {
+		this.jre = jre;
+	}
+
+	/** Output EXE file. */
+	public File getOutfile() {
+		return outfile;
+	}
+
+	public void setOutfile(File outfile) {
+		this.outfile = outfile;
+	}
+
+	/** Custom process name as the output EXE file name. */
+	public boolean isCustomProcName() {
+		return customProcName;
+	}
+
+	public void setCustomProcName(boolean customProcName) {
+		this.customProcName = customProcName;
+	}
+
+	/** Splash screen configuration. */
+	public Splash getSplash() {
+		return splash;
+	}
+
+	public void setSplash(Splash splash) {
+		this.splash = splash;
+	}
+
+	/** Stay alive after launching the application. */
+	public boolean isStayAlive() {
+		return stayAlive;
+	}
+
+	public void setStayAlive(boolean stayAlive) {
+		this.stayAlive = stayAlive;
+	}
+	
+	public VersionInfo getVersionInfo() {
+		return versionInfo;
+	}
+
+	public void setVersionInfo(VersionInfo versionInfo) {
+		this.versionInfo = versionInfo;
+	}
+
+	public boolean isDontWrapJar() {
+		return dontWrapJar;
+	}
+
+	public void setDontWrapJar(boolean dontWrapJar) {
+		this.dontWrapJar = dontWrapJar;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersister.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersister.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersister.java	(revision 15023)
@@ -0,0 +1,205 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 22, 2005
+ */
+package net.sf.launch4j.config;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Properties;
+
+import net.sf.launch4j.Util;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class ConfigPersister {
+
+	private static final ConfigPersister _instance = new ConfigPersister();
+
+	private final XStream _xstream;
+	private Config _config;
+	private File _configPath;
+
+	private ConfigPersister() {
+		_xstream = new XStream(new DomDriver());
+    	_xstream.alias("launch4jConfig", Config.class);
+    	_xstream.alias("jre", Jre.class);
+    	_xstream.alias("splash", Splash.class);
+    	_xstream.alias("versionInfo", VersionInfo.class);
+    	_xstream.alias("file", String.class);
+	}
+
+	public static ConfigPersister getInstance() {
+		return _instance;
+	}
+	
+	public Config getConfig() {
+		return _config;
+	}
+
+	public File getConfigPath() {
+		return _configPath;
+	}
+	
+	public File getOutputPath() throws IOException {
+		if (_config.getOutfile().isAbsolute()) {
+			return _config.getOutfile().getParentFile();
+		}
+		File parent = _config.getOutfile().getParentFile();
+		return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath;
+	}
+	
+	public File getOutputFile() throws IOException {
+		return _config.getOutfile().isAbsolute()
+			? _config.getOutfile()
+			: new File(getOutputPath(), _config.getOutfile().getName());
+	}
+
+	public void createBlank() {
+		_config = new Config();
+		_config.setJre(new Jre());
+		_configPath = null;
+	}
+
+	public void setAntConfig(Config c, File basedir) {
+		_config = c;
+		_configPath = basedir;
+	}
+
+	public void load(File f) throws ConfigPersisterException {
+		try {
+			BufferedReader r = new BufferedReader(new FileReader(f));
+	    	_config = (Config) _xstream.fromXML(r);
+	    	r.close();
+	    	setConfigPath(f);
+		} catch (Exception e) {
+			throw new ConfigPersisterException(e);
+		}
+	}
+
+	/**
+	 * Imports launch4j 1.x.x config file.
+	 */
+	public void loadVersion1(File f) throws ConfigPersisterException {
+		try {
+			Props props = new Props(f);
+			_config = new Config();
+			String header = props.getProperty(Config.HEADER);
+			_config.setHeaderType(header == null
+					|| header.toLowerCase().equals("guihead.bin") ? 0 : 1);
+			_config.setJar(props.getFile(Config.JAR));
+			_config.setOutfile(props.getFile(Config.OUTFILE));
+			_config.setJre(new Jre());
+			_config.getJre().setPath(props.getProperty(Jre.PATH));
+			_config.getJre().setMinVersion(props.getProperty(Jre.MIN_VERSION));
+			_config.getJre().setMaxVersion(props.getProperty(Jre.MAX_VERSION));
+			_config.getJre().setArgs(props.getProperty(Jre.ARGS));
+			_config.setJarArgs(props.getProperty(Config.JAR_ARGS));
+			_config.setChdir("true".equals(props.getProperty(Config.CHDIR)) ? "." : null);
+			_config.setCustomProcName("true".equals(
+					props.getProperty("setProcName")));				// 1.x
+			_config.setStayAlive("true".equals(props.getProperty(Config.STAY_ALIVE)));
+			_config.setErrTitle(props.getProperty(Config.ERR_TITLE));
+			_config.setIcon(props.getFile(Config.ICON));
+			File splashFile = props.getFile(Splash.SPLASH_FILE);
+			if (splashFile != null) {
+				_config.setSplash(new Splash());
+				_config.getSplash().setFile(splashFile);
+				String waitfor = props.getProperty("waitfor");		// 1.x
+				_config.getSplash().setWaitForWindow(waitfor != null && !waitfor.equals(""));
+				String splashTimeout = props.getProperty(Splash.TIMEOUT);
+				if (splashTimeout != null) {
+					_config.getSplash().setTimeout(Integer.parseInt(splashTimeout));	
+				}
+				_config.getSplash().setTimeoutErr("true".equals(
+						props.getProperty(Splash.TIMEOUT_ERR)));
+			} else {
+				_config.setSplash(null);
+			}
+			setConfigPath(f);
+		} catch (IOException e) {
+			throw new ConfigPersisterException(e);
+		}
+	}
+
+	public void save(File f) throws ConfigPersisterException {
+		try {
+			BufferedWriter w = new BufferedWriter(new FileWriter(f));
+	    	_xstream.toXML(_config, w);
+	    	w.close();
+	    	setConfigPath(f);
+		} catch (Exception e) {
+			throw new ConfigPersisterException(e);
+		}
+	}
+
+	private void setConfigPath(File configFile) {
+		_configPath = configFile.getAbsoluteFile().getParentFile();
+	}
+
+	private class Props {
+		final Properties _properties = new Properties();
+
+		public Props(File f) throws IOException {
+			FileInputStream is = null;
+			try {
+				is = new FileInputStream(f);
+				_properties.load(is);
+			} finally {
+				Util.close(is);
+			}
+		}
+
+		/**
+		 * Get property and remove trailing # comments.
+		 */
+		public String getProperty(String key) {
+			String p = _properties.getProperty(key);
+			if (p == null) {
+				return null;
+			}
+			int x = p.indexOf('#');
+			if (x == -1) {
+				return p;
+			}
+			do {
+				x--;
+			} while (x > 0 && (p.charAt(x) == ' ' || p.charAt(x) == '\t'));
+			return (x == 0) ? "" : p.substring(0, x + 1);
+		}
+
+		public File getFile(String key) {
+			String value = getProperty(key);
+			return value != null ? new File(value) : null;
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java	(revision 15023)
@@ -0,0 +1,39 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 22, 2005
+ */
+package net.sf.launch4j.config;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class ConfigPersisterException extends Exception {
+
+	public ConfigPersisterException(String msg, Throwable t) {
+		super(msg, t);
+	}
+	
+	public ConfigPersisterException(Throwable t) {
+		super(t);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Jre.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Jre.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Jre.java	(revision 15023)
@@ -0,0 +1,131 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 21, 2005
+ */
+package net.sf.launch4j.config;
+
+import net.sf.launch4j.binding.IValidatable;
+import net.sf.launch4j.binding.Validator;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Jre implements IValidatable {
+	public static final String VERSION_PATTERN = "(\\d\\.){2}\\d(_\\d+)?"; //$NON-NLS-1$
+	public static final String PATH = "jrepath"; //$NON-NLS-1$
+	public static final String MIN_VERSION = "javamin"; //$NON-NLS-1$
+	public static final String MAX_VERSION = "javamax"; //$NON-NLS-1$
+	public static final String ARGS = "jvmArgs"; //$NON-NLS-1$
+
+	private String path;
+	private String minVersion;
+	private String maxVersion;
+	private int initialHeapSize;
+	private int maxHeapSize;
+	private String args;
+
+	public void checkInvariants() {
+		Validator.checkOptString(minVersion, 10, VERSION_PATTERN,
+				"jre.minVersion", Messages.getString("Jre.min.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkOptString(maxVersion, 10, VERSION_PATTERN,
+				"jre.maxVersion", Messages.getString("Jre.max.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		if (Validator.isEmpty(path)) {
+			Validator.checkFalse(Validator.isEmpty(minVersion),
+					"jre.path", Messages.getString("Jre.specify.jre.path.min.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		} else {
+			Validator.checkString(path, Validator.MAX_PATH,
+					"jre.path", Messages.getString("Jre.embedded.path")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		if (!Validator.isEmpty(maxVersion)) {
+			Validator.checkFalse(Validator.isEmpty(minVersion),
+					"jre.minVersion", Messages.getString("Jre.specify.min.version")); //$NON-NLS-1$ //$NON-NLS-2$
+			Validator.checkTrue(minVersion.compareTo(maxVersion) < 0,
+					"jre.maxVersion", Messages.getString("Jre.max.greater.than.min")); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		Validator.checkTrue(initialHeapSize >= 0, "jre.initialHeapSize", //$NON-NLS-1$
+				Messages.getString("Jre.initial.heap")); //$NON-NLS-1$
+		Validator.checkTrue(maxHeapSize == 0 || initialHeapSize <= maxHeapSize,
+				"jre.maxHeapSize", Messages.getString("Jre.max.heap")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkOptString(args, 512, "jre.args", Messages.getString("Jre.jvm.args")); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!Validator.isEmpty(args)) {
+			Validator.checkTrue(args.matches("[^\"]*|([^\"]*\"[^\"]*\"[^\"]*)*"),
+					"jre.args", Messages.getString("Jre.jvm.args.unclosed.quotation"));
+			Validator.checkTrue(args.matches("[^%]*|([^%]*\"([^%]*%[^%]+%[^%]*)+\"[^%]*)*"),
+					"jre.args", Messages.getString("Jre.jvm.args.variable"));
+		}
+	}
+
+	/** JVM arguments: XOptions, system properties. */
+	public String getArgs() {
+		return args;
+	}
+
+	public void setArgs(String args) {
+		this.args = args;
+	}
+
+	/** Max Java version (x.x.x) */
+	public String getMaxVersion() {
+		return maxVersion;
+	}
+
+	public void setMaxVersion(String maxVersion) {
+		this.maxVersion = maxVersion;
+	}
+
+	/** Min Java version (x.x.x) */
+	public String getMinVersion() {
+		return minVersion;
+	}
+
+	public void setMinVersion(String minVersion) {
+		this.minVersion = minVersion;
+	}
+
+	/** JRE path */
+	public String getPath() {
+		return path;
+	}
+
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	/** Initial heap size in MB */
+	public int getInitialHeapSize() {
+		return initialHeapSize;
+	}
+
+	public void setInitialHeapSize(int initialHeapSize) {
+		this.initialHeapSize = initialHeapSize;
+	}
+
+	/** Max heap size in MB */
+	public int getMaxHeapSize() {
+		return maxHeapSize;
+	}
+
+	public void setMaxHeapSize(int maxHeapSize) {
+		this.maxHeapSize = maxHeapSize;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/LdDefaults.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/LdDefaults.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/LdDefaults.java	(revision 15023)
@@ -0,0 +1,65 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Sep 3, 2005
+ */
+package net.sf.launch4j.config;
+
+public class LdDefaults {
+	private static final LdDefaults _instance = new LdDefaults();
+
+	private final String[] _guiHeaderObjects;
+	private final String[] _consoleHeaderObjects;
+	private final String[] _libs;
+
+	private LdDefaults() {
+		_guiHeaderObjects = new String[] {"w32api/crt2.o",
+				"head/guihead.o",
+				"head/head.o"};
+		_consoleHeaderObjects = new String[] {"w32api/crt2.o",
+				"head/consolehead.o",
+				"head/head.o"};
+		_libs = new String[] {"w32api/libmingw32.a",
+				"w32api/libgcc.a",
+				"w32api/libmsvcrt.a",
+				"w32api/libkernel32.a",
+				"w32api/libuser32.a",
+				"w32api/libadvapi32.a",
+				"w32api/libshell32.a"};
+	}
+
+	public static LdDefaults getInstance() {
+		return _instance;
+	}
+
+	public String[] getGuiHeaderObjects() {
+		return _guiHeaderObjects;
+	}
+	
+	public String[] getConsoleHeaderObjects() {
+		return _consoleHeaderObjects;
+	}
+	
+	public String[] getLibs() {
+		return _libs;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Messages.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Messages.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Messages.java	(revision 15023)
@@ -0,0 +1,68 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.config;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "net.sf.launch4j.config.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+	private static final MessageFormat FORMATTER = new MessageFormat("");
+
+	private Messages() {
+	}
+	
+	public static String getString(String key) {
+		// TODO Auto-generated method stub
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+	
+	public static String getString(String key, String arg0) {
+		return getString(key, new Object[] {arg0});
+	}
+
+	public static String getString(String key, String arg0, String arg1) {
+		return getString(key, new Object[] {arg0, arg1});
+	}
+
+	public static String getString(String key, String arg0, String arg1, String arg2) {
+		return getString(key, new Object[] {arg0, arg1, arg2});
+	}
+
+	public static String getString(String key, Object[] args) {
+		// TODO Auto-generated method stub
+		try {
+			FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key));
+			return FORMATTER.format(args);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Splash.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Splash.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/Splash.java	(revision 15023)
@@ -0,0 +1,86 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on Apr 21, 2005
+ */
+package net.sf.launch4j.config;
+
+import java.io.File;
+
+import net.sf.launch4j.binding.IValidatable;
+import net.sf.launch4j.binding.Validator;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class Splash implements IValidatable {
+	public static final String SPLASH_FILE = "splash"; //$NON-NLS-1$
+	public static final String WAIT_FOR_TITLE = "waitForTitle"; //$NON-NLS-1$
+	public static final String TIMEOUT = "splashTimeout"; //$NON-NLS-1$
+	public static final String TIMEOUT_ERR = "splashTimeoutErr"; //$NON-NLS-1$
+
+	private File file;
+	private boolean waitForWindow = true;
+	private int timeout = 60;
+	private boolean timeoutErr = true;
+
+	public void checkInvariants() {
+		Validator.checkFile(file, "splash.file", Messages.getString("Splash.splash.file")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkRange(timeout, 1, 60 * 15, "splash.timeout", Messages.getString("Splash.splash.timeout")); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/** Splash screen in BMP format. */
+	public File getFile() {
+		return file;
+	}
+
+	public void setFile(File file) {
+		this.file = file;
+	}
+
+	/** Splash timeout in seconds. */
+	public int getTimeout() {
+		return timeout;
+	}
+
+	public void setTimeout(int timeout) {
+		this.timeout = timeout;
+	}
+
+	/** Signal error on splash timeout. */
+	public boolean isTimeoutErr() {
+		return timeoutErr;
+	}
+
+	public void setTimeoutErr(boolean timeoutErr) {
+		this.timeoutErr = timeoutErr;
+	}
+
+	/** Hide splash screen when the child process displayes the first window. */
+	public boolean getWaitForWindow() {
+		return waitForWindow;
+	}
+
+	public void setWaitForWindow(boolean waitForWindow) {
+		this.waitForWindow = waitForWindow;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/VersionInfo.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/VersionInfo.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/VersionInfo.java	(revision 15023)
@@ -0,0 +1,156 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 21, 2005
+ */
+package net.sf.launch4j.config;
+
+import net.sf.launch4j.binding.IValidatable;
+import net.sf.launch4j.binding.Validator;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class VersionInfo implements IValidatable {
+	public static final String VERSION_PATTERN = "(\\d+\\.){3}\\d+"; //$NON-NLS-1$
+	private static final int MAX_LEN = 150;
+
+	private String fileVersion;
+	private String txtFileVersion;
+	private String fileDescription;
+	private String copyright;
+	private String productVersion;
+	private String txtProductVersion;
+	private String productName;
+	private String companyName;
+	private String internalName;
+	private String originalFilename;
+
+	public void checkInvariants() {
+		Validator.checkString(fileVersion, 20, VERSION_PATTERN,
+				"versionInfo.fileVersion", Messages.getString("VersionInfo.file.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(txtFileVersion, 50,
+				"versionInfo.txtFileVersion", Messages.getString("VersionInfo.txt.file.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(fileDescription, MAX_LEN,
+				"versionInfo.fileDescription", Messages.getString("VersionInfo.file.description")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(copyright, MAX_LEN,
+				"versionInfo.copyright", Messages.getString("VersionInfo.copyright")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(productVersion, 20, VERSION_PATTERN,
+				"versionInfo.productVersion", Messages.getString("VersionInfo.product.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(txtProductVersion, 50,
+				"versionInfo.txtProductVersion", Messages.getString("VersionInfo.txt.product.version")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(productName, MAX_LEN,
+				"versionInfo.productName", Messages.getString("VersionInfo.product.name")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkOptString(companyName, MAX_LEN,
+				"versionInfo.companyName", Messages.getString("VersionInfo.company.name")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkString(internalName, 50,
+				"versionInfo.internalName", Messages.getString("VersionInfo.internal.name")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkTrue(!internalName.endsWith(".exe"), //$NON-NLS-1$
+				"versionInfo.internalName", //$NON-NLS-1$
+				Messages.getString("VersionInfo.internal.name.not.exe")); //$NON-NLS-1$
+		Validator.checkString(originalFilename, 50,
+				"versionInfo.originalFilename", Messages.getString("VersionInfo.original.filename")); //$NON-NLS-1$ //$NON-NLS-2$
+		Validator.checkTrue(originalFilename.endsWith(".exe"), //$NON-NLS-1$
+				"versionInfo.originalFilename", //$NON-NLS-1$
+				Messages.getString("VersionInfo.original.filename.exe")); //$NON-NLS-1$
+	}
+
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public String getCopyright() {
+		return copyright;
+	}
+
+	public void setCopyright(String copyright) {
+		this.copyright = copyright;
+	}
+
+	public String getFileDescription() {
+		return fileDescription;
+	}
+
+	public void setFileDescription(String fileDescription) {
+		this.fileDescription = fileDescription;
+	}
+
+	public String getFileVersion() {
+		return fileVersion;
+	}
+
+	public void setFileVersion(String fileVersion) {
+		this.fileVersion = fileVersion;
+	}
+
+	public String getInternalName() {
+		return internalName;
+	}
+
+	public void setInternalName(String internalName) {
+		this.internalName = internalName;
+	}
+
+	public String getOriginalFilename() {
+		return originalFilename;
+	}
+
+	public void setOriginalFilename(String originalFilename) {
+		this.originalFilename = originalFilename;
+	}
+
+	public String getProductName() {
+		return productName;
+	}
+
+	public void setProductName(String productName) {
+		this.productName = productName;
+	}
+
+	public String getProductVersion() {
+		return productVersion;
+	}
+
+	public void setProductVersion(String productVersion) {
+		this.productVersion = productVersion;
+	}
+
+	public String getTxtFileVersion() {
+		return txtFileVersion;
+	}
+
+	public void setTxtFileVersion(String txtFileVersion) {
+		this.txtFileVersion = txtFileVersion;
+	}
+
+	public String getTxtProductVersion() {
+		return txtProductVersion;
+	}
+
+	public void setTxtProductVersion(String txtProductVersion) {
+		this.txtProductVersion = txtProductVersion;
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages.properties	(revision 15023)
@@ -0,0 +1,57 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+Splash.splash.file=Splash file
+Splash.splash.timeout=Splash timeout
+
+Config.specify.output.exe=Specify output file with .exe extension.
+Config.application.jar=Application jar
+Config.application.jar.path=Specify runtime path of the jar relative to the executable.
+Config.chdir.relative='chdir' must be a path relative to the executable.
+Config.chdir.path='chdir' is now a path instead of a boolean, please check the docs.
+Config.icon=Icon
+Config.jar.arguments=Jar arguments
+Config.error.title=Error title
+Config.invalid.header.type=Invalid header type
+Config.splash.not.impl.by.console.hdr=Splash screen is not implemented by console header.
+
+VersionInfo.file.version=File version, should be 'x.x.x.x'
+VersionInfo.txt.file.version=Free form file version
+VersionInfo.file.description=File description
+VersionInfo.copyright=Copyright
+VersionInfo.product.version=Product version, should be 'x.x.x.x'
+VersionInfo.txt.product.version=Free from product version
+VersionInfo.product.name=Product name
+VersionInfo.company.name=Company name
+VersionInfo.internal.name=Internal name
+VersionInfo.internal.name.not.exe=Internal name shouldn't have the .exe extension.
+VersionInfo.original.filename=Original filename
+VersionInfo.original.filename.exe=Original filename should end with the .exe extension.
+
+Jre.min.version=Minimum JRE version should be x.x.x[_xx]
+Jre.max.version=Maximum JRE version should be x.x.x[_xx]
+Jre.specify.jre.path.min.version=Specify embedded JRE path or/and minimum JRE version.
+Jre.embedded.path=Embedded JRE path
+Jre.specify.min.version=Specify minimum JRE version.
+Jre.max.greater.than.min=Maximum JRE version must be greater than the minimum.\nTo use a certain JRE version, you may set the min/max range to [1.4.2 - 1.4.2_10] for example.
+Jre.initial.heap=Initial heap size cannot be negative, specify 0 or leave the field blank to use the JVM default.
+Jre.max.heap=Maximum heap size cannot be less than the initial size, specify 0 or leave the field blank to use the JVM default.
+Jre.jvm.args=JVM arguments
+Jre.jvm.args.unclosed.quotation=JVM arguments contain an unclosed quotation.
+Jre.jvm.args.variable=Invalid environment variable reference.
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages_es.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages_es.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/config/messages_es.properties	(revision 15023)
@@ -0,0 +1,51 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+# 	Spanish translation (C) 2005 Patricio Martínez Ros
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+Splash.splash.file = Fichero de la pantalla de bienvenida
+Splash.splash.timeout = Tiempo de espera de la pantalla de bienvenida
+Config.specify.output.exe = Especifique el fichero de salida con extensi\u00F3n .exe.
+Config.application.jar = Aplicaci\u00F3n jar
+Config.application.jar.path = Especifique la ruta del jar relativa al ejecutable. 
+Config.chdir.relative = 'Cambiar al directorio' debe ser una ruta relativa al ejecutable.
+Config.chdir.path = 'Cambiar al directorio' ahora es una ruta en lugar de un booleano, por favor consulte la documentaci\u00F3n.
+Config.icon = Icono
+Config.jar.arguments = Argumentos del jar
+Config.error.title = T\u00EDtulo de error
+Config.invalid.header.type = Tipo de cabecera no v\u00E1lido
+Config.splash.not.impl.by.console.hdr = La pantalla de bienvenida no est\u00E1 implementada para la cabecera de tipo consola.
+VersionInfo.file.version = La versi\u00F3n del fichero, deber\u00EDa ser 'x.x.x.x'
+VersionInfo.txt.file.version = Forma libre de versi\u00F3n del fichero
+VersionInfo.file.description = Descripci\u00F3n del fichero
+VersionInfo.copyright = Copyright
+VersionInfo.product.version = Versi\u00F3n del producto, deber\u00EDa ser 'x.x.x.x'
+VersionInfo.txt.product.version = Forma libre de versi\u00F3n del producto
+VersionInfo.product.name = Nombre del producto
+VersionInfo.company.name = Nombre de la organizaci\u00F3n
+VersionInfo.internal.name = Nombre interno
+VersionInfo.internal.name.not.exe = El nombre interno no deber\u00EDa tener extensi\u00F3n .exe.
+VersionInfo.original.filename = Nombre original del fichero
+VersionInfo.original.filename.exe = El nombre original del fichero debe acabar con extensi\u00F3n .exe.
+Jre.min.version = La versi\u00F3n m\u00EDnima del JRE deber\u00EDa ser x.x.x[_xx]
+Jre.max.version = La versi\u00F3n m\u00E1xima del JRE deber\u00EDa ser x.x.x[_xx]
+Jre.specify.jre.path.min.version = Especifique la ruta del JRE embebido o/y la versi\u00F3n m\u00EDnima del JRE.
+Jre.embedded.path.rel = La ruta del JRE debe ser relativa al ejecutable.
+Jre.specify.min.version = Especifique la versi\u00F3n m\u00EDnima del JRE.
+Jre.max.greater.than.min = La versi\u00F3n m\u00E1xima del JRE debe ser mayor que la m\u00EDnima.\nPara usar cierta versi\u00F3n del JRE, puede esyablecer el rango m\u00EDnimo/m\u00E1ximo a [1.4.2 - 1.4.2_10], por ejemplo.
+Jre.initial.heap = El tama\u00F1o inicial de la pila no puede ser negativo, ponga 0 o deje el campo en blanco para usar el de por defecto de la JVM.
+Jre.max.heap = El tama\u00F1o m\u00E1ximo de la pila no puede ser menor que el tama\u00F1o inicial, ponga 0 o deje el campo en blanco para usar el de por defecto de la JVM.
+Jre.jvm.args = Argumentos de la JVM
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/form/ConfigForm.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/form/ConfigForm.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/form/ConfigForm.java	(revision 15023)
@@ -0,0 +1,625 @@
+package net.sf.launch4j.form;
+
+import com.jeta.forms.components.separator.TitledSeparator;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Dimension;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+
+public abstract class ConfigForm extends JPanel
+{
+   protected final JTabbedPane _tab = new JTabbedPane();
+   protected final JButton _outfileButton = new JButton();
+   protected final JLabel _outfileLabel = new JLabel();
+   protected final JLabel _errorTitleLabel = new JLabel();
+   protected final JTextField _outfileField = new JTextField();
+   protected final JTextField _errorTitleField = new JTextField();
+   protected final JCheckBox _customProcNameCheck = new JCheckBox();
+   protected final JCheckBox _stayAliveCheck = new JCheckBox();
+   protected final JLabel _iconLabel = new JLabel();
+   protected final JTextField _iconField = new JTextField();
+   protected final JTextField _jarField = new JTextField();
+   protected final JLabel _jarLabel = new JLabel();
+   protected final JButton _jarButton = new JButton();
+   protected final JButton _iconButton = new JButton();
+   protected final JLabel _jarArgsLabel = new JLabel();
+   protected final JTextField _jarArgsField = new JTextField();
+   protected final JLabel _optionsLabel = new JLabel();
+   protected final JLabel _chdirLabel = new JLabel();
+   protected final JTextField _chdirField = new JTextField();
+   protected final JCheckBox _dontWrapJarCheck = new JCheckBox();
+   protected final JLabel _headerTypeLabel = new JLabel();
+   protected final JRadioButton _guiHeaderRadio = new JRadioButton();
+   protected final ButtonGroup _headerButtonGroup = new ButtonGroup();
+   protected final JRadioButton _consoleHeaderRadio = new JRadioButton();
+   protected final JTextArea _headerObjectsTextArea = new JTextArea();
+   protected final JTextArea _libsTextArea = new JTextArea();
+   protected final JCheckBox _headerObjectsCheck = new JCheckBox();
+   protected final JCheckBox _libsCheck = new JCheckBox();
+   protected final TitledSeparator _linkerOptionsSeparator = new TitledSeparator();
+   protected final JLabel _jrePathLabel = new JLabel();
+   protected final JLabel _jreMinLabel = new JLabel();
+   protected final JLabel _jreMaxLabel = new JLabel();
+   protected final JLabel _jvmArgsTextLabel = new JLabel();
+   protected final JTextField _jrePathField = new JTextField();
+   protected final JTextField _jreMinField = new JTextField();
+   protected final JTextField _jreMaxField = new JTextField();
+   protected final JTextArea _jvmArgsTextArea = new JTextArea();
+   protected final JLabel _initialHeapSizeLabel = new JLabel();
+   protected final JLabel _maxHeapSizeLabel = new JLabel();
+   protected final JTextField _initialHeapSizeField = new JTextField();
+   protected final JTextField _maxHeapSizeField = new JTextField();
+   protected final JRadioButton _otherVarRadio = new JRadioButton();
+   protected final ButtonGroup _buttongroup1 = new ButtonGroup();
+   protected final JTextField _otherVarField = new JTextField();
+   protected final JButton _addVarButton = new JButton();
+   protected final JRadioButton _exeDirRadio = new JRadioButton();
+   protected final JRadioButton _exeFileRadio = new JRadioButton();
+   protected final JLabel _addVarsLabel = new JLabel();
+   protected final JLabel _splashFileLabel = new JLabel();
+   protected final JLabel _waitForWindowLabel = new JLabel();
+   protected final JLabel _timeoutLabel = new JLabel();
+   protected final JCheckBox _timeoutErrCheck = new JCheckBox();
+   protected final JTextField _splashFileField = new JTextField();
+   protected final JTextField _timeoutField = new JTextField();
+   protected final JButton _splashFileButton = new JButton();
+   protected final JCheckBox _splashCheck = new JCheckBox();
+   protected final JCheckBox _waitForWindowCheck = new JCheckBox();
+   protected final JCheckBox _versionInfoCheck = new JCheckBox();
+   protected final JLabel _fileVersionLabel = new JLabel();
+   protected final JTextField _fileVersionField = new JTextField();
+   protected final TitledSeparator _addVersionInfoSeparator = new TitledSeparator();
+   protected final JLabel _productVersionLabel = new JLabel();
+   protected final JTextField _productVersionField = new JTextField();
+   protected final JLabel _fileDescriptionLabel = new JLabel();
+   protected final JTextField _fileDescriptionField = new JTextField();
+   protected final JLabel _copyrightLabel = new JLabel();
+   protected final JTextField _copyrightField = new JTextField();
+   protected final JLabel _txtFileVersionLabel = new JLabel();
+   protected final JTextField _txtFileVersionField = new JTextField();
+   protected final JLabel _txtProductVersionLabel = new JLabel();
+   protected final JTextField _txtProductVersionField = new JTextField();
+   protected final JLabel _productNameLabel = new JLabel();
+   protected final JTextField _productNameField = new JTextField();
+   protected final JLabel _originalFilenameLabel = new JLabel();
+   protected final JTextField _originalFilenameField = new JTextField();
+   protected final JLabel _internalNameLabel = new JLabel();
+   protected final JTextField _internalNameField = new JTextField();
+   protected final JLabel _companyNameLabel = new JLabel();
+   protected final JTextField _companyNameField = new JTextField();
+   protected final JTextArea _logTextArea = new JTextArea();
+   protected final TitledSeparator _logSeparator = new TitledSeparator();
+
+   /**
+    * Default constructor
+    */
+   public ConfigForm()
+   {
+      initializePanel();
+   }
+
+   /**
+    * Adds fill components to empty cells in the first row and first column of the grid.
+    * This ensures that the grid spacing will be the same as shown in the designer.
+    * @param cols an array of column indices in the first row where fill components should be added.
+    * @param rows an array of row indices in the first column where fill components should be added.
+    */
+   void addFillComponents( Container panel, int[] cols, int[] rows )
+   {
+      Dimension filler = new Dimension(10,10);
+
+      boolean filled_cell_11 = false;
+      CellConstraints cc = new CellConstraints();
+      if ( cols.length > 0 && rows.length > 0 )
+      {
+         if ( cols[0] == 1 && rows[0] == 1 )
+         {
+            /** add a rigid area  */
+            panel.add( Box.createRigidArea( filler ), cc.xy(1,1) );
+            filled_cell_11 = true;
+         }
+      }
+
+      for( int index = 0; index < cols.length; index++ )
+      {
+         if ( cols[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) );
+      }
+
+      for( int index = 0; index < rows.length; index++ )
+      {
+         if ( rows[index] == 1 && filled_cell_11 )
+         {
+            continue;
+         }
+         panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) );
+      }
+
+   }
+
+   /**
+    * Helper method to load an image file from the CLASSPATH
+    * @param imageName the package and name of the file to load relative to the CLASSPATH
+    * @return an ImageIcon instance with the specified image file
+    * @throws IllegalArgumentException if the image resource cannot be loaded.
+    */
+   public ImageIcon loadImage( String imageName )
+   {
+      try
+      {
+         ClassLoader classloader = getClass().getClassLoader();
+         java.net.URL url = classloader.getResource( imageName );
+         if ( url != null )
+         {
+            ImageIcon icon = new ImageIcon( url );
+            return icon;
+         }
+      }
+      catch( Exception e )
+      {
+         e.printStackTrace();
+      }
+      throw new IllegalArgumentException( "Unable to load image: " + imageName );
+   }
+
+   public JPanel createPanel()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE","CENTER:3DLU:NONE,FILL:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _tab.setName("tab");
+      _tab.addTab("Basic",null,createPanel1());
+      _tab.addTab("Header",null,createPanel2());
+      _tab.addTab("JRE",null,createPanel3());
+      _tab.addTab("Splash",null,createPanel5());
+      _tab.addTab("Version Info",null,createPanel6());
+      jpanel1.add(_tab,cc.xy(2,2));
+
+      _logTextArea.setName("logTextArea");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(_logTextArea);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xy(2,6));
+
+      _logSeparator.setName("logSeparator");
+      _logSeparator.setText("Log");
+      jpanel1.add(_logSeparator,cc.xy(2,4));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,2,3,4,5,6,7 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel1()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _outfileButton.setIcon(loadImage("images/open16.png"));
+      _outfileButton.setName("outfileButton");
+      jpanel1.add(_outfileButton,cc.xy(6,2));
+
+      _outfileLabel.setName("outfileLabel");
+      _outfileLabel.setText("<html><b>Output file</b></html>");
+      jpanel1.add(_outfileLabel,cc.xy(2,2));
+
+      _errorTitleLabel.setName("errorTitleLabel");
+      _errorTitleLabel.setText("Error title");
+      jpanel1.add(_errorTitleLabel,cc.xy(2,14));
+
+      _outfileField.setName("outfileField");
+      _outfileField.setToolTipText("Output executable file.");
+      jpanel1.add(_outfileField,cc.xy(4,2));
+
+      _errorTitleField.setName("errorTitleField");
+      _errorTitleField.setToolTipText("Launch4j signals errors using a message box, you can set it's title to the application's name.");
+      jpanel1.add(_errorTitleField,cc.xy(4,14));
+
+      _customProcNameCheck.setActionCommand("Custom process name");
+      _customProcNameCheck.setName("customProcNameCheck");
+      _customProcNameCheck.setText("Custom process name");
+      jpanel1.add(_customProcNameCheck,cc.xy(4,16));
+
+      _stayAliveCheck.setActionCommand("Stay alive after launching a GUI application");
+      _stayAliveCheck.setName("stayAliveCheck");
+      _stayAliveCheck.setText("Stay alive after launching a GUI application");
+      jpanel1.add(_stayAliveCheck,cc.xy(4,18));
+
+      _iconLabel.setName("iconLabel");
+      _iconLabel.setText("Icon");
+      jpanel1.add(_iconLabel,cc.xy(2,8));
+
+      _iconField.setName("iconField");
+      _iconField.setToolTipText("Application icon.");
+      jpanel1.add(_iconField,cc.xy(4,8));
+
+      _jarField.setName("jarField");
+      _jarField.setToolTipText("Application jar.");
+      jpanel1.add(_jarField,cc.xy(4,4));
+
+      _jarLabel.setName("jarLabel");
+      _jarLabel.setText("<html><b>Jar</b></html>");
+      jpanel1.add(_jarLabel,cc.xy(2,4));
+
+      _jarButton.setIcon(loadImage("images/open16.png"));
+      _jarButton.setName("jarButton");
+      jpanel1.add(_jarButton,cc.xy(6,4));
+
+      _iconButton.setIcon(loadImage("images/open16.png"));
+      _iconButton.setName("iconButton");
+      jpanel1.add(_iconButton,cc.xy(6,8));
+
+      _jarArgsLabel.setName("jarArgsLabel");
+      _jarArgsLabel.setText("Jar arguments");
+      jpanel1.add(_jarArgsLabel,cc.xy(2,12));
+
+      _jarArgsField.setName("jarArgsField");
+      _jarArgsField.setToolTipText("Constant command line arguments passed to the application.");
+      jpanel1.add(_jarArgsField,cc.xy(4,12));
+
+      _optionsLabel.setName("optionsLabel");
+      _optionsLabel.setText("Options");
+      jpanel1.add(_optionsLabel,cc.xy(2,16));
+
+      _chdirLabel.setName("chdirLabel");
+      _chdirLabel.setText("Change dir");
+      jpanel1.add(_chdirLabel,cc.xy(2,10));
+
+      _chdirField.setName("chdirField");
+      _chdirField.setToolTipText("Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location.");
+      jpanel1.add(_chdirField,cc.xy(4,10));
+
+      _dontWrapJarCheck.setActionCommand("Don't wrap the jar, launch it only");
+      _dontWrapJarCheck.setName("dontWrapJarCheck");
+      _dontWrapJarCheck.setText("Don't wrap the jar, launch only");
+      jpanel1.add(_dontWrapJarCheck,cc.xy(4,6));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel2()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(0.2),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _headerTypeLabel.setName("headerTypeLabel");
+      _headerTypeLabel.setText("Header type");
+      jpanel1.add(_headerTypeLabel,cc.xy(2,2));
+
+      _guiHeaderRadio.setActionCommand("GUI");
+      _guiHeaderRadio.setName("guiHeaderRadio");
+      _guiHeaderRadio.setText("GUI");
+      _headerButtonGroup.add(_guiHeaderRadio);
+      jpanel1.add(_guiHeaderRadio,cc.xy(4,2));
+
+      _consoleHeaderRadio.setActionCommand("Console");
+      _consoleHeaderRadio.setName("consoleHeaderRadio");
+      _consoleHeaderRadio.setText("Console");
+      _headerButtonGroup.add(_consoleHeaderRadio);
+      jpanel1.add(_consoleHeaderRadio,cc.xy(6,2));
+
+      _headerObjectsTextArea.setName("headerObjectsTextArea");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(_headerObjectsTextArea);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xywh(4,6,4,1));
+
+      _libsTextArea.setName("libsTextArea");
+      JScrollPane jscrollpane2 = new JScrollPane();
+      jscrollpane2.setViewportView(_libsTextArea);
+      jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane2,cc.xywh(4,8,4,1));
+
+      _headerObjectsCheck.setActionCommand("Object files");
+      _headerObjectsCheck.setName("headerObjectsCheck");
+      _headerObjectsCheck.setText("Object files");
+      jpanel1.add(_headerObjectsCheck,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP));
+
+      _libsCheck.setActionCommand("w32api");
+      _libsCheck.setName("libsCheck");
+      _libsCheck.setText("w32api");
+      jpanel1.add(_libsCheck,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP));
+
+      _linkerOptionsSeparator.setName("linkerOptionsSeparator");
+      _linkerOptionsSeparator.setText("Custom header - linker options");
+      jpanel1.add(_linkerOptionsSeparator,cc.xywh(2,4,6,1));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel3()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _jrePathLabel.setName("jrePathLabel");
+      _jrePathLabel.setText("<html><b>Emb. JRE path</b></html>");
+      jpanel1.add(_jrePathLabel,cc.xy(2,2));
+
+      _jreMinLabel.setName("jreMinLabel");
+      _jreMinLabel.setText("<html><b>Min JRE version</b></html>");
+      jpanel1.add(_jreMinLabel,cc.xy(2,4));
+
+      _jreMaxLabel.setName("jreMaxLabel");
+      _jreMaxLabel.setText("Max JRE version");
+      jpanel1.add(_jreMaxLabel,cc.xy(2,6));
+
+      _jvmArgsTextLabel.setName("jvmArgsTextLabel");
+      _jvmArgsTextLabel.setText("JVM arguments");
+      jpanel1.add(_jvmArgsTextLabel,new CellConstraints(2,12,1,1,CellConstraints.DEFAULT,CellConstraints.TOP));
+
+      _jrePathField.setName("jrePathField");
+      _jrePathField.setToolTipText("Embedded JRE path relative to the executable.");
+      jpanel1.add(_jrePathField,cc.xywh(4,2,4,1));
+
+      _jreMinField.setName("jreMinField");
+      jpanel1.add(_jreMinField,cc.xy(4,4));
+
+      _jreMaxField.setName("jreMaxField");
+      jpanel1.add(_jreMaxField,cc.xy(4,6));
+
+      _jvmArgsTextArea.setName("jvmArgsTextArea");
+      _jvmArgsTextArea.setToolTipText("Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options.");
+      JScrollPane jscrollpane1 = new JScrollPane();
+      jscrollpane1.setViewportView(_jvmArgsTextArea);
+      jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
+      jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+      jpanel1.add(jscrollpane1,cc.xywh(4,12,4,1));
+
+      _initialHeapSizeLabel.setName("initialHeapSizeLabel");
+      _initialHeapSizeLabel.setText("Initial heap size");
+      jpanel1.add(_initialHeapSizeLabel,cc.xy(2,8));
+
+      _maxHeapSizeLabel.setName("maxHeapSizeLabel");
+      _maxHeapSizeLabel.setText("Max heap size");
+      jpanel1.add(_maxHeapSizeLabel,cc.xy(2,10));
+
+      JLabel jlabel1 = new JLabel();
+      jlabel1.setText("MB");
+      jpanel1.add(jlabel1,cc.xy(6,8));
+
+      JLabel jlabel2 = new JLabel();
+      jlabel2.setText("MB");
+      jpanel1.add(jlabel2,cc.xy(6,10));
+
+      _initialHeapSizeField.setName("initialHeapSizeField");
+      jpanel1.add(_initialHeapSizeField,cc.xy(4,8));
+
+      _maxHeapSizeField.setName("maxHeapSizeField");
+      jpanel1.add(_maxHeapSizeField,cc.xy(4,10));
+
+      jpanel1.add(createPanel4(),cc.xywh(4,14,4,1));
+      _addVarsLabel.setName("addVarsLabel");
+      _addVarsLabel.setText("Add variables");
+      jpanel1.add(_addVarsLabel,cc.xy(2,14));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel4()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:60DLU:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _otherVarRadio.setActionCommand("Other");
+      _otherVarRadio.setName("otherVarRadio");
+      _otherVarRadio.setText("Other");
+      _buttongroup1.add(_otherVarRadio);
+      jpanel1.add(_otherVarRadio,cc.xy(5,1));
+
+      _otherVarField.setName("otherVarField");
+      jpanel1.add(_otherVarField,cc.xy(7,1));
+
+      _addVarButton.setActionCommand("Add");
+      _addVarButton.setIcon(loadImage("images/edit_add16.png"));
+      _addVarButton.setName("addVarButton");
+      _addVarButton.setText("Add");
+      jpanel1.add(_addVarButton,cc.xy(9,1));
+
+      _exeDirRadio.setActionCommand("%EXEPATH%");
+      _exeDirRadio.setName("exeDirRadio");
+      _exeDirRadio.setText("EXEDIR");
+      _buttongroup1.add(_exeDirRadio);
+      jpanel1.add(_exeDirRadio,cc.xy(1,1));
+
+      _exeFileRadio.setActionCommand("%EXEFILE%");
+      _exeFileRadio.setName("exeFileRadio");
+      _exeFileRadio.setText("EXEFILE");
+      _buttongroup1.add(_exeFileRadio);
+      jpanel1.add(_exeFileRadio,cc.xy(3,1));
+
+      addFillComponents(jpanel1,new int[]{ 2,4,6,8 },new int[0]);
+      return jpanel1;
+   }
+
+   public JPanel createPanel5()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _splashFileLabel.setName("splashFileLabel");
+      _splashFileLabel.setText("Splash file");
+      jpanel1.add(_splashFileLabel,cc.xy(2,4));
+
+      _waitForWindowLabel.setName("waitForWindowLabel");
+      _waitForWindowLabel.setText("Wait for window");
+      jpanel1.add(_waitForWindowLabel,cc.xy(2,6));
+
+      _timeoutLabel.setName("timeoutLabel");
+      _timeoutLabel.setText("Timeout [s]");
+      jpanel1.add(_timeoutLabel,cc.xy(2,8));
+
+      _timeoutErrCheck.setActionCommand("Signal error on timeout");
+      _timeoutErrCheck.setName("timeoutErrCheck");
+      _timeoutErrCheck.setText("Signal error on timeout");
+      _timeoutErrCheck.setToolTipText("True signals an error on splash timeout, false closes the splash screen quietly.");
+      jpanel1.add(_timeoutErrCheck,cc.xywh(4,10,2,1));
+
+      _splashFileField.setName("splashFileField");
+      _splashFileField.setToolTipText("Splash screen file in BMP format.");
+      jpanel1.add(_splashFileField,cc.xywh(4,4,2,1));
+
+      _timeoutField.setName("timeoutField");
+      _timeoutField.setToolTipText("Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property.");
+      jpanel1.add(_timeoutField,cc.xy(4,8));
+
+      _splashFileButton.setIcon(loadImage("images/open16.png"));
+      _splashFileButton.setName("splashFileButton");
+      jpanel1.add(_splashFileButton,cc.xy(7,4));
+
+      _splashCheck.setActionCommand("Enable splash screen");
+      _splashCheck.setName("splashCheck");
+      _splashCheck.setText("Enable splash screen");
+      jpanel1.add(_splashCheck,cc.xywh(4,2,2,1));
+
+      _waitForWindowCheck.setActionCommand("Close splash screen when an application window appears");
+      _waitForWindowCheck.setName("waitForWindowCheck");
+      _waitForWindowCheck.setText("Close splash screen when an application window appears");
+      jpanel1.add(_waitForWindowCheck,cc.xywh(4,6,2,1));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11 });
+      return jpanel1;
+   }
+
+   public JPanel createPanel6()
+   {
+      JPanel jpanel1 = new JPanel();
+      FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:7DLU:NONE,RIGHT:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE");
+      CellConstraints cc = new CellConstraints();
+      jpanel1.setLayout(formlayout1);
+
+      _versionInfoCheck.setActionCommand("Add version information");
+      _versionInfoCheck.setName("versionInfoCheck");
+      _versionInfoCheck.setText("Add version information");
+      jpanel1.add(_versionInfoCheck,cc.xywh(4,2,5,1));
+
+      _fileVersionLabel.setName("fileVersionLabel");
+      _fileVersionLabel.setText("File version");
+      jpanel1.add(_fileVersionLabel,cc.xy(2,4));
+
+      _fileVersionField.setName("fileVersionField");
+      _fileVersionField.setToolTipText("Version number 'x.x.x.x'");
+      jpanel1.add(_fileVersionField,cc.xy(4,4));
+
+      _addVersionInfoSeparator.setName("addVersionInfoSeparator");
+      _addVersionInfoSeparator.setText("Additional information");
+      jpanel1.add(_addVersionInfoSeparator,cc.xywh(2,10,7,1));
+
+      _productVersionLabel.setName("productVersionLabel");
+      _productVersionLabel.setText("Product version");
+      jpanel1.add(_productVersionLabel,cc.xy(2,12));
+
+      _productVersionField.setName("productVersionField");
+      _productVersionField.setToolTipText("Version number 'x.x.x.x'");
+      jpanel1.add(_productVersionField,cc.xy(4,12));
+
+      _fileDescriptionLabel.setName("fileDescriptionLabel");
+      _fileDescriptionLabel.setText("File description");
+      jpanel1.add(_fileDescriptionLabel,cc.xy(2,6));
+
+      _fileDescriptionField.setName("fileDescriptionField");
+      _fileDescriptionField.setToolTipText("File description presented to the user.");
+      jpanel1.add(_fileDescriptionField,cc.xywh(4,6,5,1));
+
+      _copyrightLabel.setName("copyrightLabel");
+      _copyrightLabel.setText("Copyright");
+      jpanel1.add(_copyrightLabel,cc.xy(2,8));
+
+      _copyrightField.setName("copyrightField");
+      jpanel1.add(_copyrightField,cc.xywh(4,8,5,1));
+
+      _txtFileVersionLabel.setName("txtFileVersionLabel");
+      _txtFileVersionLabel.setText("Free form");
+      jpanel1.add(_txtFileVersionLabel,cc.xy(6,4));
+
+      _txtFileVersionField.setName("txtFileVersionField");
+      _txtFileVersionField.setToolTipText("Free form file version, for example '1.20.RC1'.");
+      jpanel1.add(_txtFileVersionField,cc.xy(8,4));
+
+      _txtProductVersionLabel.setName("txtProductVersionLabel");
+      _txtProductVersionLabel.setText("Free form");
+      jpanel1.add(_txtProductVersionLabel,cc.xy(6,12));
+
+      _txtProductVersionField.setName("txtProductVersionField");
+      _txtProductVersionField.setToolTipText("Free form product version, for example '1.20.RC1'.");
+      jpanel1.add(_txtProductVersionField,cc.xy(8,12));
+
+      _productNameLabel.setName("productNameLabel");
+      _productNameLabel.setText("Product name");
+      jpanel1.add(_productNameLabel,cc.xy(2,14));
+
+      _productNameField.setName("productNameField");
+      jpanel1.add(_productNameField,cc.xywh(4,14,5,1));
+
+      _originalFilenameLabel.setName("originalFilenameLabel");
+      _originalFilenameLabel.setText("Original filename");
+      jpanel1.add(_originalFilenameLabel,cc.xy(2,20));
+
+      _originalFilenameField.setName("originalFilenameField");
+      _originalFilenameField.setToolTipText("Original name of the file without the path. Allows to determine whether a file has been renamed by a user.");
+      jpanel1.add(_originalFilenameField,cc.xywh(4,20,5,1));
+
+      _internalNameLabel.setName("internalNameLabel");
+      _internalNameLabel.setText("Internal name");
+      jpanel1.add(_internalNameLabel,cc.xy(2,18));
+
+      _internalNameField.setName("internalNameField");
+      _internalNameField.setToolTipText("Internal name without extension, original filename or module name for example.");
+      jpanel1.add(_internalNameField,cc.xywh(4,18,5,1));
+
+      _companyNameLabel.setName("companyNameLabel");
+      _companyNameLabel.setText("Company name");
+      jpanel1.add(_companyNameLabel,cc.xy(2,16));
+
+      _companyNameField.setName("companyNameField");
+      jpanel1.add(_companyNameField,cc.xywh(4,16,5,1));
+
+      addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 });
+      return jpanel1;
+   }
+
+   /**
+    * Initializer
+    */
+   protected void initializePanel()
+   {
+      setLayout(new BorderLayout());
+      add(createPanel(), BorderLayout.CENTER);
+   }
+
+
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java	(revision 15023)
@@ -0,0 +1,322 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on May 10, 2005
+ */
+package net.sf.launch4j.formimpl;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.JFileChooser;
+import javax.swing.JRadioButton;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import net.sf.launch4j.FileChooserFilter;
+import net.sf.launch4j.binding.Binding;
+import net.sf.launch4j.binding.Bindings;
+import net.sf.launch4j.binding.IValidatable;
+import net.sf.launch4j.binding.Validator;
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.ConfigPersister;
+import net.sf.launch4j.config.Splash;
+import net.sf.launch4j.config.VersionInfo;
+import net.sf.launch4j.form.ConfigForm;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class ConfigFormImpl extends ConfigForm {
+	private final JFileChooser _fileChooser = new JFileChooser();
+	private final Bindings _bindings = new Bindings();
+
+	public ConfigFormImpl() {
+		_tab.setTitleAt(0, Messages.getString("tab.basic"));
+		_tab.setTitleAt(1, Messages.getString("tab.header"));
+		_tab.setTitleAt(2, Messages.getString("tab.jre"));
+		_tab.setTitleAt(3, Messages.getString("tab.splash"));
+		_tab.setTitleAt(4, Messages.getString("tab.version"));
+
+		_logSeparator.setText(Messages.getString("log"));
+		_outfileLabel.setText(Messages.getString("outfile"));
+		_outfileField.setToolTipText(Messages.getString("outfileTip"));
+		_errorTitleLabel.setText(Messages.getString("errorTitle"));
+		_errorTitleField.setToolTipText(Messages.getString("errorTitleTip"));
+		_customProcNameCheck.setText(Messages.getString("customProcName"));
+		_stayAliveCheck.setText(Messages.getString("stayAlive"));
+		_iconLabel.setText(Messages.getString("icon"));
+		_iconField.setToolTipText(Messages.getString("iconTip"));
+		_jarLabel.setText(Messages.getString("jar"));
+		_jarField.setToolTipText(Messages.getString("jarTip"));
+		_dontWrapJarCheck.setText(Messages.getString("dontWrapJar"));
+		_jarArgsLabel.setText(Messages.getString("jarArgs"));
+		_jarArgsField.setToolTipText(Messages.getString("jarArgsTip"));
+		_optionsLabel.setText(Messages.getString("options"));
+		_chdirLabel.setText(Messages.getString("chdir"));
+		_chdirField.setToolTipText(Messages.getString("chdirTip"));
+
+		_headerTypeLabel.setText(Messages.getString("headerType"));
+		_guiHeaderRadio.setText(Messages.getString("gui"));
+		_consoleHeaderRadio.setText(Messages.getString("console"));
+		_headerObjectsCheck.setText(Messages.getString("objectFiles"));
+		_libsCheck.setText(Messages.getString("libs"));
+		_linkerOptionsSeparator.setText(Messages.getString("linkerOptions"));
+		_jrePathLabel.setText(Messages.getString("jrePath"));
+		_jrePathField.setToolTipText(Messages.getString("jrePathTip"));
+		_jreMinLabel.setText(Messages.getString("jreMin"));
+		_jreMaxLabel.setText(Messages.getString("jreMax"));
+		_jvmArgsTextLabel.setText(Messages.getString("jvmArgs"));
+		_jvmArgsTextArea.setToolTipText(Messages.getString("jvmArgsTip"));
+		_initialHeapSizeLabel.setText(Messages.getString("initialHeapSize"));
+		_maxHeapSizeLabel.setText(Messages.getString("maxHeapSize"));
+		_addVarsLabel.setText(Messages.getString("addVariables"));
+		_addVarsLabel.setToolTipText(Messages.getString("addVariablesTip"));
+		_exeDirRadio.setToolTipText(Messages.getString("exeDirVarTip"));
+		_exeFileRadio.setToolTipText(Messages.getString("exeFileVarTip"));
+		_otherVarRadio.setText(Messages.getString("other"));
+		_otherVarRadio.setToolTipText(Messages.getString("otherTip"));
+		_otherVarField.setToolTipText(Messages.getString("otherVarTip"));
+		_addVarButton.setText(Messages.getString("add"));
+		_addVarButton.setToolTipText(Messages.getString("addVariablesTip"));
+
+		_splashCheck.setText(Messages.getString("enableSplash"));
+		_splashFileLabel.setText(Messages.getString("splashFile"));
+		_splashFileField.setToolTipText(Messages.getString("splashFileTip"));
+		_waitForWindowLabel.setText(Messages.getString("waitForWindow"));
+		_waitForWindowCheck.setText(Messages.getString("waitForWindowText"));
+		_timeoutLabel.setText(Messages.getString("timeout"));
+		_timeoutField.setToolTipText(Messages.getString("timeoutTip"));
+		_timeoutErrCheck.setText(Messages.getString("timeoutErr"));
+		_timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip"));
+
+		_versionInfoCheck.setText(Messages.getString("addVersionInfo"));
+		_fileVersionLabel.setText(Messages.getString("fileVersion"));
+		_fileVersionField.setToolTipText(Messages.getString("fileVersionTip"));
+		_addVersionInfoSeparator.setText(Messages.getString("additionalInfo"));
+		_productVersionLabel.setText(Messages.getString("productVersion"));
+		_productVersionField.setToolTipText(Messages.getString("productVersionTip"));
+		_fileDescriptionLabel.setText(Messages.getString("fileDescription"));
+		_fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip"));
+		_copyrightLabel.setText(Messages.getString("copyright"));
+		_txtFileVersionLabel.setText(Messages.getString("txtFileVersion"));
+		_txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip"));
+		_txtProductVersionLabel.setText(Messages.getString("txtProductVersion"));
+		_txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip"));
+		_productNameLabel.setText(Messages.getString("productName"));
+		_originalFilenameLabel.setText(Messages.getString("originalFilename"));
+		_originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip"));
+		_internalNameLabel.setText(Messages.getString("internalName"));
+		_internalNameField.setToolTipText(Messages.getString("internalNameTip"));
+		_companyNameLabel.setText(Messages.getString("companyName"));
+
+		_dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener());
+
+		_outfileButton.addActionListener(new BrowseActionListener(
+				_outfileField, new FileChooserFilter("Windows executables (.exe)", ".exe")));
+		_jarButton.addActionListener(new BrowseActionListener(
+				_jarField, new FileChooserFilter("Jar files", ".jar")));
+		_iconButton.addActionListener(new BrowseActionListener(
+				_iconField, new FileChooserFilter("Icon files (.ico)", ".ico")));
+		_splashFileButton.addActionListener(new BrowseActionListener(
+				_splashFileField, new FileChooserFilter("Bitmap files (.bmp)", ".bmp")));
+
+		ActionListener al = new VariableActionListener();
+		_exeDirRadio.addActionListener(al);
+		_exeFileRadio.addActionListener(al);
+		_otherVarRadio.addActionListener(al);
+		_exeDirRadio.setSelected(true);
+		al.actionPerformed(null);
+		_addVarButton.addActionListener(new AddVariableActionListener());
+
+		_guiHeaderRadio.addChangeListener(new HeaderTypeChangeListener());
+		_headerObjectsCheck.addActionListener(new HeaderObjectsActionListener());
+		_libsCheck.addActionListener(new LibsActionListener());
+
+		_bindings.add("outfile", _outfileField)
+				.add("dontWrapJar", _dontWrapJarCheck)
+				.add("jar", _jarField)
+				.add("icon", _iconField)
+				.add("jarArgs", _jarArgsField)
+				.add("errTitle", _errorTitleField)
+				.add("chdir", _chdirField)
+				.add("customProcName", _customProcNameCheck)
+				.add("stayAlive", _stayAliveCheck)
+				.add("headerType", new JRadioButton[] {_guiHeaderRadio, _consoleHeaderRadio})
+				.add("headerObjects", "customHeaderObjects", _headerObjectsCheck, _headerObjectsTextArea)
+				.add("libs", "customLibs", _libsCheck, _libsTextArea)
+				.add("jre.path", _jrePathField)
+				.add("jre.minVersion", _jreMinField)
+				.add("jre.maxVersion", _jreMaxField)
+				.add("jre.initialHeapSize", _initialHeapSizeField)
+				.add("jre.maxHeapSize", _maxHeapSizeField)
+				.add("jre.args", _jvmArgsTextArea)
+				.addOptComponent("splash", Splash.class, _splashCheck)
+				.add("splash.file", _splashFileField)
+				.add("splash.waitForWindow", _waitForWindowCheck, true)
+				.add("splash.timeout", _timeoutField, "60")
+				.add("splash.timeoutErr", _timeoutErrCheck, true)
+				.addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck)
+				.add("versionInfo.fileVersion", _fileVersionField)
+				.add("versionInfo.productVersion", _productVersionField)
+				.add("versionInfo.fileDescription", _fileDescriptionField)
+				.add("versionInfo.internalName", _internalNameField)
+				.add("versionInfo.originalFilename", _originalFilenameField)
+				.add("versionInfo.productName", _productNameField)
+				.add("versionInfo.txtFileVersion", _txtFileVersionField)
+				.add("versionInfo.txtProductVersion", _txtProductVersionField)
+				.add("versionInfo.companyName", _companyNameField)
+				.add("versionInfo.copyright", _copyrightField);
+	}
+
+	private class DontWrapJarChangeListener implements ChangeListener {
+		public void stateChanged(ChangeEvent e) {
+			boolean dontWrap = _dontWrapJarCheck.isSelected();
+			_jarLabel.setText(dontWrap ? Messages.getString("jarPath")
+					: Messages.getString("jar"));
+			_jarField.setToolTipText(dontWrap ? Messages.getString("jarPathTip")
+					: Messages.getString("jarTip"));
+			_jarButton.setEnabled(!dontWrap);
+		}
+	}
+
+	private class BrowseActionListener implements ActionListener {
+		private final JTextField _field;
+		private final FileChooserFilter _filter;
+
+		public BrowseActionListener(JTextField field, FileChooserFilter filter) {
+			_field = field;
+			_filter = filter;
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			if (!_field.isEnabled()) {
+				return;
+			}
+			_fileChooser.setFileFilter(_filter);
+			_fileChooser.setSelectedFile(new File(""));
+			int result = _field.equals(_outfileField)
+					? _fileChooser.showSaveDialog(MainFrame.getInstance())
+					: _fileChooser.showOpenDialog(MainFrame.getInstance());
+			if (result == JFileChooser.APPROVE_OPTION) {
+				_field.setText(_fileChooser.getSelectedFile().getPath());
+			}
+		}
+	}
+	
+	private class HeaderTypeChangeListener implements ChangeListener {
+		public void stateChanged(ChangeEvent e) {
+			Config c = ConfigPersister.getInstance().getConfig();
+			c.setHeaderType(_guiHeaderRadio.isSelected() ? Config.GUI_HEADER : Config.CONSOLE_HEADER);
+			if (!_headerObjectsCheck.isSelected()) {
+				Binding b = getBinding("headerObjects");
+				b.put(c);
+			}
+		}
+	}
+	
+	private class HeaderObjectsActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			if (!_headerObjectsCheck.isSelected()) {
+				ConfigPersister.getInstance().getConfig().setHeaderObjects(null);
+				Binding b = getBinding("headerObjects");
+				b.put(ConfigPersister.getInstance().getConfig());
+			}
+		}
+	}
+
+	private class LibsActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			if (!_libsCheck.isSelected()) {
+				ConfigPersister.getInstance().getConfig().setLibs(null);
+				Binding b = getBinding("libs");
+				b.put(ConfigPersister.getInstance().getConfig());
+			}
+		}
+	}
+	
+	private class VariableActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			_otherVarField.setEnabled(_otherVarRadio.isSelected());
+		}
+	}
+	
+	private class AddVariableActionListener implements ActionListener {
+		private final Color _validColor = _otherVarField.getBackground();
+
+		public void actionPerformed(ActionEvent e) {
+			final int pos = _jvmArgsTextArea.getCaretPosition();
+			if (_exeDirRadio.isSelected()) {
+				_jvmArgsTextArea.insert("-Dlaunch4j.exedir=\"%EXEDIR%\"\n", pos);
+			} else if (_exeFileRadio.isSelected()) {
+				_jvmArgsTextArea.insert("-Dlaunch4j.exefile=\"%EXEFILE%\"\n", pos);
+			} else {
+				final String var = _otherVarField.getText()
+						.replaceAll("\"", "")
+						.replaceAll("%", "");
+				if (Validator.isEmpty(var)) {
+					signalViolation("specifyVar");
+					return;
+				}
+				final String prop = var.replaceAll(" ", ".")
+						.replaceAll("_", ".")
+						.toLowerCase();
+				_jvmArgsTextArea.insert("-Denv." + prop + "=\"%" + var + "%\"\n", pos);
+			}
+		}
+		
+		private void signalViolation(String code) {
+			_otherVarField.setBackground(Binding.INVALID_COLOR);
+			MainFrame.getInstance().warn(Messages.getString(code));
+			_otherVarField.setBackground(_validColor);
+			_otherVarField.requestFocusInWindow();
+		}
+	}
+
+	public void clear(IValidatable bean) {
+		_bindings.clear(bean);
+	}
+
+	public void put(IValidatable bean) {
+		_bindings.put(bean);
+	}
+
+	public void get(IValidatable bean) {
+		_bindings.get(bean);
+	}
+	
+	public boolean isModified() {
+		return _bindings.isModified();
+	}
+	
+	public JTextArea getLogTextArea() {
+		return _logTextArea;
+	}
+	
+	public Binding getBinding(String property) {
+		return _bindings.getBinding(property);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/GlassPane.java	(revision 15023)
@@ -0,0 +1,67 @@
+package net.sf.launch4j.formimpl;
+
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.AWTEventListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+
+/**
+ * This is the glass pane class that intercepts screen interactions during
+ * system busy states.
+ * 
+ * Based on JavaWorld article by Yexin Chen.
+ */
+public class GlassPane extends JComponent implements AWTEventListener {
+	private final Window _window;
+
+	public GlassPane(Window w) {
+		_window = w;
+		addMouseListener(new MouseAdapter() {});
+		addKeyListener(new KeyAdapter() {});
+		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+	}
+
+	/**
+	 * Receives all key events in the AWT and processes the ones that originated
+	 * from the current window with the glass pane.
+	 * 
+	 * @param event
+	 *            the AWTEvent that was fired
+	 */
+	public void eventDispatched(AWTEvent event) {
+		Object source = event.getSource();
+		if (event instanceof KeyEvent
+				&& source instanceof Component) {
+			/*
+			 * If the event originated from the window w/glass pane,
+			 * consume the event.
+			 */
+			if ((SwingUtilities.windowForComponent((Component) source) == _window)) {
+				((KeyEvent) event).consume();
+			}
+		}
+	}
+
+	/**
+	 * Sets the glass pane as visible or invisible. The mouse cursor will be set
+	 * accordingly.
+	 */
+	public void setVisible(boolean visible) {
+		if (visible) {
+			// Start receiving all events and consume them if necessary
+			Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
+		} else {
+			// Stop receiving all events
+			Toolkit.getDefaultToolkit().removeAWTEventListener(this);
+		}
+		super.setVisible(visible);
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java	(revision 15023)
@@ -0,0 +1,346 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/*
+ * Created on 2005-05-09
+ */
+package net.sf.launch4j.formimpl;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JToolBar;
+import javax.swing.UIManager;
+
+import com.jgoodies.plaf.Options;
+import com.jgoodies.plaf.plastic.PlasticXPLookAndFeel;
+
+import foxtrot.Task;
+import foxtrot.Worker;
+
+import net.sf.launch4j.Builder;
+import net.sf.launch4j.BuilderException;
+import net.sf.launch4j.ExecException;
+import net.sf.launch4j.FileChooserFilter;
+import net.sf.launch4j.Log;
+import net.sf.launch4j.Main;
+import net.sf.launch4j.Util;
+import net.sf.launch4j.binding.BindingException;
+import net.sf.launch4j.binding.InvariantViolationException;
+import net.sf.launch4j.config.Config;
+import net.sf.launch4j.config.ConfigPersister;
+import net.sf.launch4j.config.ConfigPersisterException;
+
+/**
+ * @author Copyright (C) 2005 Grzegorz Kowal
+ */
+public class MainFrame extends JFrame {
+	private static MainFrame _instance;
+
+	private final JToolBar _toolBar;
+	private final JButton _runButton;
+	private final ConfigFormImpl _configForm;
+	private final JFileChooser _fileChooser = new JFileChooser();
+	private File _outfile;
+	private boolean _saved = false;
+
+	public static void createInstance() {
+		try {
+			Toolkit.getDefaultToolkit().setDynamicLayout(true);
+			System.setProperty("sun.awt.noerasebackground","true"); //$NON-NLS-1$ //$NON-NLS-2$
+	
+			// JGoodies
+			Options.setDefaultIconSize(new Dimension(16, 16));		// menu icons
+			Options.setUseNarrowButtons(false);
+			Options.setPopupDropShadowEnabled(true);
+
+			UIManager.setLookAndFeel(new PlasticXPLookAndFeel());
+			_instance = new MainFrame();
+		} catch (Exception e) {
+			System.err.println(e);
+		}
+	}
+
+	public static MainFrame getInstance() {
+		return _instance;
+	}
+
+	public MainFrame() {
+		showConfigName(null);
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		addWindowListener(new MainFrameListener());
+		setGlassPane(new GlassPane(this));
+		_fileChooser.setFileFilter(new FileChooserFilter(
+				Messages.getString("MainFrame.config.files"), //$NON-NLS-1$
+				new String[] {".xml", ".cfg"})); //$NON-NLS-1$ //$NON-NLS-2$
+
+		_toolBar = new JToolBar();
+		_toolBar.setFloatable(false);
+		_toolBar.setRollover(true);
+		addButton("images/new.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.new.config"), //$NON-NLS-1$
+				new NewActionListener());
+		addButton("images/open.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.open.config"), //$NON-NLS-1$
+				new OpenActionListener());
+		addButton("images/save.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.save.config"), //$NON-NLS-1$
+				new SaveActionListener());
+		_toolBar.addSeparator();
+		addButton("images/build.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.build.wrapper"), //$NON-NLS-1$
+				new BuildActionListener());
+		_runButton = addButton("images/run.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.test.wrapper"), //$NON-NLS-1$
+				new RunActionListener());
+		setRunEnabled(false);
+		_toolBar.addSeparator();
+		addButton("images/info.png", //$NON-NLS-1$
+				Messages.getString("MainFrame.about.launch4j"), //$NON-NLS-1$
+				new AboutActionListener());
+
+		_configForm = new ConfigFormImpl();
+		getContentPane().setLayout(new BorderLayout());
+		getContentPane().add(_toolBar, BorderLayout.NORTH);
+		getContentPane().add(_configForm, BorderLayout.CENTER);
+		pack();
+		Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();
+		Dimension fr = getSize();
+		fr.height += 100;
+		setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2,
+				fr.width, fr.height);
+		setVisible(true);
+	}
+
+	private JButton addButton(String iconPath, String tooltip, ActionListener l) {
+		ImageIcon icon = new ImageIcon(MainFrame.class.getClassLoader().getResource(iconPath));
+		JButton b = new JButton(icon);
+		b.setToolTipText(tooltip);
+		b.addActionListener(l);
+		_toolBar.add(b);
+		return b;
+	}
+	
+	public void info(String text) {
+		JOptionPane.showMessageDialog(this, 
+									text,
+									Main.PROGRAM_NAME,
+									JOptionPane.INFORMATION_MESSAGE);
+	}
+
+	public void warn(String text) {
+		JOptionPane.showMessageDialog(this, 
+									text,
+									Main.PROGRAM_NAME,
+									JOptionPane.WARNING_MESSAGE);
+	}
+
+	public void warn(InvariantViolationException e) {
+		e.getBinding().markInvalid();
+		warn(e.getMessage());
+		e.getBinding().markValid();
+	}
+
+	private boolean isModified() {
+		return (!_configForm.isModified())
+				|| JOptionPane.showConfirmDialog(MainFrame.this,
+						Messages.getString("MainFrame.discard.changes"), //$NON-NLS-1$
+						Messages.getString("MainFrame.confirm"), //$NON-NLS-1$
+						JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
+	}
+	
+	private boolean save() {
+		// XXX
+		try {
+			_configForm.get(ConfigPersister.getInstance().getConfig());
+			if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) {
+				File f = _fileChooser.getSelectedFile();
+				if (!f.getPath().endsWith(".xml")) { //$NON-NLS-1$
+					f = new File(f.getPath() + ".xml"); //$NON-NLS-1$
+				}
+				ConfigPersister.getInstance().save(f);
+				_saved = true;
+				showConfigName(f);
+				return true;
+			}
+			return false;
+		} catch (InvariantViolationException ex) {
+			warn(ex);
+			return false;
+		} catch (BindingException ex) {
+			warn(ex.getMessage());
+			return false;
+		} catch (ConfigPersisterException ex) {
+			warn(ex.getMessage());
+			return false;
+		}
+	}
+
+	private void showConfigName(File config) {
+		setTitle(Main.PROGRAM_NAME + " - " //$NON-NLS-1$
+				+ (config != null ? config.getName()
+						: Messages.getString("MainFrame.untitled")));  //$NON-NLS-1$
+	}
+
+	private void setRunEnabled(boolean enabled) {
+		if (!enabled) {
+			_outfile = null;
+		}
+		_runButton.setEnabled(enabled);
+	}
+
+	private void clearConfig() {
+		ConfigPersister.getInstance().createBlank();
+		_configForm.clear(ConfigPersister.getInstance().getConfig());
+	}
+
+	private class MainFrameListener extends WindowAdapter {
+		public void windowOpened(WindowEvent e) {
+			clearConfig();
+		}
+
+		public void windowClosing(WindowEvent e) {
+			if (isModified()) {
+				System.exit(0);
+			}
+		}
+	}
+
+	private class NewActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			if (isModified()) {
+				clearConfig();
+			}
+			_saved = false;
+			showConfigName(null);
+			setRunEnabled(false);
+		}
+	}
+
+	private class OpenActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			try {
+				if (isModified()
+						&& _fileChooser.showOpenDialog(MainFrame.this) == JOptionPane.YES_OPTION) {
+					final File f = _fileChooser.getSelectedFile(); 
+					if (f.getPath().endsWith(".xml")) { //$NON-NLS-1$
+						ConfigPersister.getInstance().load(f);	
+						_saved = true;
+					} else {
+						ConfigPersister.getInstance().loadVersion1(f);
+						_saved = false;
+					}
+					_configForm.put(ConfigPersister.getInstance().getConfig());
+					showConfigName(f);
+					setRunEnabled(false);
+				}
+			} catch (ConfigPersisterException ex) {
+				warn(ex.getMessage());
+			}
+		}
+	}
+	
+	private class SaveActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			save();
+		}
+	}
+	
+	private class BuildActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			final Log log = Log.getSwingLog(_configForm.getLogTextArea());
+			try {
+				if ((!_saved || _configForm.isModified())
+						&& !save()) {
+					return;
+				}
+				log.clear();
+				ConfigPersister.getInstance().getConfig().checkInvariants();
+				Builder b = new Builder(log);
+				_outfile = b.build();
+				setRunEnabled(ConfigPersister.getInstance().getConfig()
+						.getHeaderType() == Config.GUI_HEADER	// TODO fix console app test
+						&& (Util.WINDOWS_OS || !ConfigPersister.getInstance()
+												.getConfig().isDontWrapJar()));
+			} catch (InvariantViolationException ex) {
+				setRunEnabled(false);
+				ex.setBinding(_configForm.getBinding(ex.getProperty()));	// XXX
+				warn(ex);
+			} catch (BuilderException ex) {
+				setRunEnabled(false);
+				log.append(ex.getMessage());
+			}
+		}
+	}
+	
+	private class RunActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			try {
+				getGlassPane().setVisible(true);
+				Worker.post(new Task() {
+					public Object run() throws ExecException {
+						Log log = Log.getSwingLog(_configForm.getLogTextArea());
+						log.clear();
+						String path = _outfile.getPath();
+						if (Util.WINDOWS_OS) {
+							log.append(Messages.getString("MainFrame.executing") + path); //$NON-NLS-1$
+							Util.exec(path, log);
+						} else {
+							log.append(Messages.getString("MainFrame.jar.integrity.test") + path); //$NON-NLS-1$
+							Util.exec("java -jar " + path, log); //$NON-NLS-1$
+						}
+						return null;
+					}
+				});
+			} catch (Exception ex) {
+				// XXX errors logged by exec
+			} finally {
+				getGlassPane().setVisible(false);
+			}
+		};
+	}
+
+	private class AboutActionListener implements ActionListener {
+		public void actionPerformed(ActionEvent e) {
+			info(Main.PROGRAM_DESCRIPTION
+					+ "The following projects are used by launch4j...\n\n" //$NON-NLS-1$
+					+ "MinGW binutils (http://www.mingw.org/)\n" //$NON-NLS-1$
+					+ "Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)\n" //$NON-NLS-1$
+					+ "Commons Logging (http://jakarta.apache.org/commons/logging/)\n" //$NON-NLS-1$
+					+ "XStream (http://xstream.codehaus.org/)\n" //$NON-NLS-1$
+					+ "JGoodies Forms (http://www.jgoodies.com/freeware/forms/)\n" //$NON-NLS-1$
+					+ "JGoodies Looks (http://www.jgoodies.com/freeware/looks/)\n" //$NON-NLS-1$
+					+ "Foxtrot (http://foxtrot.sourceforge.net/)\n" //$NON-NLS-1$
+					+ "Nuvola Icon Theme (http://www.icon-king.com)"); //$NON-NLS-1$
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/Messages.java
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/Messages.java	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/Messages.java	(revision 15023)
@@ -0,0 +1,44 @@
+/*
+	Launch4j (http://launch4j.sourceforge.net/)
+	Cross-platform Java application wrapper for creating Windows native executables.
+
+	Copyright (C) 2004, 2006 Grzegorz Kowal
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation; either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+package net.sf.launch4j.formimpl;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+	private static final String BUNDLE_NAME = "net.sf.launch4j.formimpl.messages"; //$NON-NLS-1$
+
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+			.getBundle(BUNDLE_NAME);
+
+	private Messages() {
+	}
+
+	public static String getString(String key) {
+		// TODO Auto-generated method stub
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages.properties	(revision 15023)
@@ -0,0 +1,111 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+tab.basic=Basic
+tab.header=Header
+tab.jre=JRE
+tab.splash=Splash
+tab.version=Version Info
+
+log=Log
+outfile=<html><b>Output file</b></html>
+outfileTip=Output executable file.
+errorTitle=Error title
+errorTitleTip=Launch4j signals errors using a message box, you can set it's title to the application's name.
+customProcName=Custom process name
+stayAlive=Stay alive after launching a GUI application
+icon=Icon
+iconTip=Application icon.
+jar=<html><b>Jar</b></html>
+jarPath=<html><b>Jar runtime path</b></html>
+jarTip=Application jar.
+jarPathTip=Runtime path of the jar relative to the executable. For example, if the executable launcher and the application jar named calc.exe and calc.jar are in the same directory, it would be: calc.jar.
+dontWrapJar=Dont't wrap the jar, launch only
+jarArgs=Jar arguments
+jarArgsTip=Constant command line arguments passed to the application.
+options=Options
+chdir=Change dir
+chdirTip=Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location.
+
+headerType=Header type
+gui=GUI
+console=Console
+objectFiles=Object files
+libs=w32api
+linkerOptions=Custom header - linker options
+jrePath=<html><b>Emb. JRE path</b></html>
+jrePathTip=Embedded JRE path relative to the executable or absolute.
+jreMin=<html><b>Min JRE version</b></html>
+jreMax=Max JRE version
+jvmArgs=JVM arguments
+jvmArgsTip=Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options.
+initialHeapSize=Initial heap size
+maxHeapSize=Max heap size
+addVariables=Add variables
+addVariablesTip=Add special variable or map environment variables to system properties.
+exeDirVarTip=Executable's runtime directory path.
+exeFileVarTip=Executable's runtime file path (directory and filename).
+other=Other
+otherTip=Map an environment variable to a system property.
+otherVarTip=Environment variable to map.
+add=Add
+specifyVar=Specify environment variable to add.
+
+enableSplash=Enable splash screen
+splashFile=Splash file
+splashFileTip=Splash screen file in BMP format.
+waitForWindow=Wait for window
+waitForWindowText=Close splash screen when an application window appears
+timeout=Timeout [s]
+timeoutTip=Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property.
+timeoutErr=Signal error on timeout
+timeoutErrTip=True signals an error on splash timeout, false closes the splash screen quietly.
+
+addVersionInfo=Add version information
+fileVersion=File version
+fileVersionTip=Version number 'x.x.x.x'
+additionalInfo=Additional information
+productVersion=Product version
+productVersionTip=Version number 'x.x.x.x'
+fileDescription=File description
+fileDescriptionTip=File description presented to the user.
+copyright=Copyright
+txtFileVersion=Free form
+txtFileVersionTip=Free form file version, for example '1.20.RC1'.
+txtProductVersion=Free form
+txtProductVersionTip=Free form product version, for example '1.20.RC1'.
+productName=Product name
+originalFilename=Original filename
+originalFilenameTip=Original name of the file without the path. Allows to determine whether a file has been renamed by a user.
+internalName=Internal name
+internalNameTip=Internal name without extension, original filename or module name for example.
+companyName=Company name
+
+MainFrame.config.files=launch4j config files (.xml, .cfg)
+MainFrame.new.config=New configuration
+MainFrame.open.config=Open configuration or import 1.x
+MainFrame.save.config=Save configuration
+MainFrame.build.wrapper=Build wrapper
+MainFrame.test.wrapper=Test wrapper
+MainFrame.about.launch4j=About launch4j
+MainFrame.discard.changes=Discard changes?
+MainFrame.confirm=Confirm
+MainFrame.untitled=untitled
+MainFrame.executing=Executing: 
+MainFrame.jar.integrity.test=Jar integrity test, executing: 
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties	(revision 15023)
@@ -0,0 +1,105 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+# 	Spanish translation (C) 2005 Patricio Martínez Ros
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+tab.basic = B\u00E1sico
+tab.header = Cabecera
+tab.jre = JRE
+tab.splash = Pantalla de bienvenida
+tab.version = Informaci\u00F3n de la versi\u00F3n
+log = Registro
+outfile = <html><b>Fichero de salida</b></html>
+outfileTip = Fichero ejecutable de salida.
+errorTitle = T\u00EDtulo de error
+errorTitleTip = Launch4j indica los errores usando una ventana de mensaje, usted puede ponerle el nombre de la aplicaci\u00F3n a esta ventana.
+customProcName = Nombre personalizado del proceso
+stayAlive = Mantener abierto despu\u00E9s de lanzar una aplicaci\u00F3n GUI
+icon = Icono
+iconTip = Icono de la aplicaci\u00F3n.
+jar = <html><b>Jar</b></html>
+jarPath = <html><b>Ruta del jar</b></html>
+jarTip = Jar de la aplicaci\u00F3n.
+jarPathTip = Ruta del jar relativa al ejecutable. Por ejemplo, si el lanzador ejecutable y el jar de la aplicaci\u00F3n, llamados calc.exe y calc.jar respectivamente, est\u00E1n en el mismo directorio, ser\u00EDa\: calc.jar.
+dontWrapJar = No empaquetar el jar, s\u00F3lo lanzar
+jarArgs = Argumentos del jar
+jarArgsTip = Argumentos de l\u00EDnea de \u00F3rdenes pasados a la aplicaci\u00F3n.
+options = Opciones
+chdir = Cambiar al directorio
+chdirTip = Cambia el directorio actual a la localizaci\u00F3n relativa al ejecutable. Si el campo se deja vac\u00EDo, no tiene efecto, . - cambia el directorio a la localizaci\u00F3n del exe.
+headerType = Tipo de cabecera
+gui = GUI
+console = Consola
+objectFiles = Ficheros objeto
+libs = w32api
+linkerOptions = Cabecera personalizada - opciones del enlazador
+jrePath = <html><b>Ruta del JRE</b></html>
+jrePathTip = Ruta relativa al ejecutable del JRE.
+jreMin = <html><b>Versi\u00F3n m\u00EDnima del JRE</b></html>
+jreMax = Versi\u00F3n m\u00E1xima del JRE
+jvmArgs = Argumentos de la JVM
+jvmArgsTip = Acepta cualquier argumento que normalmente se le pasar\u00EDa al lanzador java/javaw\: opciones assertion, propiedades de sistema y opciones X.
+initialHeapSize = Tama\u00F1o inicial de la pila
+maxHeapSize = Tama\u00F1o m\u00E1ximo de la pila
+addVariables = A\u00F1adir variables
+addVariablesTip = A\u00F1adir una variable especial o mapear variables de entorno a las propiedades del sistema.
+exeDirVarTip = Ruta del directorio del ejecutable.
+exeFileVarTip = Ruta del fichero ejecutable (directorio y nombre del fichero).
+other = Otra
+otherTip = Mapear una variable de entorno a una propiedad del sistema.
+otherVarTip = Variable de entorno que mapear.
+add = A\u00F1adir
+specifyVar = Especificar variable de entorno que a\u00F1adir.
+enableSplash = Activar pantalla de bienvenida
+splashFile = Imagen
+splashFileTip = Imagen en formato BMP para la pantalla de bienvenida.
+waitForWindow = Esperar la ventana
+waitForWindowText = Cerrar la pantalla de bienvenida cuando aparezca una ventana de la aplicaci\u00F3n
+timeout = Tiempo de espera [s]
+timeoutTip = Numero de segundos despu\u00E9s de los que la pantalla de bienvenida se debe cerrar. Esta propiedad puede causar provocar un error dependiendo de la propiedad splashTimeoutErr.
+timeoutErr = Se\u00F1al de error asociada al tiempo de espera
+timeoutErrTip = Marcado (true) se\u00F1ala un error despu\u00E9s del tiempo de espera de la pantalla de bienvenida, no marcado (false) cierra la pantalla de bienvenida silenciosamente
+addVersionInfo = A\u00F1ade informaci\u00F3n sobre la versi\u00F3n
+fileVersion = Versi\u00F3n del fichero
+fileVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x'
+additionalInfo = Informaci\u00F3n adicional
+productVersion = Versi\u00F3n del producto
+productVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x'
+fileDescription = Descripci\u00F3n del fichero
+fileDescriptionTip = Descripci\u00F3n del fichero que se le muestra al usuario.
+copyright = Copyright
+txtFileVersion = Forma libre
+txtFileVersionTip = Forma libre de versi\u00F3n, por ejemplo '1.20.RC1'.
+txtProductVersion = Forma libre
+txtProductVersionTip = Forma libre del producto, por ejemplo '1.20.RC1'.
+productName = Nombre del producto
+originalFilename = Nombre original del fichero
+originalFilenameTip = Nombre original del fichero sin la ruta. Permite determinar si un fichero ha sido renombrado por un usuario.
+internalName = Nombre interno
+internalNameTip = Nombre interno sin extensi\u00F3n, el nombre original del fichero o el m\u00F3dulo, por ejemplo.
+companyName = Nombre de la organizaci\u00F3n
+MainFrame.config.files = Ficheros de configuraci\u00F3n de launch4j (.xml, .cfg)
+MainFrame.new.config = Nueva configuraci\u00F3n
+MainFrame.open.config = Abrir configuraci\u00F3n o importar 1.x
+MainFrame.save.config = Guardar configuraci\u00F3n
+MainFrame.build.wrapper = Construir el empaquetador
+MainFrame.test.wrapper = Comprobar el empaquetador
+MainFrame.about.launch4j = Acerca de launch4j
+MainFrame.discard.changes = \u00BFDescartar cambios?
+MainFrame.confirm = Confirmar
+MainFrame.untitled = Sin nombre
+MainFrame.executing = Ejecutando\: 
+MainFrame.jar.integrity.test = Prueba de integridad jar, ejecutando\: 
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages.properties	(revision 15023)
@@ -0,0 +1,29 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+Main.usage=usage
+
+Builder.compiling.resources=Compiling resources
+Builder.linking=Linking
+Builder.wrapping=Wrapping
+Builder.success=Successfully created 
+Builder.generated.resource.file=Generated resource file...\n
+
+Util.exec.failed=Exec failed
+Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. 
Index: /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages_es.properties
===================================================================
--- /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages_es.properties	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/src/net/sf/launch4j/messages_es.properties	(revision 15023)
@@ -0,0 +1,28 @@
+#
+# 	launch4j :: Cross-platform Java application wrapper for creating Windows native executables
+# 	Copyright (C) 2005 Grzegorz Kowal
+#
+# 	This program is free software; you can redistribute it and/or modify
+# 	it under the terms of the GNU General Public License as published by
+# 	the Free Software Foundation; either version 2 of the License, or
+# 	(at your option) any later version.
+#
+# 	This program is distributed in the hope that it will be useful,
+# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
+# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# 	GNU General Public License for more details.
+#
+# 	You should have received a copy of the GNU General Public License
+# 	along with this program; if not, write to the Free Software
+# 	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+Main.usage=Uso
+
+Builder.compiling.resources=Compilando recursos
+Builder.linking=Enlazando
+Builder.wrapping=Empaquetando
+Builder.success=Creado con \ufffdxito 
+Builder.generated.resource.file=Fichero de recursos generado...\n
+
+Util.exec.failed=Fallo en la ejecuci\ufffd
Index: /release-kits/wirk3/bin/launch4j/w32api/MinGW.LICENSE.txt
===================================================================
--- /release-kits/wirk3/bin/launch4j/w32api/MinGW.LICENSE.txt	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/w32api/MinGW.LICENSE.txt	(revision 15023)
@@ -0,0 +1,25 @@
+MinGW - Licensing Terms
+
+Various pieces distributed with MinGW come with its own copyright and license:
+
+Basic MinGW runtime
+    MinGW base runtime package is uncopyrighted and placed in the public domain.
+    This basically means that you can do what you want with the code.
+
+w32api
+    You are free to use, modify and copy this package.
+    No restrictions are imposed on programs or object files compiled with this library.
+    You may not restrict the the usage of this library.
+    You may distribute this library as part of another package or as a modified package
+    if and only if you do not restrict the usage of the portions consisting
+    of this (optionally modified) library.
+    If distributed as a modified package then this file must be included.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+MinGW profiling code
+    MinGW profiling code is distributed under the GNU General Public License. 
+
+The development tools such as GCC, GDB, GNU Make, etc all covered by GNU General Public License.
Index: /release-kits/wirk3/bin/launch4j/web/changelog.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/changelog.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/changelog.html	(revision 15023)
@@ -0,0 +1,257 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Cross-platform Java executable wrapper</title>
+		<meta name="description" content="Cross-platform Java executable wrapper for creating lightweight Windows native EXEs. Provides better user experience.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index.html">Home</a></li>
+					<li><a href="docs.html">Docs</a></li>
+					<li><a href="changelog.html">Changelog</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Screenshots</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Download</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Support</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Project summary</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Bug tracker</a></li>
+					<li><a href="links.html">Links</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2>Changelog</h2>
+
+<h4>Changes in version 2.1.5 (19-07-2006)</h4>
+<ul class="changes">
+	<li>Changed the Java download site to http://java.com/download.</li>
+	<li>Now it's possible to use absolute and relative paths to specify the embedded JRE.</li>
+</ul>
+
+<h4>Changes in version 2.1.4 (15-06-2006)</h4>
+<ul class="changes">
+	<li>
+		Fixed bug #1503996 Only the first wrapper instance had a custom process name
+		(found by Helge BÃ¶hme).
+	</li>
+</ul>
+
+<h4>Changes in version 2.1.3 (31-05-2006)</h4>
+<ul class="changes">
+	<li>
+		Fixed bug #1497453 Ant task doesn't support relative jar path with '..'
+		(found by Aston, Pavel Moukhataev).
+	</li>
+	<li>Jar argument size limit is now 16KB.</li>
+	<li>Environment variable size limit raised to 32KB.</li>
+	<li>Allow to concatenate multiple env. variables in one property (Maria D.)</li>
+	<li>Added launch4j.tmpdir property.</li>
+</ul>
+
+<h4>Changes in version 2.1.2 (03-04-2006)</h4>
+<ul class="changes">
+	<li>Important bugfix: insufficient command line buffer size was increased to 32KB
+	(found by Sebastian Kopsan).</li>
+	<li>Added runtime JVM options from an .ini file.</li>
+	<li>Launch4j's bin directory is now configurable through launch4j.bindir
+	system property.</li>
+</ul>
+
+<h4>Changes in version 2.1.1 (25-01-2006)</h4>
+<ul class="changes">
+	<li>Fixed bug #1402748. Validation error occurred when using an Ant task with
+		embedded config and dontWrapJar option (found by Chris Nokleberg).</li>
+</ul>
+
+<h4>Changes in version 2.1.0 (10-01-2006)</h4>
+<ul class="changes">
+	<li><b>More features and smaller header: 18 KB!!</b></li>
+	<li>Added launcher mode, you can choose whether or not to wrap the jar.</li>
+	<li>Spanish translation of the website/docs and program messages
+		(Patricio MartÃ­nez Ros).</li>
+	<li>JRE's bin directory is appended to the Path environment variable
+		(Ianiv Schweber).</li>
+	<li>Added special variables EXEDIR and EXEFILE that hold the executable's
+		directory and full path.</li>
+	<li>Support for mapping environment variables to system properties.</li>
+	<li>Added debug launching mode - various information is displayed before
+		starting the Java application.</li>
+	<li>Fixed min/max JRE version checking, previous versions allowed these
+		to be equal (found by Ryan).</li>
+	<li>Bug fixed. Quotes in jar/JVM arguments were handled incorrectly (found by Juan Alvarez Ferrando).</li>
+	<li>A few other enhancements.</li>
+</ul>
+
+<h4>Changes in version 2.0.0 (31-10-2005)</h4>
+<ul class="changes">
+	<li>Launch4j for Mac OS X is available thanks to Peter Centgraf.</li>
+	<li>Added support for custom headers.</li>
+	<li>Fixed bug #1343908, command line arguments with spaces were handled
+		incorrectly by the console header (found by Oliver Schaefer / Steve Alberty).</li>
+	<li>Fixed stdin redirection bug (found by Timo Santasalo).</li>
+</ul>
+
+<h4>Changes in version 2.0 RC3 (13-08-2005) - final RC</h4>
+<ul class="changes">
+	<li>Correct handling of pathnames with spaces.</li>
+	<li>Fixed the '%20' pathname bug.</li>
+	<li>Fixed basedir bug (Richard Xing).</li>
+	<li>Splash screen can be closed when the application window becomes visible
+		with out specifying it's title (Martin Busik).
+		Update your config file: <em>&lt;waitForTitle&gt;title&lt;/waitForTitle&gt;</em>
+		is now <em>&lt;waitForWindow&gt;true&lt;/waitForWindow&gt;</em>.
+	</li>
+	<li>Fixed build.bat files in demo directories.</li>
+</ul>
+
+<h4>Changes in version 2.0 RC2 (21-06-2005)</h4>
+<ul class="changes">
+	<li>chdir allows to change the current directory to arbitrary paths
+		relative to the executable (FR #1144907). It's incompatible with
+		previous versions, update your config file:
+		<em>&lt;chdir&gt;true&lt;/chdir&gt;</em>
+		is now <em>&lt;chdir&gt;.&lt;/chdir&gt;</em>.
+	</li>
+	<li>Embedded JRE path no longer depends on chdir function.</li>
+	<li>Fixed Ant task bug, build files outside launch4j's directory
+		wouldn't work. Josh Elsasser submitted a patch that works without
+		setting launch4j's home dir in the build file. Thanks!
+	</li>
+	<li>Removed static edge from splash screen (Serge Baranov).</li>
+	<li>Program checks that the output file path doesn't contain spaces.</li>
+	<li>Fixed a NPE bug caused by a missing maxVersion property
+		(found by Morgan Schweers).
+	</li>
+	<li>Fixed relative JRE path bug (found by Nili_).</li>
+	<li>Cleaned up the Builder class.</li>
+	<li>Fixed Ant task NPE where the config was entirely defined in the
+		build file (Josh Elsasser).
+	</li>
+</ul>
+
+<h4>Changes in version 2.0 RC (07-06-2005)</h4>
+<ul class="changes">
+	<li>Added an Ant task for better build integration.</li>
+	<li>Added 2.x documentation.</li>
+	<li>Updated the demo configuration files.</li>
+	<li>Fixed issues with relative paths in the configuration.</li>
+	<li>Removed the '-1' option in console mode.</li>
+	<li>Minor fixes.</li>
+</ul>
+
+<h4>Changes in version 2.0 beta2 (23-05-2005)</h4>
+<ul class="changes">
+	<li># comments are recognized when importing 1.x cfg files.</li>
+	<li>Added version information.</li>
+	<li>Resource file is displayed when a resource error occurs.</li>
+	<li>Fixed a bug found by Max, options on the first tab were always enabled.</li>
+</ul>
+
+<h4>Changes in version 2.0 beta1 (13-05-2005)</h4>
+<ul class="changes">
+	<li>Completely new, cross-platform wrapper - create windows executables on Linux.</li>
+	<li>New .xml configuration file.</li>
+	<li>Application icon with multiple resolutions and color depths.</li>
+	<li>Swing GUI interface.</li>
+	<li>Header compiled with MinGW port of gcc instead of VC++.</li>
+</ul>
+
+<h4>Changes in version 1.4.2 (12-03-2005)</h4>
+<ul class="changes">
+	<li>Fixed bug #1158143, stayAlive without a splash screen caused
+		an infinite loop (found by Gregory Kotsaftis).
+	</li>
+</ul>
+
+<h4>Changes in version 1.4.1 (04-03-2005)</h4>
+<ul class="changes">
+	<li>Fixed bug #1119040, buffer for reading config properties
+		was too short (found by Tom Jensen and Neil).
+	</li>
+	<li>Added configurable splash timeout (FR #1102951).</li>
+	<li>Added option to disable the error message on splash timeout (FR #1109159).</li>
+	<li>Option to keep the gui launcher 'alive' after starting an application (FR #1124653).</li>
+	<li>Removed version info.</li>
+	<li>'waitfor' property is now optional.</li>
+</ul>
+
+<h4>Changes in version 1.4.0 (26-01-2005)</h4>
+<ul class="changes">
+	<li>Removed .lch4j suffix from process name, now it has the
+		form of the executable filename. The temporary launchers are stored in
+		launch4j-tmp directory (suggested by Emmanuel).
+	</li>
+	<li>Added support for console apps (FR #1050053).</li>
+</ul>
+
+<h4>Changes in version 1.3.1 (05-11-2004)</h4>
+<ul class="changes">
+	<li>Fixed a bug where explorer window was opened instead of
+		launching the application when setProcName was set to false
+		(found by Rob Jones).
+	</li>
+	<li>Fixed temporary launcher deletion bug.</li>
+</ul>
+
+<h4>Changes in version 1.3.0 (01-11-2004)</h4>
+<ul class="changes">
+	<li>Now you can configure launch4j to:
+		<ul class="changes">
+			<li>Use a bundled JRE.</li>
+			<li>Search for java, show an error message if the
+				right version cannot be found and open the java download page.</li>
+			<li>And a feature you asked for: use bundled JRE, if
+				that fails search for java and bring up the java download page on error.</li>
+		</ul>
+	</li>
+	<li>Enhanced code that sets the custom process name. In
+		case launch4j can't refresh the temporary launcher, bundled JRE on a
+		read only file system for example, it will use one created previously,
+		if it's present and has the correct size. If not, launching will still
+		continue, but with javaw.exe process name.Temporary launchers are
+		now created in the jre directory instead of jre/bin.
+	</li>
+	<li>errTitle property allows to set the title of the error message box.</li>
+</ul>
+
+<h4>Changes in version 1.2.1 (25-09-2004)</h4>
+<ul class="changes">
+	<li>Bugfix that allows launching from command line using short
+		name (#1026514 / found by Zach Del)
+	</li>
+</ul>
+
+<h4>Changes in version 1.2.0 (10-09-2004)</h4>
+<ul class="changes">
+	<li><strong>Custom process name</strong> (<i>myapp.lch4j.exe</i>)</li>
+	<li><strong>9 KB stub!</strong></li>
+	<li>Jar arguments</li>
+	<li>Bugfix that allows launching from command line.</li>
+	<li>Hide splash on javaw error.</li>
+	<li>Easier configuration with case insensitive parameters + show unrecognized parameter.</li>
+	<li>12 KB demo application, 34 KB with splash screen.</li>
+	<li>Configuration parameter <em>'args'</em> changed to <em>'jvmArgs'</em></li>
+</ul>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/changelog_es.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/changelog_es.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/changelog_es.html	(revision 15023)
@@ -0,0 +1,261 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows</title>
+		<meta name="description" content="Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows. Con funcionalidad para pantallas de bienvenida nativas, icono de aplicaciÃ³n, empaquetado de poco tamaÃ±o.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index_es.html">Inicio</a></li>
+					<li><a href="docs_es.html">DocumentaciÃ³n</a></li>
+					<li><a href="changelog_es.html">Historial de cambios</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Capturas de pantalla</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Descarga</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Soporte</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Resumen del proyecto</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Informes de errores</a></li>
+					<li><a href="links_es.html">Enlaces</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2>Historial de cambios</h2>
+
+<h4>Changes in version 2.1.5 (19-07-2006)</h4>
+<ul class="changes">
+	<li>Changed the Java download site to http://java.com/download.</li>
+	<li>Now it's possible to use absolute and relative paths to specify the embedded JRE.</li>
+</ul>
+
+<h4>Changes in version 2.1.4 (15-06-2006)</h4>
+<ul class="changes">
+	<li>
+		Fixed bug #1503996 Only the first wrapper instance had a custom process name
+		(found by Helge BÃ¶hme).
+	</li>
+</ul>
+
+<h4>Changes in version 2.1.3 (31-05-2006)</h4>
+<ul class="changes">
+	<li>
+		Fixed bug #1497453 Ant task doesn't support relative jar path with '..'
+		(found by Aston, Pavel Moukhataev).
+	</li>
+	<li>Jar argument size limit is now 16KB.</li>
+	<li>Environment variable size limit raised to 32KB.</li>
+	<li>Allow to concatenate multiple env. variables in one property (Maria D.)</li>
+	<li>Added launch4j.tmpdir property.</li>
+</ul>
+
+<h4>Changes in version 2.1.2 (03-04-2006)</h4>
+<ul class="changes">
+	<li>Important bugfix: insufficient command line buffer size was increased to 32KB
+	(found by Sebastian Kopsan).</li>
+	<li>Added runtime JVM options from an .ini file.</li>
+	<li>Launch4j's bin directory is now configurable through launch4j.bindir
+	system property.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.1.1 (25-01-2006)</h4>
+<ul class="changes">
+	<li>Error #1402748 corregido. Error de validaciÃ³n ocurrido al usar una tarea Ant con
+		la configuraciÃ³n embebida y la opciÃ³n dontWrapJar (encontrado por Chris Nokleberg).</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.1.0 (10-01-2006)</h4>
+<ul class="changes">
+	<li>Â¡Â¡MÃ¡s funcionalidades y cabecera mÃ¡s pequeÃ±a - 18 KB!!
+	<li>Se ha aÃ±adido un modo lanzador, se puede elegir si empaquetar o no el
+	jar.</li>
+	<li>TraducciÃ³n al espaÃ±ol de la web/documentaciÃ³n y los mensajes del
+	programa
+		(Patricio MartÃ­nez Ros).</li>
+	<li>El directorio bin del JRE se une a la variable de entorno Path
+		(Ianiv Schweber).</li>
+	<li>Variables especiales EXEDIR y EXEFILE aÃ±adidas, que guardan el
+	directorio y la ruta completa del ejecutable.</li>
+	<li>Se pueden copiar las variables de entorno en las propiedades del sistema.</li>
+	<li>Nuevo lanzamiento en modo depuraciÃ³n - se muestra diversa informaciÃ³n
+	antes de iniciar la aplicaciÃ³n Java.</li>
+	<li>ComprobaciÃ³n del mÃ­nimo/mÃ¡ximo del JRE, en versiones anteriores estaba
+	permitido que estas fueran iguales (encontrado por Ryan).</li>
+	<li>Error reparado. Las comillas en los argumentos jar/JVM no se manejaban
+	correctamente (encontrado por Juan Alvarez Ferrando).</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0.0 (31-10-2005)</h4>
+<ul class="changes">
+	<li>Launch4j para Mac OS X estÃ¡ disponible gracias a Peter Centgraf.</li>
+	<li>Soporte para cabeceras personalizadas.</li>
+	<li>Error #1343908 reparado, los argumentos con espacios de la lÃ­nea de
+	Ã³rdenes no eran manejados correctamente por la cabecera de consola (encontrado
+	por Oliver Schaefer / Steve Alberty).</li>
+	<li>Error en la redirecciÃ³n de la entrada estÃ¡ndar reparado (encontrado por by Timo Santasalo).</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0 RC3 (13-08-2005) - final RC</h4>
+<ul class="changes">
+	<li>Correct handling of pathnames with spaces.</li>
+	<li>Fixed the '%20' pathname bug.</li>
+	<li>Fixed basedir bug (Richard Xing).</li>
+	<li>Splash screen can be closed when the application window becomes visible
+		with out specifying it's title (Martin Busik).
+		Update your config file: <em>&lt;waitForTitle&gt;title&lt;/waitForTitle&gt;</em>
+		is now <em>&lt;waitForWindow&gt;true&lt;/waitForWindow&gt;</em>.
+	</li>
+	<li>Fixed build.bat files in demo directories.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0 RC2 (21-06-2005)</h4>
+<ul class="changes">
+	<li>chdir allows to change the current directory to arbitrary paths
+		relative to the executable (FR #1144907). It's incompatible with
+		previous versions, update your config file:
+		<em>&lt;chdir&gt;true&lt;/chdir&gt;</em>
+		is now <em>&lt;chdir&gt;.&lt;/chdir&gt;</em>.
+	</li>
+	<li>Embedded JRE path no longer depends on chdir function.</li>
+	<li>Fixed Ant task bug, build files outside launch4j's directory
+		wouldn't work. Josh Elsasser submitted a patch that works without
+		setting launch4j's home dir in the build file. Thanks!
+	</li>
+	<li>Removed static edge from splash screen (Serge Baranov).</li>
+	<li>Program checks that the output file path doesn't contain spaces.</li>
+	<li>Fixed a NPE bug caused by a missing maxVersion property
+		(found by Morgan Schweers).
+	</li>
+	<li>Fixed relative JRE path bug (found by Nili_).</li>
+	<li>Cleaned up the Builder class.</li>
+	<li>Fixed Ant task NPE where the config was entirely defined in the
+		build file (Josh Elsasser).
+	</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0 RC (07-06-2005)</h4>
+<ul class="changes">
+	<li>Added an Ant task for better build integration.</li>
+	<li>Added 2.x documentation.</li>
+	<li>Updated the demo configuration files.</li>
+	<li>Fixed issues with relative paths in the configuration.</li>
+	<li>Removed the '-1' option in console mode.</li>
+	<li>Minor fixes.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0 beta2 (23-05-2005)</h4>
+<ul class="changes">
+	<li># comments are recognized when importing 1.x cfg files.</li>
+	<li>Added version information.</li>
+	<li>Resource file is displayed when a resource error occurs.</li>
+	<li>Fixed a bug found by Max, options on the first tab were always enabled.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 2.0 beta1 (13-05-2005)</h4>
+<ul class="changes">
+	<li>Completely new, cross-platform wrapper - create windows executables on Linux.</li>
+	<li>New .xml configuration file.</li>
+	<li>Application icon with multiple resolutions and color depths.</li>
+	<li>Swing GUI interface.</li>
+	<li>Header compiled with MinGW port of gcc instead of VC++.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.4.2 (12-03-2005)</h4>
+<ul class="changes">
+	<li>Fixed bug #1158143, stayAlive without a splash screen caused
+		an infinite loop (found by Gregory Kotsaftis).
+	</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.4.1 (04-03-2005)</h4>
+<ul class="changes">
+	<li>Fixed bug #1119040, buffer for reading config properties
+		was too short (found by Tom Jensen and Neil).
+	</li>
+	<li>Added configurable splash timeout (FR #1102951).</li>
+	<li>Added option to disable the error message on splash timeout (FR #1109159).</li>
+	<li>Option to keep the gui launcher 'alive' after starting an application (FR #1124653).</li>
+	<li>Removed version info.</li>
+	<li>'waitfor' property is now optional.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.4.0 (26-01-2005)</h4>
+<ul class="changes">
+	<li>Removed .lch4j suffix from process name, now it has the
+		form of the executable filename. The temporary launchers are stored in
+		launch4j-tmp directory (suggested by Emmanuel).
+	</li>
+	<li>Added support for console apps (FR #1050053).</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.3.1 (05-11-2004)</h4>
+<ul class="changes">
+	<li>Fixed a bug where explorer window was opened instead of
+		launching the application when setProcName was set to false
+		(found by Rob Jones).
+	</li>
+	<li>Fixed temporary launcher deletion bug.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.3.0 (01-11-2004)</h4>
+<ul class="changes">
+	<li>Now you can configure launch4j to:
+		<ul class="changes">
+			<li>Use a bundled JRE.</li>
+			<li>Search for java, show an error message if the
+				right version cannot be found and open the java download page.</li>
+			<li>And a feature you asked for: use bundled JRE, if
+				that fails search for java and bring up the java download page on error.</li>
+		</ul>
+	</li>
+	<li>Enhanced code that sets the custom process name. In
+		case launch4j can't refresh the temporary launcher, bundled JRE on a
+		read only file system for example, it will use one created previously,
+		if it's present and has the correct size. If not, launching will still
+		continue, but with javaw.exe process name.Temporary launchers are
+		now created in the jre directory instead of jre/bin.
+	</li>
+	<li>errTitle property allows to set the title of the error message box.</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.2.1 (25-09-2004)</h4>
+<ul class="changes">
+	<li>Bugfix that allows launching from command line using short
+		name (#1026514 / found by Zach Del)
+	</li>
+</ul>
+
+<h4>Cambios en la versiÃ³n 1.2.0 (10-09-2004)</h4>
+<ul class="changes">
+	<li><strong>Custom process name</strong> (<i>myapp.lch4j.exe</i>)</li>
+	<li><strong>9 KB stub!</strong></li>
+	<li>Jar arguments</li>
+	<li>Bugfix that allows launching from command line.</li>
+	<li>Hide splash on javaw error.</li>
+	<li>Easier configuration with case insensitive parameters + show unrecognized parameter.</li>
+	<li>12 KB demo application, 34 KB with splash screen.</li>
+	<li>Configuration parameter <em>'args'</em> changed to <em>'jvmArgs'</em></li>
+</ul>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal <br>
+				TraducciÃ³n al espaÃ±ol Copyright &copy; 2005-2006 Patricio MartÃ­nez Ros
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/docs.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/docs.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/docs.html	(revision 15023)
@@ -0,0 +1,395 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Cross-platform Java executable wrapper</title>
+		<meta name="description" content="Cross-platform Java executable wrapper for creating lightweight Windows native EXEs. Provides better user experience.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index.html">Home</a></li>
+					<li><a href="docs.html">Docs</a></li>
+					<li><a href="changelog.html">Changelog</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Screenshots</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Download</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Support</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Project summary</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Bug tracker</a></li>
+					<li><a href="links.html">Links</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<a href="#Running_launch4j">Running launch4j</a><br>
+<a href="#Configuration_file">Configuration file</a><br>
+<a href="#Importing_1.x_configuration">Importing 1.x configuration</a><br>
+<a href="#Ant_task">Ant Task</a><br>
+<a href="#Additional_jvm_options">Additional JVM options at runtime</a><br>
+<a href="#Debug_launching_mode">Debug launching mode</a><br>
+<a href="#Settings">Settings</a><br>
+
+<h2 id="Running_launch4j">Running launch4j</h2>
+Run <em>launch4j.exe</em> or <em>launch4j</em> script without command
+line arguments to enter the GUI mode.
+
+<pre>launch4j.exe</pre>
+
+To wrap a jar in console mode use <em>launch4jc.exe</em>&nbsp;<em></em>and
+specify the configuration file.
+
+<pre>launch4jc.exe config.xml</pre>
+
+On Linux use the <em>launch4j</em> script.
+
+<pre>launch4j ./demo/l4j/config.xml</pre>
+
+<h2 id="Configuration_file">Configuration file</h2>
+Launch4j requires an xml configuration file for each output executable.
+You can create and edit it conveniently using the graphic user
+interface or your favorite editor. Alternatively it's possible to pass
+all of the configuration parameters through the Ant task. All files
+except for <em>&lt;jre&gt;&lt;path&gt;</em>
+may be absolute paths or relative to the configuration file path.
+
+<pre>&lt;!-- <strong>Bold</strong> elements are required --&gt;<br><strong>&lt;launch4jConfig&gt;<br></strong>  &lt;!-- Header types: 0-GUI, 1-console --&gt;<strong><br></strong>  <strong>&lt;headerType&gt;</strong><span class="codeword">0|1</span><strong>&lt;/headerType&gt;</strong><br><strong></strong>  <strong>&lt;outfile&gt;</strong><span class="codeword">file.exe</span><strong><span class="codeword"></span>&lt;/outfile&gt;<br></strong>  <strong>&lt;jar&gt;</strong><span class="codeword">file</span><span class="codeword"></span><strong>&lt;/jar&gt;<br></strong>  &lt;dontWrapJar&gt;<span class="codeword">true|<u>false</u></span>&lt;/dontWrapJar&gt;<br>  &lt;errTitle&gt;<span class="codeword">text</span>&lt;/errTitle&gt;<br>  &lt;jarArgs&gt;<span class="codeword">text</span>&lt;/jarArgs&gt;<br>  &lt;chdir&gt;<span class="codeword">path</span>&lt;/chdir&gt;<br>  &lt;customProcName&gt;<span class="codeword">true|<u>false</u></span>&lt;/customProcName&gt;<br>  &lt;stayAlive&gt;<span class="codeword">true|false</span>&lt;/stayAlive&gt;<br>  &lt;icon&gt;<span class="codeword">file</span>&lt;/icon&gt;<br>  &lt;headerObjects&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">object file</span><strong>&lt;/file&gt;</strong><br>    <strong>&lt;file&gt;</strong><span class="codeword">object file</span><strong>&lt;/file&gt;</strong><br>    <strong>...</strong><br>  &lt;/headerObjects&gt;<br>  &lt;libs&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">w32api lib</span><strong>&lt;/file&gt;<br></strong><strong>    &lt;file&gt;</strong><span class="codeword">w32api lib</span><strong>&lt;/file&gt;<br>    ...<br></strong>  &lt;/libs&gt;<br>  <strong>&lt;jre&gt;<br></strong>    &lt;!-- Specify one of the following or both --&gt;<br>    <strong>&lt;path&gt;</strong><span class="codeword">path</span><strong>&lt;/path&gt;<br>    </strong><strong>&lt;minVersion&gt;</strong><span class="codeword">x.x.x[_xx]</span><strong>&lt;/minVersion&gt;<br></strong>    &lt;maxVersion&gt;<span class="codeword">x.x.x[_xx]</span>&lt;/maxVersion&gt;<br>    &lt;!-- Heap sizes in MB, 0-use default --&gt;<br>    &lt;initialHeapSize&gt;<span class="codeword">MB</span>&lt;/initialHeapSize&gt;<br>    &lt;maxHeapSize&gt;<span class="codeword">MB</span>&lt;/maxHeapSize&gt;<br>    &lt;args&gt;<span class="codeword">text</span>&lt;/args&gt;<br>  <strong>&lt;/jre&gt;</strong><br>  &lt;splash&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">file</span><strong>&lt;/file&gt;</strong><br>    &lt;waitForWindow&gt;<span class="codeword"><u>true</u>|false</span>&lt;/waitForWindow&gt;<br>    &lt;timeout&gt;<span class="codeword">seconds [60]</span>&lt;/timeout&gt;<br>    &lt;timeoutErr&gt;<span class="codeword"><u>true</u>|false</span>&lt;/timeoutErr&gt;<br>  &lt;/splash&gt;<br>  &lt;versionInfo&gt;<br>    <strong>&lt;fileVersion&gt;</strong><span class="codeword">x.x.x.x</span><strong>&lt;/fileVersion&gt;</strong><br>    <strong>&lt;txtFileVersion&gt;</strong><span class="codeword">text</span><strong>&lt;/txtFileVersion&gt;</strong><br>    <strong>&lt;fileDescription&gt;</strong><span class="codeword">text</span><strong>&lt;/fileDescription&gt;</strong><br>    <strong>&lt;copyright&gt;</strong><span class="codeword">text</span><strong>&lt;/copyright&gt;</strong><br>    <strong>&lt;productVersion&gt;</strong><span class="codeword">x.x.x.x</span><strong>&lt;/productVersion&gt;</strong><br>    <strong>&lt;txtProductVersion&gt;</strong><span class="codeword">text</span><strong>&lt;/txtProductVersion&gt;</strong><br>    <strong>&lt;productName&gt;</strong><span class="codeword">text</span><strong>&lt;/productName&gt;</strong><br>    &lt;companyName&gt;<span class="codeword">text</span>&lt;/companyName&gt;<br>    <strong>&lt;internalName&gt;</strong><span class="codeword">filename</span><strong>&lt;/internalName&gt;</strong><br>    <strong>&lt;originalFilename&gt;</strong><span class="codeword">filename.exe</span><strong>&lt;/originalFilename&gt;</strong><br>  &lt;/versionInfo&gt;<br><strong>&lt;/launch4jConfig&gt;</strong><br></pre>
+
+<dl>
+	<dt>&lt;headerType&gt;</dt>
+	<dd>
+		Type of the header used to wrap the application.
+		<table>
+			<thead>
+		    	<tr>
+		    		<th>Header type</th>
+		    		<th>App type</th>
+		    		<th>Launcher</th>
+		    		<th>Splash screen</th>
+		    		<th style="white-space: nowrap">Wait for the application to close</th>
+		    	</tr>
+			</thead>
+			<tbody>
+		    	<tr>
+		    		<td>0</td>
+		    		<td>GUI</td>
+		    		<td>javaw</td>
+		    		<td>yes</td>
+		    		<td class="description">wrapper waits only if <em>stayAlive</em> is set to true,
+		    			otherwise it terminates immediately or after closing
+		    			the splash screen.
+		    		</td>
+		    	</tr>
+		    	<tr>
+		    		<td>1</td>
+		    		<td>console</td>
+		    		<td>java</td>
+		    		<td>no</td>
+		    		<td class="description">always waits and returns application's exit code.</td>
+		    	</tr>
+		    </tbody>
+		</table>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;outfile&gt;</dt>
+	<dd>Output executable file.</dd>
+</dl>
+<dl>
+	<dt>&lt;jar&gt;</dt>
+	<dd>
+		Depends on <em>&lt;dontWrapJar&gt;</em>, if false (the default) then
+		this element is the executable jar to wrap.
+		When <em>&lt;dontWrapJar&gt;</em> is set to true
+		it's the runtime path of the jar relative to the executable. For
+		example, if the executable launcher and the application jar named
+		<i>calc.exe</i> and <i>calc.jar</i> are in the same directory
+		then you would use <i>&lt;jar&gt;calc.jar&lt;/jar&gt;</i>.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;dontWrapJar&gt;</dt>
+	<dd>
+		Optional, defaults to false. Launch4j by default wraps jars in native
+		executables, you can prevent this by setting <em>&lt;dontWrapJar&gt;</em> to true.
+		The exe acts then as a launcher and starts the application specified in
+		<em>&lt;jar&gt;</em>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;errTitle&gt;</dt>
+	<dd>
+		Optional, sets the title of the error message box that's displayed if Java cannot
+		be found for instance. This usually should contain the name of your
+		application. The console header prefixes error messages with this
+		property (myapp: error...)
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;jarArgs&gt;</dt>
+	<dd>Optional, constant command line arguments.</dd>
+</dl>
+<dl>
+	<dt>&lt;chdir&gt;</dt>
+	<dd>Optional. Change current directory to an arbitrary path relative to the executable.
+		If you omit this property or leave it blank it will have no effect.
+		Setting it to <em>.</em> will change the current dir to the same directory
+		as the executable. <em>..</em> will change it to the parent directory, and so on.
+	</dd>
+	<dd>
+		<pre>&lt;chdir&gt;.&lt;/chdir&gt;</pre>
+	</dd>
+	<dd>
+		<pre>&lt;chdir&gt;../somedir&lt;/chdir&gt;</pre>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;customProcName&gt;</dt>
+	<dd>Optional, defaults to false.
+		Set the process name as the executable filename. Creates a temporary
+		file in launch4j-tmp directory inside the used JRE. These files are
+		deleted by any launch4j wrapped application, which sets
+		the process name and uses the same JRE. The removal takes place
+		when the application <strong>starts</strong>,
+		so at least one copy of this file will always be present.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;stayAlive&gt;</dt>
+	<dd>Optional, defaults to false in GUI header, always true in console header.
+		When enabled the launcher waits for the Java application
+		to finish and returns it's exit code.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;icon&gt;</dt>
+	<dd>Application icon in ICO format. May contain multiple color depths/resolutions.</dd>
+</dl>
+<dl>
+	<dt>&lt;headerObjects&gt;</dt>
+	<dd>Optional, custom headers only. Ordered list of header object files.</dd>
+</dl>
+<dl>
+	<dt>&lt;libs&gt;</dt>
+	<dd>Optional, custom headers only. Ordered list of libraries used by header.</dd>
+</dl>
+<dl>
+	<dt>&lt;jre&gt;</dt>
+	<dd>Required element that groups JRE settings.</dd>
+</dl>
+<blockquote>
+    <dl>
+    	<dt>&lt;path&gt;, &lt;minVersion&gt;, &lt;maxVersion&gt;</dt>
+        <dd>The <em>&lt;path&gt;</em> property is used
+    		to specify the absolute or relative path (to the executable) of an embedded JRE, it
+    		does not rely on the current directory or <em>&lt;chdir&gt;</em>.
+    		Note that this path is not checked until the actual application execution.
+    		If you'd like the wrapper to search for a JRE (public or SDK private)
+    		use the <em>&lt;minVersion&gt;</em> property, you may also specify
+    		the <em>&lt;maxVersion&gt;</em> to prevent it from using higher Java versions.
+    		Launch4j will always use the highest version available (in the min/max range of course).
+    		You can also combine these properties to change the startup process...
+    	</dd>
+	</dl>
+	<blockquote>
+        <dl>
+        	<dt>&lt;path&gt;</dt>
+        	<dd>Run if bundled JRE and javaw.exe are present, otherwise stop with error.</dd>
+            <dt>&lt;path&gt; + &lt;minVersion&gt;&nbsp; [+ &lt;maxVersion&gt;]</dt>
+            <dd>Use bundled JRE first, if it cannot be located search for Java,
+        		if that fails display error message and open the Java download page.
+        	</dd>
+            <dt>&lt;minVersion&gt;&nbsp; [+ &lt;maxVersion&gt;]</dt>
+            <dd>Search for Java, if an appropriate version cannot be found display
+        		error message and open the Java download page.
+        	</dd>
+        </dl>
+	</blockquote>
+</blockquote>
+<blockquote>
+	<dl>
+		<dt>&lt;initialHeapSize&gt;</dt>
+		<dd>Optional, initial heap size in MB, 0 - use default.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;maxHeapSize&gt;</dt>
+		<dd>Optional, max heap size in MB, 0 - use default.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;args&gt;</dt>
+		<dd>Optional, accepts everything you would normally pass to
+			java/javaw launcher: assertion options, system properties and X options.
+			Here you can map environment and special variables <em>EXEDIR</em>
+			(exe's runtime directory), <em>EXEFILE</em> (exe's runtime full file path)
+			to system properties. All variable references must be surrounded with
+			percentage signs and quoted.
+			<pre>-Dlaunch4j.exedir="%EXEDIR%"<br>-Dlaunch4j.exefile="%EXEFILE%"<br>-Denv.path="%Path%"<br>-Dsettings="%HomeDrive%%HomePath%\\app-settings.ini"</pre>
+		</dd>
+	</dl>
+</blockquote>
+
+<dl>
+	<dt>&lt;splash&gt;</dt>
+	<dd>Optional, groups the splash screen settings. Allowed only in GUI header.</dd>
+</dl>
+<blockquote>
+	<dl>
+		<dt>&lt;file&gt;</dt>
+		<dd>Splash screen image in BMP format.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;waitForWindow&gt;</dt>
+		<dd>Optional, defaults to true. Close the splash screen when an application
+			window or Java error message box appears. If set to false,
+			the splash screen will be closed on timeout.
+		</dd>
+	</dl>
+	<dl>
+		<dt>&lt;timeout&gt;</dt>
+		<dd>Optional, defaults to 60. Number of seconds after which the splash screen
+			must be closed. Splash timeout may cause an error depending on
+			<em>&lt;timeoutErr&gt;</em>.
+		</dd>
+	</dl>
+	<dl>
+		<dt>&lt;timeoutErr&gt;</dt>
+		<dd>Optional, defaults to true. True signals an error on splash timeout,
+			false closes the splash screen quietly.
+		</dd>
+	</dl>
+</blockquote>
+
+<dl>
+	<dt>&lt;versionInfo&gt;</dt>
+	<dd>Optional, version information to be displayed by the Windows Explorer.</dd>
+</dl>
+<blockquote>
+	<dl>
+		<dt>&lt;fileVersion&gt;</dt>
+		<dd>Version number 'x.x.x.x'</dd>
+	</dl>
+	<dl>
+		<dt>&lt;txtFileVersion&gt;</dt>
+		<dd>Free form file version, for example '1.20.RC1'.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;fileDescription&gt;</dt>
+		<dd>File description presented to the user.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;copyright&gt;</dt>
+		<dd>Legal copyright.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;productVersion&gt;</dt>
+		<dd>Version number 'x.x.x.x'</dd>
+	</dl>
+	<dl>
+		<dt>&lt;txtProductVersion&gt;</dt>
+		<dd>Free form file version, for example '1.20.RC1'.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;productName&gt;</dt>
+		<dd>Text.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;companyName&gt;</dt>
+		<dd>Optional text.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;internalName&gt;</dt>
+		<dd>Internal name without extension, original filename or module name for example.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;originalFilename&gt;</dt>
+		<dd>Original name of the file without the path. Allows to determine
+			whether a file has been renamed by a user.
+		</dd>
+	</dl>
+</blockquote>
+
+<h2 id="Importing_1.x_configuration">Importing 1.x configuration</h2>
+It's possible to import a 1.x configuration file using the GUI
+interface. Open the file, correct the paths and save it as a new xml
+configuration.
+
+<h2 id="Ant_task">Ant task</h2>
+You may set a launch4j directory property or change the task definition.
+
+<pre>&lt;property name="launch4j.dir" location="/opt/launch4j" /&gt;</pre>
+
+Define the task in your Ant build script.
+
+<pre>&lt;taskdef name="launch4j"<br>  classname="net.sf.launch4j.ant.Launch4jTask"<br>  classpath="${launch4j.dir}/launch4j.jar<br>    :${launch4j.dir}/lib/xstream.jar" /&gt;</pre>
+
+Execute the task!
+
+<pre>&lt;launch4j configFile="./l4j/demo.xml" /&gt;</pre>
+
+You can set or override the following configuration properties...
+<p class="attrib">
+	jar="absolute path or relative to <em>basedir</em>"<br>
+	jarPath="relative path"<br>	
+	outfile<br>
+	fileVersion<br>
+	txtFileVersion<br>
+	productVersion<br>
+	txtProductVersion
+</pn>
+
+<pre>&lt;launch4j configFile="./l4j/demo.xml"<br>  outfile="mydemo.exe"<br> &nbsp;fileVersion="1.0.0.0" txtFileVersion="1.0 RC2" /&gt;</pre>
+
+You can also define the entire configuration in the task, but it will
+not be possible to edit such a file in the GUI mode. All paths except
+for <em>&lt;chdir&gt;</em>, <em>&lt;jre&gt;&lt;path&gt;</em> and <em>jarPath</em>
+are calculated using the <em>basedir</em> project attribute.
+
+<pre>&lt;launch4j&gt;<br>  &lt;config headerType="0" outfile="demo.exe"<br>      dontWrapJar="true" jarPath="demo.jar" &gt;<br>    &lt;jre minVersion="1.4.0" /&gt;<br>  &lt;/config&gt;<br>&lt;/launch4j&gt;</pre>
+
+<h2 id="Additional_jvm_options">Additional JVM options at runtime</h2>
+When you create a wrapper or launcher all configuration details are compiled into the
+executable and cannot be changed without recreating it or hacking with a resource editor.
+Launch4j 2.1.2 introduces a new feature that allows to pass additional JVM options
+at runtime from an .ini file. Now you can specify the options in the configuration file,
+ini file or in both, but you cannot override them. The ini file's name must correspond
+to the executable's <em>(myapp.exe : myapp.ini)</em>.
+The arguments should be separated with spaces or new lines, environment variable
+expansion is supported, for example:
+<pre>-Dswing.aatext=true<br>-Dsomevar="%SOMEVAR%"<br>-Xms16m</pre>
+
+<h2 id="Debug_launching_mode">Debug launching mode</h2>
+To make sure the output executable is configured correctly you can use the
+debug launching mode which displays various information before starting the Java application.
+To enable it set the environment variable <em>launch4j=debug</em> and run the wrapped
+program. When using the GUI header redirect standard output to a file to see the results.
+<pre>set launch4j=debug<br>app.exe &gt;launch4j.log</pre>
+
+<h2 id="Settings">Settings</h2>
+<h3>Alternate bin directory: launch4j.bindir</h3>
+It's possible to override the default bin directory location which contains windres and ld
+tools using the <em>launch4j.bindir</em> system property. The property can have two forms:
+ a path relative to Launch4j's directory (<em>altbin</em> for example) or an absolute path.
+
+<h3>Working directory: launch4j.tmpdir</h3>
+Change the working directory if the default path contains spaces which windres cannot handle.
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/docs_es.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/docs_es.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/docs_es.html	(revision 15023)
@@ -0,0 +1,399 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows</title>
+		<meta name="description" content="Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows. Con funcionalidad para pantallas de bienvenida nativas, icono de aplicaciÃ³n, empaquetado de poco tamaÃ±o.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index_es.html">Inicio</a></li>
+					<li><a href="docs_es.html">DocumentaciÃ³n</a></li>
+					<li><a href="changelog_es.html">Historial de cambios</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Capturas de pantalla</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Descarga</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Soporte</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Resumen del proyecto</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Informes de errores</a></li>
+					<li><a href="links_es.html">Enlaces</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<a href="#Running_launch4j">Ejecutando launch4j</a><br>
+<a href="#Configuration_file">Fichero de configuraciÃ³n</a><br>
+<a href="#Importing_1.x_configuration">Importando configuraciÃ³n 1.x</a><br>
+<a href="#Ant_task">Tarea Ant</a><br>
+<a href="#Debug_launching_mode">Lanzamiento en modo de depuraciÃ³n</a><br>
+
+<h2 id="Running_launch4j">Ejecutando launch4j</h2>
+Ejecute <em>launch4j.exe</em> o el script&nbsp; <em>launch4j</em> sin argumentos
+de lÃ­nea de Ã³rdenes para entrar en el modo grÃ¡fico (GUI).
+
+<pre>launch4j.exe</pre>
+
+Para empaquetar un jar en modo consola use <em>launch4jc.exe</em>&nbsp;y especifique
+el fichero de configuraciÃ³n.
+
+<pre>launch4jc.exe config.xml</pre>
+
+En Linux use el script <em>launch4j</em>.
+
+<pre>launch4j ./demo/l4j/config.xml</pre>
+
+<h2 id="Configuration_file">Fichero de configuraciÃ³n</h2>
+Launch4j necesita un fichero de configuraciÃ³n xml para cada ejecutable. Puede
+crearlo y editarlo convenientemente usando la interfaz grÃ¡fica de usuario o su
+editor favorito. TambiÃ©n es posible pasar todos los parÃ¡metros de configuraciÃ³n
+a travÃ©s de la tarea Ant. Para todos los ficheros excepto excepto para <em>&lt;jre&gt;&lt;path&gt;</em>
+se pueden usar rutas absolutas o relativas a la ruta del fichero de
+configuraciÃ³n.
+
+<pre>&lt;!-- <strong>Bold</strong> elements are required --&gt;<br><strong>&lt;launch4jConfig&gt;<br></strong>  &lt;!-- Header types: 0-GUI, 1-console --&gt;<strong><br></strong>  <strong>&lt;headerType&gt;</strong><span class="codeword">0|1</span><strong>&lt;/headerType&gt;</strong><br><strong></strong>  <strong>&lt;outfile&gt;</strong><span class="codeword">file.exe</span><strong><span class="codeword"></span>&lt;/outfile&gt;<br></strong>  <strong>&lt;jar&gt;</strong><span class="codeword">file</span><span class="codeword"></span><strong>&lt;/jar&gt;<br></strong>  &lt;dontWrapJar&gt;<span class="codeword">true|<u>false</u></span>&lt;/dontWrapJar&gt;<br>  &lt;errTitle&gt;<span class="codeword">text</span>&lt;/errTitle&gt;<br>  &lt;jarArgs&gt;<span class="codeword">text</span>&lt;/jarArgs&gt;<br>  &lt;chdir&gt;<span class="codeword">path</span>&lt;/chdir&gt;<br>  &lt;customProcName&gt;<span class="codeword">true|<u>false</u></span>&lt;/customProcName&gt;<br>  &lt;stayAlive&gt;<span class="codeword">true|false</span>&lt;/stayAlive&gt;<br>  &lt;icon&gt;<span class="codeword">file</span>&lt;/icon&gt;<br>  &lt;headerObjects&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">object file</span><strong>&lt;/file&gt;</strong><br>    <strong>&lt;file&gt;</strong><span class="codeword">object file</span><strong>&lt;/file&gt;</strong><br>    <strong>...</strong><br>  &lt;/headerObjects&gt;<br>  &lt;libs&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">w32api lib</span><strong>&lt;/file&gt;<br></strong><strong>    &lt;file&gt;</strong><span class="codeword">w32api lib</span><strong>&lt;/file&gt;<br>    ...<br></strong>  &lt;/libs&gt;<br>  <strong>&lt;jre&gt;<br></strong>    &lt;!-- Specify one of the following or both --&gt;<br>    <strong>&lt;path&gt;</strong><span class="codeword">path</span><strong>&lt;/path&gt;<br>    </strong><strong>&lt;minVersion&gt;</strong><span class="codeword">x.x.x[_xx]</span><strong>&lt;/minVersion&gt;<br></strong>    &lt;maxVersion&gt;<span class="codeword">x.x.x[_xx]</span>&lt;/maxVersion&gt;<br>    &lt;!-- Heap sizes in MB, 0-use default --&gt;<br>    &lt;initialHeapSize&gt;<span class="codeword">MB</span>&lt;/initialHeapSize&gt;<br>    &lt;maxHeapSize&gt;<span class="codeword">MB</span>&lt;/maxHeapSize&gt;<br>    &lt;args&gt;<span class="codeword">text</span>&lt;/args&gt;<br>  <strong>&lt;/jre&gt;</strong><br>  &lt;splash&gt;<br>    <strong>&lt;file&gt;</strong><span class="codeword">file</span><strong>&lt;/file&gt;</strong><br>    &lt;waitForWindow&gt;<span class="codeword"><u>true</u>|false</span>&lt;/waitForWindow&gt;<br>    &lt;timeout&gt;<span class="codeword">seconds [60]</span>&lt;/timeout&gt;<br>    &lt;timeoutErr&gt;<span class="codeword"><u>true</u>|false</span>&lt;/timeoutErr&gt;<br>  &lt;/splash&gt;<br>  &lt;versionInfo&gt;<br>    <strong>&lt;fileVersion&gt;</strong><span class="codeword">x.x.x.x</span><strong>&lt;/fileVersion&gt;</strong><br>    <strong>&lt;txtFileVersion&gt;</strong><span class="codeword">text</span><strong>&lt;/txtFileVersion&gt;</strong><br>    <strong>&lt;fileDescription&gt;</strong><span class="codeword">text</span><strong>&lt;/fileDescription&gt;</strong><br>    <strong>&lt;copyright&gt;</strong><span class="codeword">text</span><strong>&lt;/copyright&gt;</strong><br>    <strong>&lt;productVersion&gt;</strong><span class="codeword">x.x.x.x</span><strong>&lt;/productVersion&gt;</strong><br>    <strong>&lt;txtProductVersion&gt;</strong><span class="codeword">text</span><strong>&lt;/txtProductVersion&gt;</strong><br>    <strong>&lt;productName&gt;</strong><span class="codeword">text</span><strong>&lt;/productName&gt;</strong><br>    &lt;companyName&gt;<span class="codeword">text</span>&lt;/companyName&gt;<br>    <strong>&lt;internalName&gt;</strong><span class="codeword">filename</span><strong>&lt;/internalName&gt;</strong><br>    <strong>&lt;originalFilename&gt;</strong><span class="codeword">filename.exe</span><strong>&lt;/originalFilename&gt;</strong><br>  &lt;/versionInfo&gt;<br><strong>&lt;/launch4jConfig&gt;</strong><br></pre>
+
+<dl>
+	<dt>&lt;headerType&gt;</dt>
+	<dd>
+		Tipo de cabecera usada para empaquetar la aplicaciÃ³n.
+		<table>
+			<thead>
+		    	<tr>
+		    		<th>Tipo de cabecera</th>
+		    		<th>Tipo de aplicaciÃ³n</th>
+		    		<th>Lanzador</th>
+		    		<th>Pantalla de bienvenida</th>
+		    		<th style="white-space: nowrap;">Esperar a que se cierre la
+					aplicaciÃ³n</th>
+		    	</tr>
+			</thead>
+			<tbody>
+		    	<tr>
+		    		<td>0</td>
+		    		<td>GUI</td>
+		    		<td>javaw</td>
+		    		<td>sÃ­</td>
+		    		<td class="description">el empaquetador espera sÃ³lo si <em>stayAlive</em>
+					estÃ¡ puesto a true (verdadero), en otro caso termina inmediatamente
+					o despuÃ©s de cerrar la pantalla de bienvenida.
+		    		</td>
+		    	</tr>
+		    	<tr>
+		    		<td>1</td>
+		    		<td>consola</td>
+		    		<td>java</td>
+		    		<td>no</td>
+		    		<td class="description">siempre espera y devuelve el cÃ³digo de
+					salida de la aplicaciÃ³n.</td>
+		    	</tr>
+		    </tbody>
+		</table>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;outfile&gt;</dt>
+	<dd>El fichero ejecutable de salida.</dd>
+</dl>
+<dl>
+	<dt>&lt;jar&gt;</dt>
+	<dd>
+		Depende de <em>&lt;dontWrapJar&gt;</em>, si false (falso, por defecto) 
+		entonces este elemento es el jar ejecutable que empaquetar.
+		Cuando <em>&lt;dontWrapJar&gt;</em> estÃ¡ puesto a true (verdadero) es la 
+		ruta del jar relativa al ejecutable. Por ejemplo, si el lanzador 
+		ejecutable y la aplicaciÃ³n jar, llamados calc.exe y calc.jar 
+		respectivamente, estÃ¡n en el mismo directorio, entonces deberÃ­a usar <i>&lt;jar&gt;calc.jar&lt;/jar&gt;</i>.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;dontWrapJar&gt;</dt>
+	<dd>
+		No empaquetar el fichero jar.
+		Opcional, por defecto a false (falso). Launch4j por defecto empaqueta 
+		jars en los ejecutables nativos, usted puede evitar esto poniendo <em>&lt;dontWrapJar&gt;</em> 
+		a true (verdadero).
+		El ejecutable actÃºa como un lanzador e inicia la aplicaciÃ³n especificada 
+		en <em>&lt;jar&gt;.</em>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;errTitle&gt;</dt>
+	<dd>
+	<p align="justify">Opcional, estable el tÃ­tulo de la ventana de error que se
+	muestra si Java no se ha podido encontrar, por ejemplo. Este normalmente
+	deberÃ­a contener el nombre de su aplicaciÃ³n. La cabecera de tipo consola
+	muestra esta propiedad delante del mensaje de error (myapp: error...)
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;jarArgs&gt;</dt>
+	<dd>Opcional, los argumentos de la lÃ­nea de Ã³rdenes.</dd>
+</dl>
+<dl>
+	<dt>&lt;chdir&gt;</dt>
+	<dd>
+	<p align="justify">Opcional. Cambia el directorio actual a una ruta relativa
+	arbitraria al ejecutable. Si omite esta propiedad o la deja en blanco, no
+	tendrÃ¡ ningÃºn efecto. Si establece esta propiedad como <em>.</em> se
+	cambiarÃ¡ el directorio actual al mismo directorio que el ejecutable. <em>..</em>
+	lo cambiarÃ¡ al directorio padre y asÃ­ sucesivamente.
+	</dd>
+	<dd>
+		<pre>&lt;chdir&gt;.&lt;/chdir&gt;</pre>
+	</dd>
+	<dd>
+		<pre>&lt;chdir&gt;../somedir&lt;/chdir&gt;</pre>
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;customProcName&gt;</dt>
+	<dd>
+	<p align="justify">Opcional, por defecto puesta a false (falso). Establece
+	el nombre del proceso como el nombre del fichero ejecutable. Crea un fichero
+	temporal en el directorio launch4j-tmp dentro del JRE usado. Estos ficheros
+	son borrados por cualquier aplicaciÃ³n empaquetada por launch4j, que
+	establece el nombre del proceso y usa el mismo JRE. El borrado tiene lugar
+	cuando la aplicaciÃ³n <strong>comienza</strong>, asÃ­ que al menos una copia
+	de este fichero siempre estarÃ¡ presente.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;stayAlive&gt;</dt>
+	<dd>
+	<p align="justify">Opcional, por defecto puesta a&nbsp; false (falso) en la
+	cabecera GUI, siempre es true (verdadero) en la cabecera de tipo consola.
+	Cuando estÃ¡ activada, el lanzador espera a que la aplicaciÃ³n finalice y
+	devuelve su cÃ³digo de salida.
+	</dd>
+</dl>
+<dl>
+	<dt>&lt;icon&gt;</dt>
+	<dd>Icono de aplicaciÃ³n en formato ICO. Puede contener varias profundidades
+	de color/resoluciones.</dd>
+</dl>
+<dl>
+	<dt>&lt;headerObjects&gt;</dt>
+	<dd>Opcional, sÃ³lo cabeceras personalizadas. Lista ordenada de los ficheros
+	objeto de cabecera.</dd>
+</dl>
+<dl>
+	<dt>&lt;libs&gt;</dt>
+	<dd>Opcional, sÃ³lo cabeceras personalizadas. Lista ordenada de bibliotecas
+	usadas por la cabecera.</dd>
+</dl>
+<dl>
+	<dt>&lt;jre&gt;</dt>
+	<dd>Elementos requeridos que agrupan la configuraciÃ³n del JRE.</dd>
+</dl>
+<blockquote>
+    <dl>
+    	<dt>&lt;path&gt;, &lt;minVersion&gt;, &lt;maxVersion&gt;</dt>
+        <dd>
+		<p align="justify">La propiedad <em>&lt;path&gt;</em> se usa para especificar
+		la ruta relativa (al ejecutable) de un JRE embebido, que no depende del
+		directorio actual o <em>&lt;chdir&gt;</em>. NÃ³tese que esta ruta no se
+		comprueba hasta la ejecuciÃ³n de la aplicaciÃ³n. Si desea que el
+		empaquetador busque un JRE (pÃºblico o SDK privado) use la propiedad <em>
+		&lt;minVersion&gt;</em>, tambiÃ©n puede especificar <em>&lt;maxVersion&gt; </em> para
+		evitar que se usa una versiÃ³n superior de Java. Launch4j siempre usarÃ¡
+		la versiÃ³n mÃ¡s alta disponible (en el rango mÃ­nimo/mÃ¡ximo, por
+		supuesto). Puede combinar estas propiedades para cambiar el proceso de
+		inicio...</dd>
+	</dl>
+	<blockquote>
+        <dl>
+        	<dt>&lt;path&gt;</dt>
+        	<dd>Se ejecuta si el&nbsp; JRE y javaw.exe estÃ¡n presentes, de otro
+			modo se para con error.</dd>
+            <dt>&lt;path&gt; + &lt;minVersion&gt;&nbsp; [+ &lt;maxVersion&gt;]</dt>
+            <dd>
+			<p align="justify">Usa primero el JRE, si no puede encontrarlo busca
+			Java, si eso falla muestra un mensaje de error y abre la pÃ¡gina de
+			descarga de Java.
+        	</dd>
+            <dt>&lt;minVersion&gt;&nbsp; [+ &lt;maxVersion&gt;]</dt>
+            <dd>Busca Java, si no se encuentra ninguna versiÃ³n correcta, muestra
+			un mensaje de error y abre la pÃ¡gina de descarga de Java.
+        	</dd>
+        </dl>
+	</blockquote>
+</blockquote>
+<blockquote>
+	<dl>
+		<dt>&lt;initialHeapSize&gt;</dt>
+		<dd>Opcional, tamaÃ±o inicial de la pila, en MB, 0 por defecto.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;maxHeapSize&gt;</dt>
+		<dd>Opcional, tamaÃ±o mÃ¡ximo de la pila, en MB, 0 por defecto.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;args&gt;</dt>
+		<dd>
+		<p align="justify">Opcional, acepta todo lo que normalmente se le
+		pasarÃ­a al lanzador java/javaw: opciones assertion, opciones de sistema
+		y opciones X. AquÃ­ puede mapear variables de entorno y variables
+		especiales <em>EXEDIR</em>
+		(directorio del ejecutable), <em>EXEFILE</em> (ruta completa del fichero
+		del ejecutable) a propiedades del sistema. Todas las referencias a las
+		varibles deben ir rodeadas por signos de porcentaje y entre comillas.
+		<pre>-Dlaunch4j.exedir="%EXEDIR%"<br>-Dlaunch4j.exefile="%EXEFILE%"<br>-Denv.path="%Path%"<br>-Dsettings="%HomeDrive%%HomePath%\\app-settings.ini"</pre>
+		</dd>
+	</dl>
+</blockquote>
+
+<dl>
+	<dt>&lt;splash&gt;</dt>
+	<dd>Opcional, agrupa los ajustes de configuraciÃ³n de la pantalla de
+	bienvenida. SÃ³lo permitido en la cabecera GUI.</dd>
+</dl>
+<blockquote>
+	<dl>
+		<dt>&lt;file&gt;</dt>
+		<dd>La imagen de la pantalla de bienvenida en formato BMP.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;waitForWindow&gt;</dt>
+		<dd>
+		<p align="justify">Opcional, por defecto puesta a true (verdadero).
+		Cierra la pantalla de bienvenida cuando aparece la ventana de la
+		aplicaciÃ³n o un mensaje de error de Java. Si se pone a false, la
+		pantalla de bienvenida se cerrarÃ¡ despuÃ©s del tiempo de espera.
+		</dd>
+	</dl>
+	<dl>
+		<dt>&lt;timeout&gt;</dt>
+		<dd>
+		<p align="justify">Tiempo de espera. Opcional, por defecto puesto a 60.
+		NÃºmero de segundos despuÃ©s de que la ventana de bienvenida se cierre. El
+		tiempo de espera puede causar un error dependiendo del <em>&lt;timeoutErr&gt;</em>.
+		</dd>
+	</dl>
+	<dl>
+		<dt>&lt;timeoutErr&gt;</dt>
+		<dd>
+		<p align="justify">Opcional, por defecto puesto a true (verdadero). True
+		seÃ±ala un error despuÃ©s del tiempo de espera de la pantalla de
+		bienvenida, false (falso) cierra la pantalla de bienvenida
+		silenciosamente.
+		</dd>
+	</dl>
+</blockquote>
+
+<dl>
+	<dt>&lt;versionInfo&gt;</dt>
+	<dd>Opcional, informaciÃ³n de la versiÃ³n que se mostrarÃ¡ en el Windows
+	Explorer.</dd>
+</dl>
+<blockquote>
+	<dl>
+		<dt>&lt;fileVersion&gt;</dt>
+		<dd>VersiÃ³n del fichero. NÃºmero de versiÃ³n &#39;x.x.x.x&#39;.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;txtFileVersion&gt;</dt>
+		<dd>VersiÃ³n del fichero. Forma libre de versiÃ³n, por ejemplo &#39;1.20.RC1&#39;.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;fileDescription&gt;</dt>
+		<dd>DescripciÃ³n del fichero presentado al usuario.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;copyright&gt;</dt>
+		<dd>Copyright legal.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;productVersion&gt;</dt>
+		<dd>VersiÃ³n del producto. NÃºmero de versiÃ³n &#39;x.x.x.x&#39;.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;txtProductVersion&gt;</dt>
+		<dd>VersiÃ³n del producto. Forma libre de versiÃ³n, por ejemplo
+		&#39;1.20.RC1&#39;.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;productName&gt;</dt>
+		<dd>Nombre del producto. Texto.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;companyName&gt;</dt>
+		<dd>Nombre de la compaÃ±Ã­a u organizaciÃ³n. Texto opcional.</dd>
+	</dl>
+	<dl>
+		<dt>&lt;internalName&gt;</dt>
+		<dd>Nombre interno sin extensiÃ³n, el nombre original del fichero o el
+		mÃ³dulo, por ejemplo.</dd>
+		<dt>&nbsp;</dt>
+		<dt>&lt;originalFilename&gt;</dt>
+		<dd>Nombre original del fichero sin la ruta. Permite determinar si un
+		fichero ha sido renombrado por un usuario. </dd>
+	</dl>
+</blockquote>
+
+<h2 id="Importing_1.x_configuration">Importando configuraciÃ³n 1.x</h2>
+<p align="justify">Es posible importar un fichero de configuraciÃ³n 1.x usando la
+interfaz grÃ¡fica (GUI). Abra el fichero, corrija las rutas y guÃ¡rdelo como una
+nueva configuraciÃ³n xml.</p>
+<h2 id="Ant_task">Tarea Ant</h2>
+Puede especificar una propiedad de directorio launch4j&nbsp; o cambiar la
+definiciÃ³n de la tarea.
+
+<pre>&lt;property name=&quot;launch4j.dir&quot; location=&quot;/opt/launch4j&quot; /&gt;</pre>
+
+Defina la tarea en su script Ant.
+
+<pre>&lt;taskdef name=&quot;launch4j&quot;<br>  classname=&quot;net.sf.launch4j.ant.Launch4jTask&quot;<br>  classpath=&quot;${launch4j.dir}/launch4j.jar<br>    :${launch4j.dir}/lib/xstream.jar&quot; /&gt;</pre>
+
+Â¡Ejecute la tarea!
+
+<pre>&lt;launch4j configFile=&quot;./l4j/demo.xml&quot; /&gt;</pre>
+
+Puede especificar las siguientes propiedades de configuraciÃ³n...
+<p class="attrib">
+	jar="absolute path or relative to <em>basedir</em>"<br>
+	jarPath="relative path"<br>	
+	outfile<br>
+	fileVersion<br>
+	txtFileVersion<br>
+	productVersion<br>
+	txtProductVersion
+</pn>
+
+<pre>&lt;launch4j configFile=&quot;./l4j/demo.xml&quot;<br>  outfile=&quot;mydemo.exe&quot;<br> &nbsp;fileVersion=&quot;1.0.0.0&quot; txtFileVersion=&quot;1.0 RC2&quot; /&gt;</pre>
+
+<p align="justify">TambiÃ©n puede definir toda la configuraciÃ³n en la tarea, pero
+no serÃ¡ posible editarla en modo grÃ¡fico (GUI). Todos las rutas excepto&nbsp; <em>
+&lt;chdir&gt;</em>, <em>&lt;jre&gt;&lt;path&gt;</em> y <em>jarPath</em>
+se calculan usando el atributo de proyecto <em>basedir</em>.
+</p>
+
+<pre>&lt;launch4j&gt;<br>  &lt;config headerType="0" outfile="demo.exe"<br>      dontWrapJar="true" jarPath="demo.jar" &gt;<br>    &lt;jre minVersion="1.4.0" /&gt;<br>  &lt;/config&gt;<br>&lt;/launch4j&gt;</pre>
+
+<h2 id="Debug_launching_mode">Lanzamiento en modo depuraciÃ³n</h2>
+Para asegurarse de que la salida del ejecutable estÃ¡ configurada correctamente,
+puede usar el lanzamiento en modo depuraciÃ³n que muestra diversa informaciÃ³n
+antes de ejecutar la aplicaciÃ³n Java. Para habilitarlo ponga la variable de
+entorno <em>launch4j=debug </em> y ejecute el programa empaquetado.<pre>set launch4j=debug<br>app.exe</pre>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal <br>
+				TraducciÃ³n al espaÃ±ol Copyright &copy; 2005-2006 Patricio MartÃ­nez Ros
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/index.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/index.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/index.html	(revision 15023)
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Cross-platform Java executable wrapper</title>
+		<meta name="description" content="Cross-platform Java executable wrapper for creating lightweight Windows native EXEs. Provides better user experience.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index.html">Home</a></li>
+					<li><a href="docs.html">Docs</a></li>
+					<li><a href="changelog.html">Changelog</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Screenshots</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Download</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Support</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Project summary</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Bug tracker</a></li>
+					<li><a href="links.html">Links</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2>Cross-platform Java executable wrapper</h2>
+<p>
+    Launch4j is a cross-platform tool for wrapping
+    Java applications distributed as jars in lightweight Windows
+    native executables. The executable can be
+    configured to search for a certain JRE version or
+    use a bundled one, and it's possible to set
+    runtime options, like the initial/max heap size.
+    The wrapper also provides better user experience
+    through an application icon, a native pre-JRE
+    splash screen, a custom process name, and a Java
+    download page in case the appropriate JRE cannot
+    be found.
+</p>
+<img style="width: 352px; height: 498px; margin-left: 100px;" src="launch4j-use.gif" alt="How to use Launch4j">
+<h2>Features</h2>
+<ul>
+	<li>Launch4j wraps jars in Windows native executables and allows to run them
+		like a regular Windows program. It's possible to wrap applications
+		on Windows, Linux, Mac OS X and Solaris!
+	</li>
+	<li>Also creates <strong>launchers</strong> without wrapping jars.</li>
+	<li><strong>Doesn't extract the jar</strong> from the executable.</li>
+	<li>Custom application icon with multiple resolutions and color depths.</li>
+	<li><strong>Native pre-JRE splash screen</strong> in BMP format shown until
+		the Java application starts.
+	</li>
+	<li><strong>Process name</strong> as the executable filename to easily
+		identify your application.
+	</li>
+	<li>Works with a bundled JRE or searches for newest JRE / SDK in given range.</li>
+	<li>Opens <strong>Java download page</strong> if an appropriate Java version cannot be found.</li>
+	<li>Supports <strong>GUI and console apps</strong>.</li>
+	<li>Passes command line arguments, also supports constant arguments.</li>
+	<li>Allows to set the initial/max heap size.</li>
+	<li>JVM options: set system properties, tweak the garbage collection...</li>
+	<li>Runtime JVM options from an .ini file.</li>
+	<li>Access to environment variables and executable file path through system properties.</li>
+	<li>Option to change current directory to the executable location.</li>
+	<li>The JRE's bin directory is appended to the Path environment variable.</li>
+	<li>Custom <strong>version information</strong> shown by Windows Explorer.</li>
+	<li><strong>GUI</strong> and command line interface.</li>
+	<li>Build integration through an <strong>Ant task</strong>.</li>
+	<li><big><strong>Lightweight: 18 KB!</strong></big></li>
+	<li><strong>It's free</strong> and may be used for commercial purposes.</li>
+	<li>Includes a sample application and <strong>Ant script</strong>
+		that automates the build process from Java sources to native executable.
+	</li>
+	<li>The wrapped program works on all Windows platforms (98/Me/NT/2K/Xp),
+		Launch4j works on NT/2K/Xp, Linux (developed and tested on FC3 / CentOS 4.1),
+		Mac OS X (build on 10.4) and Sparc Solaris 8-10.
+	</li>
+</ul>
+<h2>License</h2>
+<p>
+	This program is free software licensed under the
+	<a href="http://www.gnu.org/copyleft/gpl.html">GPL license</a>, the <em>head</em> subproject
+	(the code which is attached to the wrapped jars) is licensed under the
+	<a href="http://www.gnu.org/copyleft/lesser.html">LGPL license</a>.
+	Launch4j may be used for wrapping closed source, commercial applications.
+</p>
+<h2>Info</h2>
+<p>
+	Running Launch4j on other Java enabled platforms is a matter of getting a binary version
+	of <a href="http://www.mingw.org/">MinGW</a> binutils 2.15.90 (<em>windres</em> and <em>ld</em> only)
+	for your system or compiling them. If you'll provide these, I'll be able to create a binary package
+	available for download.
+</p>
+<a href="http://sourceforge.net/forum/forum.php?forum_id=332683"></a>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/index_es.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/index_es.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/index_es.html	(revision 15023)
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows</title>
+		<meta name="description" content="Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows. Con funcionalidad para pantallas de bienvenida nativas, icono de aplicaciÃ³n, empaquetado de poco tamaÃ±o.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index_es.html">Inicio</a></li>
+					<li><a href="docs_es.html">DocumentaciÃ³n</a></li>
+					<li><a href="changelog_es.html">Historial de cambios</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Capturas de pantalla</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Descarga</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Soporte</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Resumen del proyecto</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Informes de errores</a></li>
+					<li><a href="links_es.html">Enlaces</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2 style="font-size: 100%">Empaquetador cross-platform de aplicaciones Java para crear 
+EXEs nativos de Windows.</h2>
+<p>
+    Launch4j es una herramienta cross-platform para empaquetar aplicaciones Java 
+	distribuidas como jars en ejecutables ligeros y nativos de Windows. El 
+	ejecutable puede ser configurado para buscar una cierta versiÃ³n del JRE o 
+	usar uno que se especifique, y es posible establecer opciones de tiempo de 
+	ejecuciÃ³n, como el tamaÃ±o inicial/mÃ¡ximo de la pila. El empaquetador tambiÃ©n 
+	proporciona una mejor experiencia de usuario incluyendo un icono de 
+	aplicaciÃ³n, una pantalla de bienvenida nativa pre-JRE, un nombre de proceso 
+	personalizado, y una pÃ¡gina de descarga de Java en caso de que el JRE 
+	apropiado no se pueda encontrar.</p>
+<h2>CaracterÃ­sticas</h2>
+<ul>
+	<li>Launch4j empaqueta jars en ejecutables nativos de Windows y permite 
+	ejecutarlos como un programa Windows normal. Â¡Es posible empaquetar 
+	aplicaciones desde Windows, Linux y MacOS X!
+	</li>
+	<li>TambiÃ©n crea lanzadores sin empaquetar jars.</li>
+	<li><strong>No extrae el&nbsp; jar </strong>desde el ejecutable.</li>
+	<li>Icono de aplicaciÃ³n personalizado con mÃºltiples resoluciones y 
+	profundidades de color.</li>
+	<li><strong>Pantalla de bienvenida nativa pre-JRE </strong>en formato BMP 
+	mostrada hasta que la aplicaciÃ³n Java empieza.
+	</li>
+	<li><strong>Nombre del proceso </strong>como nombre de fichero de ejecutable 
+	para identificar fÃ¡cilmente su aplicaciÃ³n.
+	</li>
+	<li>Funciona con un JRE que se especifique o busca el JRE /SDK mÃ¡s reciente 
+	dentro de un rango dado.</li>
+	<li>Abre <strong>la pÃ¡gina de descargas de Java </strong>si no se puede 
+	encontrar una versiÃ³n apropiada de Java.</li>
+	<li>Soporta <strong>aplicaciones GUI y de consola</strong>.</li>
+	<li>Pasa argumentos a la lÃ­nea de Ã³rdenes, tambiÃ©n soporta argumentos 
+	constantes.</li>
+	<li>Permite establecer el tamaÃ±o inicial/mÃ¡ximo de la pila.</li>
+	<li>Opciones JVM: establecer las propiedades del sistema, modificar la 
+	garbage collection...</li>
+	<li>Acceso a las variables de entorno y a la ruta del fichero ejecutable a 
+	travÃ©s de las propiedades del sistema.</li>
+	<li>OpciÃ³n para cambiar el directorio actual a la localizaciÃ³n del 
+	ejecutable.</li>
+	<li>El directorio bin del JRE se une a la variable de entorno Path.</li>
+	<li><strong>InformaciÃ³n personalizada de la versiÃ³n</strong> mostrada en 
+	Windows Explorer.</li>
+	<li>Interfaz<strong> GUI</strong> y de lÃ­nea de Ã³rdenes.</li>
+	<li>IntegraciÃ³n en la construcciÃ³n a travÃ©s de una <strong>tarea Ant</strong>.</li>
+	<li><big><strong>Â¡Ligero: 18 KB!</strong></big></li>
+	<li><strong>Es gratuito</strong> y puede ser utilizado para propÃ³sitos 
+	comerciales.</li>
+	<li>Incluye una aplicaciÃ³n de ejemplo y un <strong>script Ant</strong>
+		que automatiza el proceso de construcciÃ³n desde el cÃ³digo fuente Java 
+	hasta el ejecutable nativo.
+	</li>
+	<li>El programa empaquetado funciona en todas las plataformas Windows (98/Me/NT/2K/Xp),
+		launch4j funciona en NT/2K/Xp, Linux (desarrollado y probado en FC3/ CentOS 
+	4.1) y Mac OS X (construido en 10.4).
+	</li>
+</ul>
+<h2>Licencia</h2>
+<p>
+	Este programa es software libre licenciado bajo la
+	<a href="http://www.gnu.org/copyleft/gpl.html">licencia GPL</a>, el 
+	subproyecto de la cabecera
+	(el cÃ³digo que se adjunta a los jars empaquetados) tiene
+	<a href="http://www.gnu.org/copyleft/lesser.html">licencia LGPL</a>.
+	Launch4j puede ser utilizado para empaquetar cÃ³digo fuente cerrado, 
+	aplicaciones comerciales.
+</p>
+<h2>InformaciÃ³n</h2>
+<p>
+	Ejecutar Launch4j en otras plataformas con Java es cuestiÃ³n de obtener una 
+	versiÃ³n binaria de <a href="http://www.mingw.org/">MinGW</a> binutils 2.15.90 (<b>windres</b> 
+	y <b>ld</b> solamente)
+	para su sistema o compilÃ¡ndolo. Si consigue esto, entonces yo podrÃ­a crear 
+	un paquete binario para descargar.
+</p>
+<a href="http://sourceforge.net/forum/forum.php?forum_id=332683"></a>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal <br>
+				TraducciÃ³n al espaÃ±ol Copyright &copy; 2005-2006 Patricio MartÃ­nez Ros
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/links.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/links.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/links.html	(revision 15023)
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Cross-platform Java executable wrapper</title>
+		<meta name="description" content="Cross-platform Java executable wrapper for creating lightweight Windows native EXEs. Provides better user experience.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index.html">Home</a></li>
+					<li><a href="docs.html">Docs</a></li>
+					<li><a href="changelog.html">Changelog</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Screenshots</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Download</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Support</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Project summary</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Bug tracker</a></li>
+					<li><a href="links.html">Links</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2>Links</h2>
+<p>
+	<a href="http://www.mingw.org/">MinGW</a><br>
+	<a href="http://jakarta.apache.org/commons/beanutils/">Commons BeanUtils</a><br>
+	<a href="http://jakarta.apache.org/commons/logging/">Commons Logging</a><br>
+	<a href="http://xstream.codehaus.org/">XStream</a><br>
+	<a href="http://www.jgoodies.com/freeware/forms/">JGoodies Forms</a><br>
+	<a href="http://www.jgoodies.com/freeware/looks/">JGoodies Looks</a><br>
+	<a href="http://www.icon-king.com/">Nuvola Icon Theme</a><br>
+	<a href="http://abeille.dev.java.net/">Abeille Forms Designer</a><br>
+	<a href="http://www.eclipse.org/">Eclipse</a><br>
+	<a href="http://www.bloodshed.net/devcpp.html">Bloodshed Dev-C++ IDE</a><br>
+</p>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/links_es.html
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/links_es.html	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/links_es.html	(revision 15023)
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+	<head>
+		<title>Launch4j - Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows</title>
+		<meta name="description" content="Empaquetador cross-platform de aplicaciones Java para crear ejecutables nativos de Windows. Con funcionalidad para pantallas de bienvenida nativas, icono de aplicaciÃ³n, empaquetado de poco tamaÃ±o.">
+		<meta name="keywords" content="java executable wrapper, java application wrapper, exe wrapper, jar wrapper, wrap, wraps, wrapping, free software, launch, launcher, linux, mac, windows, open source, ant, solaris, native splash screen, deploy, build tool">
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="author" content="Grzegorz Kowal" >
+		<link rel="stylesheet" type="text/css" href="style.css">
+	</head>
+	<body>
+		<div id="container">
+			<div id="top">
+				<img style="width: 249px; height: 58px;" src="launch4j.gif" alt="launch4j"> <span class="version">2.1.5</span>
+			</div>
+			<div id="leftnav">
+				<ul>
+					<li><a href="index_es.html">Inicio</a></li>
+					<li><a href="docs_es.html">DocumentaciÃ³n</a></li>
+					<li><a href="changelog_es.html">Historial de cambios</a></li>
+					<li><a href="http://sourceforge.net/project/screenshots.php?group_id=95944">Capturas de pantalla</a></li>
+					<li><a href="http://sourceforge.net/project/showfiles.php?group_id=95944&amp;package_id=152236">Descarga</a></li>
+					<li><a href="http://sourceforge.net/forum/?group_id=95944">Soporte</a></li>
+					<li><a href="http://sourceforge.net/projects/launch4j">Resumen del proyecto</a></li>
+					<li><a href="http://sourceforge.net/tracker/?atid=613100&amp;group_id=95944">Informes de errores</a></li>
+					<li><a href="links_es.html">Enlaces</a></li>
+				</ul>
+				<ul style="margin-top: 20px; font-size: 75%">
+					<li><a href="index.html">English</a></li>
+					<li><a href="index_es.html">EspaÃ±ol</a></li>
+				</ul>
+			</div>
+			<div id="content">
+<h2>Enlaces</h2>
+<p>
+	<a href="http://www.mingw.org/">MinGW</a><br>
+	<a href="http://jakarta.apache.org/commons/beanutils/">Commons BeanUtils</a><br>
+	<a href="http://jakarta.apache.org/commons/logging/">Commons Logging</a><br>
+	<a href="http://xstream.codehaus.org/">XStream</a><br>
+	<a href="http://www.jgoodies.com/freeware/forms/">JGoodies Forms</a><br>
+	<a href="http://www.jgoodies.com/freeware/looks/">JGoodies Looks</a><br>
+	<a href="http://www.icon-king.com/">Nuvola Icon Theme</a><br>
+	<a href="http://abeille.dev.java.net/">Abeille Forms Designer</a><br>
+	<a href="http://www.eclipse.org/">Eclipse</a><br>
+	<a href="http://www.bloodshed.net/devcpp.html">Bloodshed Dev-C++ IDE</a><br>
+</p>
+			</div>
+			<div class="footer">
+            	Copyright &copy; 2005-2006 Grzegorz Kowal <br>
+				TraducciÃ³n al espaÃ±ol Copyright &copy; 2005-2006 Patricio MartÃ­nez Ros
+            	<p style="margin-top: 2em">
+            		<a href="http://sourceforge.net"><img style="width: 125px; height: 37px; border: none" src="http://sourceforge.net/sflogo.php?group_id=95944&amp;type=4" alt="sf.net"></a>
+            		<a href="http://www.nosoftwarepatents.com"><img style="width: 90px; height: 40px; border: none; margin-left: 5%" src="http://www.nosoftwarepatents.com/banners/90x40_3.jpg" alt=""></a>
+            		<a href="http://validator.w3.org/check?uri=referer"><img style="width: 88px; height: 31px; border: none; margin-left: 5%" src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
+            	</p>
+			</div>
+		</div>
+	</body>
+</html>
Index: /release-kits/wirk3/bin/launch4j/web/style.css
===================================================================
--- /release-kits/wirk3/bin/launch4j/web/style.css	(revision 15023)
+++ /release-kits/wirk3/bin/launch4j/web/style.css	(revision 15023)
@@ -0,0 +1,155 @@
+body, table {
+	font: 12px/20px Verdana, Arial, Helvetica, sans-serif;
+}
+
+
+pre {
+	padding: 8px;
+	border: 1px dashed #999999;
+	background-color: #f1f1f1;
+	font: 13px/20px "Courier New", Courier, monospace;
+}
+
+
+.version {
+	color: #307fe1;
+	font-weight: bold;
+}
+
+
+.codeword {
+	color: #3333ff;
+}
+.attrib {
+	color: #404040;
+}
+
+
+dt {
+	margin-top: 1.5em;
+	color: #404040;
+	font-size: 115%;
+	border-bottom: 1px solid #cccccc;
+}
+dd {
+	margin-left: 1em;
+}
+
+
+ul.changes em {
+	color: #ff0000;
+}
+
+
+table {
+	margin-top: 1em;
+	padding: 0;
+	border: 1px solid #999999;
+	border-collapse: collapse;
+	text-align: center;
+}
+table th {
+	padding: 2px 4px;
+	border: 1px solid #999999;
+	background-color: #f1f1f1;
+}
+table td {
+	padding: 2px 4px;
+	border: 1px solid #999999;
+}
+.description {
+	text-align: left;
+}
+
+
+#container {
+	width: 90%;
+	margin: 10px auto;
+	border-width: 0;
+	background-color: #ffffff;
+}
+
+
+#top {
+	padding: 0.5em;
+	background-color: #ffffff;
+}
+#top h1 {
+	margin: 0;
+	padding: 0;
+}
+
+
+#leftnav {
+	float: left;
+	width: 170px;
+	margin: 0;
+	padding: 0.5em;
+	background-color: #ffffff;
+}
+#leftnav ul {
+	margin: 0;
+	padding: 0;
+	border: none;
+	list-style-type: none;
+	font-size: 115%;
+}
+#leftnav a {
+	width: 170px;
+	height: 1.6em;
+	line-height: 1.6em;
+	display: block;
+	padding-left: 0.2em;
+}
+#leftnav a:link, #leftnav a:visited {
+	text-decoration: none;
+	color: #666666;
+}
+#leftnav a:hover {
+	background-color: #307fe1;
+	color: #ffffff;
+}
+
+
+#content {
+	max-width: 52em;
+	margin-left: 190px;
+	padding: 1em;
+	border-left: 1px solid #cccccc;
+	background-color: #ffffff;
+}
+
+#content ul {
+	list-style-image: url('bullet.gif');
+}
+
+#content a:link {
+	text-decoration: none;
+	color: #307fe1;
+}
+#content a:visited {
+	text-decoration: none;
+	color: #307fe1;
+}
+#content a:hover {
+	color: #307fe1;
+	text-decoration: underline;
+}
+
+#content h2 {
+	font-size: 150%;
+}
+#content h2:first-child {
+	margin: 0 0 0.5em;
+}
+
+
+.footer {
+	clear: both;
+	margin: 0;
+	padding: 0.5em;
+	background-color: #ffffff;
+	color: #333333;
+	text-align: center;
+	font-size: 90%;
+}
Index: /release-kits/wirk3/bin/make.bat
===================================================================
--- /release-kits/wirk3/bin/make.bat	(revision 15023)
+++ /release-kits/wirk3/bin/make.bat	(revision 15023)
@@ -0,0 +1,1 @@
+cl -GX ..\src\wirk3.cpp -o wirk3.exe 
Index: /release-kits/wirk3/installer/README
===================================================================
--- /release-kits/wirk3/installer/README	(revision 15023)
+++ /release-kits/wirk3/installer/README	(revision 15023)
@@ -0,0 +1,2 @@
+build.xml	.	.	.	.	.	.	ant script which does the installation of files during install on the user's machine
+antinstall-config.xml	.	.	describes the installer wizard
Index: /release-kits/wirk3/installer/antinstall-config.xml
===================================================================
--- /release-kits/wirk3/installer/antinstall-config.xml	(revision 15023)
+++ /release-kits/wirk3/installer/antinstall-config.xml	(revision 15023)
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<!DOCTYPE installer PUBLIC "-//tp23 //DTD Ant Installer Config//EN" "http://antinstaller.sf.net/dtd/antinstall-config-0.8.dtd">
+<installer
+			ui="swing,text"
+			verbose="true"
+			debug="false"
+			lookAndFeel="org.tp23.jgoodies.plaf.plastic.PlasticXPLookAndFeel"
+			name="Greenstone3Installer"
+			windowIcon="/resources/gkmain_inv.png"
+			defaultImageResource="/resources/makewavesdawn.png"
+			minJavaVersion="1.4">
+
+	<!--  each page element represents a page of the installer -->
+	<page
+			type="input"
+			name="intro"
+			displayText="Welcome to the Greenstone3 installer">
+	</page>
+
+	<!--  type="license" shows a license page to click through -->
+	<page
+			type="license"
+			name="license"
+			displayText="License conditions"
+			resource="/LICENSE.txt">
+	</page>
+
+	<!--  type="input" shows a list of editable options for the installer -->
+	<page
+			type="input"
+			name="destination"
+			displayText="Install Destination">
+
+		<directory
+				property="installDir"
+				defaultValue="/usr/local/Greenstone-@version@"
+				defaultValueWin="${env.ProgramFiles}\Greenstone-@version@"
+				displayText="Select an installation directory"
+				create="true"/>
+
+	</page>
+
+	<page type="input" name="tomcatports" displayText="Tomcat Ports">
+
+		<comment displayText="Please select the ports which the web server (Apache Tomcat) will use  will use. It is usually safe to accept the defaults by just clicking Next. The exception is when you are running other services on these ports - if this is the case, select some free ports and click Next."/>
+
+		<text property="tomcat.port" defaultValue="8080" displayText="Tomcat Port"/>
+		<text property="tomcat.shutdown.port" defaultValue="8005" displayText="Tomcat Shutdown Port"/>
+	</page>
+
+
+	<page
+			type="input"
+			name="selector"
+			displayText="Components to install">
+		<comment
+				displayText="Choose the components you want to install"
+				bold="true"/>
+		<target
+			displayText="Core components"
+			target="default"
+			defaultValue="true"
+			force="true"/>
+		
+		<target
+			displayText="Source code"
+			target="tgsrc"
+			defaultValue="false"/>
+		
+	</page>
+
+	<page
+			type="progress"
+			name="progress"
+			displayText="Installation progress"
+			showTargets="false"
+			target="cleanuptarget">
+	</page>
+
+</installer>
Index: /release-kits/wirk3/installer/build.xml
===================================================================
--- /release-kits/wirk3/installer/build.xml	(revision 15023)
+++ /release-kits/wirk3/installer/build.xml	(revision 15023)
@@ -0,0 +1,137 @@
+<?xml version="1.0"?>
+<!--
+This is the build.xml run by AntInstaller for the installer
+-->
+
+<project name="Installation" default="" basedir="${basedir}">
+
+	<!-- this is required to pick up the properties generated during the install pages -->
+	<property file="${basedir}/ant.install.properties"/>
+
+	<path id="project.classpath">
+		<pathelement path="${antinstaller.jar}"/>
+	</path>
+
+	<!-- custom tasks -->
+	<typedef name="rsr" classname="RegexSearchReplace" classpathref="project.classpath"/>
+
+	<target name="default" depends="">
+
+		<!-- create the installation directory -->
+		<echo message="Creating Installation directory"/>
+		<echo>basedir: ${basedir}</echo>
+		<echo>installDir: ${installDir}</echo>
+		<echo>antinstaller.jar: ${antinstaller.jar}</echo>
+		<mkdir dir="${installDir}"/>
+
+
+		<!-- install binaries  -->
+		<echo message="Installing Executable Binaries (bin)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="bin/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Documentation (docs)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="docs/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing GLI (gli)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="gli/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing gs2build (gs2build)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="gs2build/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Libraries (lib)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="lib/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Web Content (web)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="web/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Packages (packages)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="packages/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Resources (resources)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="resources/**/*"/></patternset></unzip>
+		<echo/>
+
+		<echo message="Installing Windows Utility Commands (winutil)"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}"><patternset><include name="winutil/**/*"/></patternset></unzip>
+		<echo/>
+
+		
+		<echo message="Installing Top Level Files"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="build.xml"/>
+				<include name="build.properties"/>
+				<include name="gs3-server.bat"/>
+				<include name="gs3-setup.bat"/>
+				<include name="LICENSE.txt"/>
+				<include name="README.txt"/>
+				<include name="server.jar"/>
+			</patternset>
+		</unzip>
+		<echo/>
+
+		<!-- change the tomcat ports in build.properties -->
+		<echo message="Changing tomcat ports in build.properties"/>
+		<rsr file="${installDir}/build.properties" pattern="(tomcat.port[=:]).*" replacement="$1${tomcat.port}" />
+		<rsr file="${installDir}/build.properties" pattern="(tomcat.shutdown.port[=:]).*" replacement="$1${tomcat.shutdown.port}" />
+
+		<!-- change the tomcat ports in tomcats server.xml -->
+		<echo message="Changing tomcat ports tomcat's server.xml"/>
+		<copy file="${installDir}/resources/tomcat/server.xml" tofile="${installDir}/packages/tomcat/conf/server.xml" overwrite="true"/>
+		<rsr file="${installDir}/packages/tomcat/conf/server.xml" pattern="(.*)@port@(.*)" replacement="$1${tomcat.port}$2" />
+		<rsr file="${installDir}/packages/tomcat/conf/server.xml" pattern="(.*)@shutdown-port@(.*)" replacement="$1${tomcat.shutdown.port}$2" />
+		
+		<!-- copy the greenstone3.xml file to tomcat -->
+		<echo message="Copying greenstone3.xml to tomcat directory"/>
+		<copy file="${installDir}/resources/tomcat/greenstone3.xml" tofile="${installDir}/packages/tomcat/conf/Catalina/localhost/greenstone3.xml" overwrite="true"/>
+		<rsr file="${installDir}/packages/tomcat/conf/Catalina/localhost/greenstone3.xml" pattern="(.*)@gsdl3webhome@(.*)" replacement="$1${installDir}/web$2" />
+
+		<!-- set up global properties -->
+		<echo message="Setting up global properties"/>
+		<copy file="${installDir}/resources/java/global.properties.in" tofile="${installDir}/web/WEB-INF/classes/global.properties" overwrite="true"/>
+		<rsr file="${installDir}/web/WEB-INF/classes/global.properties" pattern="(.*)@gsdl3home@(.*)" replacement="$1${installDir}/web$2" />
+		<rsr file="${installDir}/web/WEB-INF/classes/global.properties" pattern="(.*)@tomcat.server@(.*)" replacement="$1localhost$2" />
+		<rsr file="${installDir}/web/WEB-INF/classes/global.properties" pattern="(.*)@tomcat.port@(.*)" replacement="$1${tomcat.port}$2" />
+
+		<!-- set up log4j properties-->
+		<echo message="Setting up log4j properties"/>
+		<copy file="${installDir}/resources/java/log4j.properties.in" tofile="${installDir}/web/WEB-INF/classes/log4j.properties" overwrite="true"/>
+		<rsr file="${installDir}/web/WEB-INF/classes/log4j.properties" pattern="(.*)@gsdl3home@(.*)" replacement="$1${installDir}/web$2" />
+
+		<!-- in the gs3-setup.sh file, set ANT_HOME and put it in PATH -->
+		<echo>In the gs3-setup.sh file, set ANT_HOME and put it in PATH</echo>
+		<exec executable="cmd" output="${installDir}/gs3-setup.sh" append="true">
+			<arg
+			line="/C echo set ANT_HOME=${installDir}/packages/ant
+set PATH=%ANT_HOME%/bin:%PATH%"/>
+		</exec>
+
+		<!-- delete unneeded files -->	    
+		<delete dir="${installDir}/resources/icons"/>
+		<delete file="${installDir}/resources/*.png"/>
+
+	</target>
+
+	<!-- Source -->
+	<target name="tgsrc" depends="">
+		<echo message="Installing Source Code (src)"/>
+		<mkdir dir="${installDir}/src"/>
+		<unzip src="${antinstaller.jar}" dest="${installDir}">
+			<patternset>
+				<include name="src/**/*"/>
+			</patternset>
+		</unzip>
+	</target>
+
+	<target name="cleanuptarget">
+	</target>
+	
+
+</project>
Index: /release-kits/wirk3/launcher/launcher.xml
===================================================================
--- /release-kits/wirk3/launcher/launcher.xml	(revision 15023)
+++ /release-kits/wirk3/launcher/launcher.xml	(revision 15023)
@@ -0,0 +1,20 @@
+<launch4jConfig>
+  <dontWrapJar>true</dontWrapJar>
+  <headerType>0</headerType>
+  <jar>greenstone3.jar</jar>
+  <outfile>@basedir@\launcher\launch-installer.exe</outfile>
+  <errTitle></errTitle>
+  <jarArgs></jarArgs>
+  <chdir></chdir>
+  <customProcName>false</customProcName>
+  <stayAlive>false</stayAlive>
+  <icon></icon>
+  <jre>
+    <path></path>
+    <minVersion>1.4.0</minVersion>
+    <maxVersion></maxVersion>
+    <initialHeapSize>0</initialHeapSize>
+    <maxHeapSize>0</maxHeapSize>
+    <args></args>
+  </jre>
+</launch4jConfig>
Index: /release-kits/wirk3/src/wirk3.cpp
===================================================================
--- /release-kits/wirk3/src/wirk3.cpp	(revision 15023)
+++ /release-kits/wirk3/src/wirk3.cpp	(revision 15023)
@@ -0,0 +1,95 @@
+#include <windows.h>
+
+#include <fstream>
+#include <iostream>
+#include <string>
+
+using namespace std;
+
+void replace_all ( std::string & str, std::string const & pattern, std::string const & replacement ) {
+
+	std::string::size_type start = str.find( pattern, 0 );
+
+	while ( start != str.npos ) {
+		str.replace( start, pattern.size(), replacement );
+		start = str.find( pattern, start+replacement.size() );
+	}
+
+}
+
+int main(int argc, char** argv ) {
+
+	string classpath, command;
+	
+	//influential environment variables
+	string JAVA_HOME = getenv( "JAVA_HOME" );
+	string WIRK3_HOME = getenv( "WIRK3_HOME" );
+	//string PWD = getenv( "CD" );
+	
+	//set the classpath
+	classpath = JAVA_HOME + "\\lib\\tools.jar;" + WIRK3_HOME + "\\lib\\serializer.jar;" + WIRK3_HOME + "\\lib\\xalan.jar;" + WIRK3_HOME + "\\lib\\xercesImpl.jar;" + WIRK3_HOME + "\\lib\\xml-apis.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-antlr.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-bcel.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-bsf.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-log4j.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-oro.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-regexp.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-apache-resolver.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-commons-logging.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-commons-net.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-icontract.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-jai.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-javamail.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-jdepend.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-jmf.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-jsch.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-junit.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-launcher.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-netrexx.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-nodeps.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-starteam.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-stylebook.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-swing.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-trax.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-vaj.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-weblogic.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-xalan1.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\ant-xslp.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\xercesImpl.jar;" + WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\lib\\xml-apis.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ai-icons-amaranth.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ai-icons-bluecurve.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ai-icons-crystalsvg.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ai-icons-eclipse.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ai-icons-krystaline.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ant-installer-ext.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\ant-installer.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\jgoodies-edited-1_2_2.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\xercesImpl.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\lib\\xml-apis.jar;" + WIRK3_HOME + "\\bin\\ant-installer\\classes";
+	putenv( ("CLASSPATH=" + classpath).c_str() );
+
+	//check that it worked
+	//string changed_classpath = getenv("CLASSPATH");
+	//cout << "classpath: " << changed_classpath << endl;
+	
+	//create the command
+	command = WIRK3_HOME + "\\bin\\apache-ant-1.6.5\\bin\\ant.bat -f " + WIRK3_HOME + "\\ant-scripts\\build.xml -Dwirk3.home=" + WIRK3_HOME;
+	
+	//pass on the arguments
+	string a;
+	for ( int i=0; i < argc; i++ ) {
+		a = argv[i];
+			
+		if ( a.compare("-help") == 0 ) {
+			//show_help();
+			return 0;
+		
+		} else if ( a.compare("-cp") == 0) {
+			cout << classpath;
+			return 0;
+
+		} else if ( a.compare("-sim") == 0 ) {
+			command += " -Dexecute=false";
+
+		} else if ( a.compare("-descend") == 0 ) {
+			command += " -Dresume.mode=descend";
+			
+		} else if ( a.compare("-from") == 0 ) {
+			command = command + " -Dresume.from=" + argv[++i];
+			//from=`echo $2 | sed 's/compile/1/g' | sed 's/create-distributions/2/g' | sed 's/create-installer/3/g' | sed 's/wrap/4/g'`
+			//toexec=$toexec$from
+		} else if ( a.compare("-to") == 0 ) {
+			command = command + " -Dresume.to=" + argv[++i];
+			//to=`echo $2 | sed 's/compile/1/g' | sed 's/create-distributions/2/g' | sed 's/create-installer/3/g' | sed 's/wrap/4/g'`
+			//toexec=$toexec$to
+		} else {
+			command = command + " " + a;
+		}
+
+	}
+	//get the pwd
+	string pwd;
+	system( "CD > cd.dat" );
+	ifstream file( "cd.dat" ) ;
+	getline(file, pwd);
+	file.close();
+	system( "del cd.dat" );
+	replace_all( pwd, "\\", "/" );
+	
+	//set the basedir in the command
+	command = command + " -Dbasedir=";
+	command = command + pwd;
+	//command = command + ".";
+
+	cout << "---------" << endl << "  WiRK3" << endl << "---------" << endl;
+	
+	cout << "pwd: " << pwd << endl;
+	cout << "command: " << command << endl;
+
+	system( command.c_str() );
+	
+	return 0;
+
+}
Index: lease-kits/wirk3/wrapper/newwrapper.cpp
===================================================================
--- /release-kits/wirk3/wrapper/newwrapper.cpp	(revision 15022)
+++ 	(revision )
@@ -1,65 +1,0 @@
-#include <windows.h>
-
-#include <fstream>
-#include <iostream>
-
-using namespace std;
-
-void WriteUsingStream(BYTE* pBytes, int nCount, char* filename)
-{
-	ofstream fStream(filename, ios::binary | ios::out);
-
-	fStream.write((char*) pBytes, nCount);
-	fStream.close();
-}
-
-void main()
-{
-	HMODULE hModule = GetModuleHandle(NULL);
-
-	//HRSRC hRsrc = FindResource(hModule, MAKEINTRESOURCE(IDR_JAR1), "JAR");
-	HRSRC hRsrc = FindResource(hModule, "IDR_JAR1", "JAR");
-
-	if (hRsrc == NULL)
-	{
-		cout << "Could not find resource." << endl;
-	}
-	else
-	{
-		HGLOBAL hGlobal = LoadResource(hModule, hRsrc);
-		if (hGlobal == NULL)
-		{
-			cout << "Could not lock resource." << endl;
-		}
-		else
-		{
-			BYTE* pBytes = (BYTE*) LockResource(hGlobal);
-			if (pBytes == NULL)
-			{
-				cout << "Could not lock resource." << endl;
-			}
-			else
-			{
-				DWORD dwLength = SizeofResource(hModule, hRsrc);
-				system("mkdir newwrapper.tmp");
-				WriteUsingStream(pBytes, dwLength, "newwrapper.tmp\\WebTransform.jar");
-				UnlockResource(hGlobal);
-			}
-
-			FreeResource(hGlobal);
-		}
-	}
-	
-	
-	//change to the temp directory and start the jar
-	SetCurrentDirectory("newwrapper.tmp");
-	system("java -jar WebTransform.jar");
-	
-	//change back to the original directory and clean up the temp directory
-	SetCurrentDirectory("..");
-	system("del newwrapper.tmp\\WebTransform.jar");
-	system("del newwrapper.tmp\\ant.install.log");
-	system("rmdir newwrapper.tmp");
-	
-	
-}
Index: lease-kits/wirk3/wrapper/newwrapper.rc
===================================================================
--- /release-kits/wirk3/wrapper/newwrapper.rc	(revision 15022)
+++ 	(revision )
@@ -1,1 +1,0 @@
-IDR_JAR1	JAR	"wt.jar"
Index: /release-kits/wirk3/wrapper/wrapper-with-jre.rc
===================================================================
--- /release-kits/wirk3/wrapper/wrapper-with-jre.rc	(revision 15023)
+++ /release-kits/wirk3/wrapper/wrapper-with-jre.rc	(revision 15023)
@@ -0,0 +1,5 @@
+GREENSTONE_JAR JAR "greenstone3.jar"
+LAUNCHER EXE "launch-installer.exe"
+JAVA EXE "@java.installer@"
+MAINICON ICON "gs3.ico"
+
Index: /release-kits/wirk3/wrapper/wrapper.cpp
===================================================================
--- /release-kits/wirk3/wrapper/wrapper.cpp	(revision 15023)
+++ /release-kits/wirk3/wrapper/wrapper.cpp	(revision 15023)
@@ -0,0 +1,99 @@
+#include <windows.h>
+
+#include <fstream>
+#include <iostream>
+
+using namespace std;
+
+void WriteUsingStream(BYTE* pBytes, int nCount, char* filename)
+{
+	ofstream fStream(filename, ios::binary | ios::out);
+
+	fStream.write((char*) pBytes, nCount);
+	fStream.close();
+}
+
+int extractResource(const char * name, const char * type, char * file) {
+
+	HMODULE hModule = GetModuleHandle(NULL);
+
+	HRSRC hRsrc = FindResource(hModule, name, type);
+	if (hRsrc == NULL) return 1; //couldn't find
+
+	HGLOBAL hGlobal = LoadResource(hModule, hRsrc);
+	if (hGlobal == NULL) return 1; //couldn't lock
+
+	BYTE* pBytes = (BYTE*) LockResource(hGlobal);
+	if (pBytes == NULL) return 1; //couldn't lock
+
+	DWORD dwLength = SizeofResource(hModule, hRsrc);
+	WriteUsingStream(pBytes, dwLength, file);
+	UnlockResource(hGlobal);
+	
+	FreeResource(hGlobal);
+	
+	return 0;
+
+}
+
+void main()
+{
+	
+	cout << "Greenstone3 Installer" << endl;
+		
+	//create the temp folder
+	cout << "Creating temp folder 'greenstone3.tmp' ..." << endl;
+	system("mkdir greenstone3.tmp");
+	
+	//extract the resources
+	cout << "Extracting jar launcher ..." << endl;
+	extractResource( "LAUNCHER", "EXE", "greenstone3.tmp\\launch-installer.exe" );
+	
+	cout << "Extracting jar installer ..." << endl;
+	extractResource( "GREENSTONE_JAR", "JAR", "greenstone3.tmp\\greenstone3.jar" );
+				
+	//change to the temp directory and start the jar
+	SetCurrentDirectory("greenstone3.tmp");
+
+	//launch the jar with launch4j, taking a note of the exit code or info in the log
+	cout << "Launching Installer ..." << endl;
+	int launch_exit_code = 0;
+	launch_exit_code = system("launch-installer.exe");
+			
+	//if it failed, launch the installer for the bundled java, then try again
+	if ( launch_exit_code == 1 ) {
+		cout << "It appears that you do not have an installed Java Runtime Enviromnent (JRE)" << endl;
+		
+		//is this an installer with the bundled JRE?
+		cout << "Extracting java installer ..." << endl;
+		int extract_result = extractResource( "JAVA", "EXE", "@java.installer@" );
+		if ( extract_result == 0 ) {
+			
+			//yes, JRE is bundled
+			cout << "Starting the installation process for the bundled JRE" << endl;	
+			system( "@java.installer@" );
+			launch_exit_code = system("launch-installer.exe");
+			if ( launch_exit_code == 1 ) {
+				cout << "Still could not find a JRE. Please install a JRE and try again." << endl;
+			}
+			
+		} else {
+			
+			//no, JRE is not bundled
+			cout << "Sorry, there is no bundled JRE" << endl;
+			cout << "Install a JRE and try again (make sure JRE_HOME is set)" << endl;
+			cout << "Or, download a greentsone3 installer with a bundled JRE and use that instead of this one" << endl;
+		
+		}
+		system("del greenstone3.tmp\\@java.installer@");
+	}
+		
+	//change back to the original directory and clean up the temp directory
+	SetCurrentDirectory("..");
+	system("del greenstone3.tmp\\greenstone3.jar");
+	system("del greenstone3.tmp\\launch-installer.exe");
+	system("del greenstone3.tmp\\ant.install.log");
+	system("rmdir greenstone3.tmp");
+	
+	
+}
Index: /release-kits/wirk3/wrapper/wrapper.rc
===================================================================
--- /release-kits/wirk3/wrapper/wrapper.rc	(revision 15023)
+++ /release-kits/wirk3/wrapper/wrapper.rc	(revision 15023)
@@ -0,0 +1,4 @@
+GREENSTONE_JAR JAR "greenstone3.jar"
+LAUNCHER EXE "launch-installer.exe"
+MAINICON ICON "gs3.ico"
+
Index: /release-kits/wirk3/xsl/convert-build-xml-source.xsl
===================================================================
--- /release-kits/wirk3/xsl/convert-build-xml-source.xsl	(revision 15023)
+++ /release-kits/wirk3/xsl/convert-build-xml-source.xsl	(revision 15023)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <!-- we basically want to copy everything except for a few targets that no longer apply -->
+  <xsl:output method="xml"/>
+
+  <!-- for some reason, the default copy-of doesn't copy empty attributes, so have this to get the empty arg1 in equals-->
+  <xsl:template match="project|condition|and|isset|equals|not|or">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+      
+  <!-- delete the unnecessary targets -->
+  <xsl:template match="target[starts-with(@name, 'prepare')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'cvsupdate')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'update')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'checkout')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'rename-gs2build')]"></xsl:template>
+  <xsl:template match="target[@name='test']"></xsl:template>
+  <xsl:template match="target[@name='get-macos-extra']"><target name="get-macos-extra"></target></xsl:template>
+  <xsl:template match="target[@name='get-windows-binaries']"></xsl:template>
+  
+  <xsl:template match="property[@name='install-command']">
+    <property name="install-command" value="ant [options] install"/>
+  </xsl:template>
+
+  <xsl:variable name="install-for-dist" select="document('dist-build.xml')/project/target[@name='install-for-source-dist']"/>
+  
+  <!-- copy in our new install target -->
+  <xsl:template match="target[@name='install']">
+    <target name="install">
+      <xsl:copy-of select="$install-for-dist/@depends|$install-for-dist/@description|$install-for-dist/@if|$install-for-dist/@unless|$install-for-dist/node()"/>
+    </target>
+  </xsl:template>
+
+  <xsl:template match="*">
+    <xsl:copy-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="comment()">
+    <xsl:copy-of select="."/>
+    <xsl:text>
+</xsl:text>
+  </xsl:template>
+    
+</xsl:stylesheet>
Index: /release-kits/wirk3/xsl/convert-build-xml.xsl
===================================================================
--- /release-kits/wirk3/xsl/convert-build-xml.xsl	(revision 15023)
+++ /release-kits/wirk3/xsl/convert-build-xml.xsl	(revision 15023)
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <!-- we basically want to copy everything except for a few targets that no longer apply -->
+  <xsl:output method="xml"/>
+
+  <!-- for some reason, the default copy-of doesn't copy empty attributes, so have this to get the empty arg1 in equals-->
+  <xsl:template match="project|condition|and|isset|equals|not|or">
+    <xsl:copy>
+      <xsl:copy-of select="@*"/>
+      <xsl:apply-templates/>
+    </xsl:copy>
+  </xsl:template>
+  
+  <!-- delete the old install target-->
+  <xsl:template match="target[@name='install']"></xsl:template>
+
+  <!-- delete the unnecessary targets -->
+  <xsl:template match="target[starts-with(@name, 'prepare')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'cvsupdate')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'update')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'checkout')]"></xsl:template>
+  <xsl:template match="target[starts-with(@name, 'rename-gs2build')]"></xsl:template>
+  <xsl:template match="target[@name='test']"></xsl:template>
+  <xsl:template match="target[@name='get-macos-extra']"><target name="get-macos-extra"></target></xsl:template>
+  <xsl:template match="target[@name='get-windows-binaries']"></xsl:template>
+
+  <xsl:variable name="usage-for-dist" select="document('../ant-scripts/operations-on-gs3home.xml')/project/target[@name='usage-for-binary-dist']"/>
+  
+  <!-- copy in our new usage target -->
+  <xsl:template match="target[@name='usage']">
+    <target name="usage">
+      <xsl:copy-of select="$usage-for-dist/@description|$usage-for-dist/node()"/>
+    </target>
+  </xsl:template>
+  
+  <xsl:template match="*">
+    <xsl:copy-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="comment()">
+    <xsl:copy-of select="."/>
+    <xsl:text>
+</xsl:text>
+  </xsl:template>
+    
+</xsl:stylesheet>
