<?xml version="1.0" encoding="ISO-8859-1"?>

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

<project xmlns="http://maven.apache.org/DECORATION/1.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.3.0 http://maven.apache.org/xsd/decoration-1.3.0.xsd"
         name="Ambari">
  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.0</version>
  </skin>
  <custom>
    <fluidoSkin>
      <topBarEnabled>true</topBarEnabled>
      <sideBarEnabled>true</sideBarEnabled>
      <leftColumnClass>span2</leftColumnClass>
      <bodyColumnClass>span10</bodyColumnClass>
    </fluidoSkin>
  </custom>
  <bannerLeft>
    <name>Ambari</name>
    <src>http://incubator.apache.org/ambari/images/apache-ambari-project.jpg</src>
    <href>http://incubator.apache.org/ambari</href>
  </bannerLeft>

  <publishDate position="right"/>
  <version position="right"/>

  <body>
    <head>
       <!-- Start of Google analytics -->
       <script type="text/javascript">
         var _gaq = _gaq || [];
         _gaq.push(['_setAccount', 'UA-27188762-1']);
         _gaq.push(['_trackPageview']);

         (function() {
            var ga = document.createElement('script'); 
            ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 
                      'https://ssl' : 'http://www') + 
                     '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; 
            s.parentNode.insertBefore(ga, s);
          })();
       </script>
       <!-- End of Google analytics -->
       <style>
           .well.sidebar-nav {
             background-color: #fff;
           }
           a.externalLink[href^=http] {
             background-image: none;
             padding-right: 0;
           }
           body.topBarEnabled {
             padding-top: 40px;
           }
           #leftColumn .nav-list .active a {
             background-color: #a0a0a0;
           }
           .nav-list .active a:hover {
             background-color: #a0a0a0;
           }
       </style>
    </head>

    <links>
      <item name="JIRA" href="https://issues.apache.org/jira/browse/AMBARI" />
      <item name="Git" href="https://git-wip-us.apache.org/repos/asf/incubator-ambari/repo?p=incubator-ambari.git;a=summary" />
      <item name="Wiki" href="https://cwiki.apache.org/confluence/display/AMBARI/Ambari" />
    </links>

    <breadcrumbs>
      <item name="Incubator" href="../"/>
      <item name="Ambari" href="http://incubator.apache.org/ambari/"/>
    </breadcrumbs>

    <menu name="Ambari">
      <item name="Overview" href="index.html"/>
      <item name="What's New?" href="whats-new.html"/>
      <item name="Project Team" href="team-list.html"/>
      <item name="IRC Channel" href="irc.html"/>
      <item name="Mailing Lists" href="mail-lists.html"/>
      <item name="Issue Tracking" href="issue-tracking.html"/>
      <item name="User Group" href="http://www.meetup.com/Apache-Ambari-User-Group"/>
      <item name="Project License" href="http://www.apache.org/licenses/"/>
    </menu>

    <menu name="Releases">
        <item name="1.4.1" href="https://dist.apache.org/repos/dist/release/incubator/ambari/1.4.1-incubating/"/>
        <item name="1.2.5" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.5/"/>
        <item name="1.2.4" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.4/"/>
        <item name="1.2.3" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.3/"/>
        <item name="1.2.2" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.2/"/>
        <item name="1.2.1" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.1/"/>
        <item name="1.2.0" href="http://www.apache.org/dist/incubator/ambari/ambari-1.2.0/"/>
        <item name="0.9" href="http://www.apache.org/dist/incubator/ambari/ambari-0.9-incubating/"/>
    </menu>

    <menu name="Documentation">
        <item name="Install Guide for 1.4.1" href="https://cwiki.apache.org/confluence/display/AMBARI/Instructions+for+installing+Ambari-1.4.1+bits"/>
        <item name="Install Guide for 1.2.5" href="1.2.5/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 1.2.4" href="1.2.4/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 1.2.3" href="1.2.3/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 1.2.2" href="1.2.2/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 1.2.1" href="1.2.1/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 1.2.0" href="1.2.0/installing-hadoop-using-ambari/content/index.html"/>
        <item name="Install Guide for 0.9" href="install-0.9.html"/>
        <item name="API Reference" href="https://github.com/apache/incubator-ambari/blob/trunk/ambari-server/docs/api/v1/index.md"/>
        <item name="Wiki" href="https://cwiki.apache.org/confluence/display/AMBARI/Ambari"/>
    </menu>

    <footer>
      <div class="row span12">
        Apache Ambari, Apache, the Apache feather logo, and the Apache Ambari project logos are trademarks
        of The Apache Software Foundation.
        All other marks mentioned may be trademarks or registered trademarks of their respective owners.
      </div>
      <div class="row span12">
        <a href="${project.url}/privacy-policy.html">Privacy Policy</a>
      </div>
    </footer>

  </body>
</project>
