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

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

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
 +======================================================================+
 |****                                                              ****|
 |****      THIS FILE IS GENERATED BY THE COMMONS BUILD PLUGIN      ****|
 |****                    DO NOT EDIT DIRECTLY                      ****|
 |****                                                              ****|
 +======================================================================+
 | TEMPLATE FILE: download-page-template.xml                            |
 | commons-build-plugin/trunk/src/main/resources/commons-xdoc-templates |
 +======================================================================+
 |                                                                      |
 | 1) Re-generate using: mvn commons:download-page                      |
 |                                                                      |
 | 2) Set the following properties in the component's pom:              |
 |    - commons.componentid (required, alphabetic, lower case)          |
 |    - commons.release.version (required)                              |
 |    - commons.binary.suffix (optional)                                |
 |      (defaults to "-bin", set to "" for pre-maven2 releases)         |
 |                                                                      |
 | 3) Example Properties                                                |
 |                                                                      |
 |  <properties>                                                        |
 |    <commons.componentid>math</commons.componentid>                   |
 |    <commons.release.version>1.2</commons.release.version>            |
 |  </properties>                                                       |
 |                                                                      |
 +======================================================================+
-->
<document>
  <properties>
    <title>Download Commons Lang</title>
    <author email="dev@commons.apache.org">Commons Documentation Team</author>
  </properties>
  <body>
    <section name="Download Commons Lang">
      <p>
        We recommend you use a mirror to download our release
        builds, but you <strong>must</strong> verify the integrity of
        the downloaded files using signatures downloaded from our main 
        distribution directories. Recent releases (48 hours) may not yet
        be available from the mirrors.
      </p>

      <p>
        You are currently using <b>[preferred]</b>.  If you
        encounter a problem with this mirror, please select another
        mirror.  If all mirrors are failing, there are <i>backup</i>
        mirrors (at the end of the mirrors list) that should be
        available.
        <br></br>
        [if-any logo]<a href="[link]"><img align="right" src="[logo]" border="0"></img></a>[end]
      </p>

      <form action="[location]" method="get" id="SelectMirror">
        <p>
          Other mirrors: 
          <select name="Preferred">
          [if-any http]
            [for http]<option value="[http]">[http]</option>[end]
          [end]
          [if-any ftp]
            [for ftp]<option value="[ftp]">[ftp]</option>[end]
          [end]
          [if-any backup]
            [for backup]<option value="[backup]">[backup] (backup)</option>[end]
          [end]
          </select>
          <input type="submit" value="Change"></input>
        </p>
      </form>

      <p>
        The <code>KEYS</code> link links to the code signing keys used to sign the product.
        The <code>PGP</code> link downloads the OpenPGP compatible signature from our main site. 
        The <code>MD5</code> link downloads the checksum from the main site.
      </p>

      <p>
        For more information concerning Commons Lang, see the 
        <a href="index.html" class="name">Commons Lang</a> web site.
      </p>

      <p>
        <div class="links"><span class="link"><a href="http://www.apache.org/dist/commons/KEYS">KEYS</a></span></div>
        <ul class="downloads">
          <li class="group"><div class="links"><span class="label">Binary</span></div>
            <ul>
              <li class="download"><a href="[preferred]/commons/lang/binaries/commons-lang-2.3.tar.gz">2.3.tar.gz</a>
                <ul class="attributes">
                  <li><span class="md5">[<a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.3.tar.gz.md5">md5</a>]</span>
                      <span class="pgp">[<a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.3.tar.gz.asc">pgp</a>]</span>
                  </li>
                </ul>
              </li>
              <li class="download"><a href="[preferred]/commons/lang/binaries/commons-lang-2.3.zip">2.3.zip</a>
                <ul class="attributes">
                  <li><span class="md5">[<a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.3.zip.md5">md5</a>]</span>
                      <span class="pgp">[<a href="http://www.apache.org/dist/commons/lang/binaries/commons-lang-2.3.zip.asc">pgp</a>]</span>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li class="group"><div class="links"><span class="label">Source</span></div>
            <ul>
              <li class="download"><a href="[preferred]/commons/lang/source/commons-lang-2.3-src.tar.gz">2.3.tar.gz</a>
                <ul class="attributes">
                  <li><span class="md5">[<a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.3-src.tar.gz.md5">md5</a>]</span>
                      <span class="pgp">[<a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.3-src.tar.gz.asc">pgp</a>]</span>
                  </li>
                </ul>
              </li>
              <li class="download"><a href="[preferred]/commons/lang/source/commons-lang-2.3-src.zip">2.3.zip</a>
                <ul class="attributes">
                  <li><span class="md5">[<a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.3-src.zip.md5">md5</a>]</span>
                      <span class="pgp">[<a href="http://www.apache.org/dist/commons/lang/source/commons-lang-2.3-src.zip.asc">pgp</a>]</span>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li class="download"><a href="[preferred]/commons/lang/">browse download area</a></li>
          <li><a href="http://archive.apache.org/dist/commons/lang/">archives...</a></li>
        </ul>
      </p>
    </section>
  </body>
</document>
