<!--
  ~ 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.
  -->
<html>
<body>
<h2>About This Content</h2>
<p>Version: ${pom.version}-${geronimo-eclipse-plugin.buildNumber}</p>
<h3>License</h3>
The license for this plugin is found here in the <a href="about_files/LICENSE.txt">about_files/LICENSE.txt</a> file.
<h3>Notices</h3>
The notices for this plugin are found here in the <a href="about_files/NOTICE.txt">about_files/NOTICE.txt</a> file.
<h3>Release Notes</h3>
For detailed information about this feature, see these
<a href="about_files/PLUGIN_RELEASE-NOTES-${pom.version}.txt">Release Notes</a>.
<h3>The Geronimo Devtools project</h3>
For more information on using this feature, getting the source code and/or contributing to the project,
visit the project home page 
<a href="http://geronimo.apache.org/development-tools.html">http://geronimo.apache.org/development-tools.html</a>.
</body>
</html>
