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

<!--
 ! Copyright 2009-2013 by The Regents of the University of California
 ! 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 from
 !
 !     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 name="AsterixDB" xmlns="http://maven.apache.org/DECORATION/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
  <bannerLeft>
    <name>AsterixDB</name>
    <src>images/asterixlogo.png</src>
    <href>http://asterixdb.apache.org/</href>
  </bannerLeft>

  <version position="right"/>

  <poweredBy>
    <logo name="Hyracks"
          href="https://code.google.com/p/hyracks/"
          img="images/hyrax_ts.png"/>
  </poweredBy>

  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.0</version>
  </skin>
  <custom>
    <fluidoSkin>
      <!-- <topBarEnabled>true</topBarEnabled>
      <topBarIcon>
        <name>AsterixDB</name>
        <alt>AsterixDB</alt>
        <src>images/asterixlogo.png</src>
        <href>/index.html</href>
      </topBarIcon>
      <sideBarEnabled>false</sideBarEnabled> -->
      <!-- <topBarContainerStyle>width: 90%;</topBarContainerStyle> -->
      <sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
      <!-- <googlePlusOne /> -->
    </fluidoSkin>
  </custom>

  <body>
    <head>
      <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-41536543-1', 'uci.edu');
        ga('send', 'pageview');
      </script>
    </head>
    <links>
      <item name="Documentation Home" href="index.html"/>
    </links>

    <menu name="Documentation">
      <item name="Installing and Managing AsterixDB using Managix" href="install.html"/>
      <item name="Deploying AsterixDB using YARN" href="yarn.html"/>
      <item name="AsterixDB 101: An ADM and AQL Primer" href="aql/primer.html"/>
       <item name="AsterixDB 101: An ADM and AQL Primer (For SQL Fans)" href="aql/primer-sql-like.html"/>
      <item name="AsterixDB Javascript SDK" href="aql/js-sdk.html"/>
      <item name="Asterix Data Model (ADM)" href="aql/datamodel.html"/>
      <item name="Asterix Query Language (AQL)" href="aql/manual.html"/>
      <item name="AQL Functions" href="aql/functions.html"/>
      <item name="AQL Allen's Relations Functions" href="aql/allens.html"/>
      <item name="AQL Support of Similarity Queries" href="aql/similarity.html"/>
      <item name="Accessing External Data" href="aql/externaldata.html"/>
      <item name="Support for Data Ingestion in AsterixDB" href="feeds/tutorial.html" />
      <item name="Filter-Based LSM Index Acceleration" href="aql/filters.html"/>
      <item name="HTTP API to AsterixDB" href="api.html"/>
    </menu>

    <menu ref="reports"/>

    <footer>
      <div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache
        feather logo, and the Apache AsterixDB project logo are either
        registered trademarks or trademarks of The Apache Software
        Foundation in the United States and other countries.
        All other marks mentioned may be trademarks or registered
        trademarks of their respective owners.
      </div>
    </footer>

  </body>
</project>
