<!--
  ~ 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.
  -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <h1>Download Apache Rampart Module</h1>
        <h2>Apache Rampart Releases</h2>
        <p>This page provides links to the release versions of Apache Rampart Java.</p>
        <table border="1" style="border-collapse: collapse" width="93%" id="table1">
            <tbody>
                <tr>
                    <th>Version</th>
                    <th>Date</th>
                    <th>Description</th>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.6.2/download.cgi">
                            <strong>1.6.2</strong>
                        </a>
                    </td>
                    <td>26 Apr 2012</td>
                    <td>1.6.2 Release (Mirrored)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.6.1/download.cgi">
                            <strong>1.6.1</strong>
                        </a>
                    </td>
                    <td>24 Sep 2011</td>
                    <td>1.6.1 Release (Mirrored)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.5.2/download.cgi">
                            <strong>1.5.2</strong>
                        </a>
                    </td>
                    <td>24 Sep 2011</td>
                    <td>1.5.2 Release (Mirrored)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.6.0/download.cgi">
                            <strong>1.6.0</strong>
                        </a>
                    </td>
                    <td>06 Jun 2011</td>
                    <td>1.6.0 Release (Archived)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.5.1/download.cgi">
                            <strong>1.5.1</strong>
                        </a>
                    </td>
                    <td>10 Jan 2011</td>
                    <td>1.5.1 Release (Archived)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.5/download.cgi">
                            <strong>1.5</strong>
                        </a>
                    </td>
                    <td>01 Feb 2010</td>
                    <td>1.5 Release (Archived)</td>
                </tr>       
                <tr>
                    <td>
                        <a href="download/1.4/download.cgi">
                            <strong>1.4</strong>
                        </a>
                    </td>
                    <td>12 Jun 2008</td>
                    <td>1.4 Release (Archived)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.3/download.cgi">
                            <strong>1.3</strong>
                        </a>
                    </td>
                    <td>06 Sep 2007</td>
                    <td>1.3 Release (Archived)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.2/download.cgi">
                            <strong>1.2</strong>
                        </a>
                    </td>
                    <td>02 Jun 2007</td>
                    <td>1.2 Release (Archived)</td>
                </tr>
                <tr>
                    <td>
                        <a href="download/1.1/download.cgi">
                            <strong>1.1</strong>
                        </a>
                    </td>
                    <td>11 Dec 2006</td>
                    <td>1.1 Release (Archived)</td>
                </tr>
            </tbody>
        </table>
        <p>
            <strong>Apache Rampart Distributions : <a href="https://hudson.apache.org/hudson/job/Rampart/lastStableBuild/org.apache.rampart$rampart-dist/">Nightly builds</a>
            </strong>
        </p>
        <p>
            <strong>Maven Repository: <a href="http://people.apache.org/repo/m2-ibiblio-rsync-repository/">Released Apache Rampart jars</a> | <a href="http://repository.apache.org/snapshots/">Nightly SNAPSHOT</a>
                <a href=""></a>
            </strong>
        </p>
    </body>
</html>
