<!DOCTYPE html>
<!--
    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

       https://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>
<head>
  <meta name="description" content="Apache Events"/>
  <meta name="keywords" content="apache, apache events, apache community, opensource"/>

  <title>{{ .Title }}</title>
  <link rel="shortcut icon" href="/images/concom-icon.ico">

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <link href="/style/bootstrap.css" rel="stylesheet">
  <style type="text/css">
    body {
      padding-top: 60px;
      padding-bottom: 40px;
    }
    .sidebar-nav {
      padding: 9px 0;
      color: #808080;

    }
    .sidebar-nav p {
      font-size: small;
    }
    .sidebar-nav h4 {
      color: #606060;
      font-size: small;
      font-variant: small-caps;
    }
    .sidebar-nav img {
      width: 120px;
    }

    footer {
      color: #A0A0A0;
    }

    #sponsors img {
      width: 150px;
    }
  </style>
  <link href="/style/bootstrap-responsive.css" rel="stylesheet" type="text/css">

  <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
  <!--[if lt IE 9]>
  <script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->

  <!-- Le fav and touch icons -->
  <link rel="shortcut icon" href="/images/favicon.ico">
  <title>{{ .Title }}</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-30021440-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>
</head>

<body>

  <ul class="breadcrumb navbar-fixed-top">
    <li><a href="https://apache.org/">Apache</a> <span class="divider">/</span></li>
    <li><a href="/">Apache Events</a> <span class="divider">/</span></li>
    <li><a href="/event/">Upcoming</a> <span class="divider">/</span></li>
    <li class="active">Apache BarCamp DC</li>
  </ul>

  <div class="container">

    <div class="container-fluid">
      <!-- The Banner -->
      <div class="row-fluid">
        <div id="content" class="span12">
          <img alt="BarCamp DC" src="/images/BarCamp-DC.jpg">
        </div>
      </div>

      <!--  The inner navigation for this particular event 	-->
      <div class="navbar">
        <div class="navbar-inner">
          <div class="container">
            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
              <span class="icon-bar"></span>
            </a>
            <div class="nav-collapse">
              <ul class="nav">
                <li class="active"><a href="index.html">Home</a></li>
                <li><a href="news.html">News</a></li>
                <li><a href="registration.html">Registration</a></li>
                <li><a href="sponsors.html">Sponsors</a></li>
                <li><a href="venue.html">Where &amp; When</a></li>
              </ul>
            </div><!--/.nav-collapse -->
          </div>
        </div>
      </div>

      <!-- Individual Page Content -->
      <div class="row-fluid">
        <div class="span8">
          {{ block "main" . }}{{ end }}
        </div>

        <div class="span4">
          <div class="sidebar-nav">
            <h4>What?</h4>
            <p>
              A Saturday in the Washington, D.C. suburbs full of technology in an Open Space
              event organized by the Community for the Community. And with the
              quality of the Apache Software Foundation events.
            </p>

            <h4>When?</h4>
            <p>May 19th, 2012 starting at 9am.</p>

            <h4>Sponsors</h4>
            <p>
              <img alt="bti360" src="bti360.jpg" title="bti360">
              <img alt="SAIC" src="saic.jpg" title="SAIC" style="margin-bottom:20px;">
              <img alt="Booz Allen Hamilton" style="margin-top:10px;width:240px;" src="bah.jpg" title="Booz Allen Hamilton">
            </p>
          </div>
        </div>
      </div>
    </div>
    <hr/>

    {{ partial "footer.html" . }}
  </div>

  <script src="/js/jquery.js"></script>
  <script src="../assets/js/bootstrap-transition.js"></script>
  <script src="../assets/js/bootstrap-alert.js"></script>
  <script src="../assets/js/bootstrap-modal.js"></script>
  <script src="../assets/js/bootstrap-dropdown.js"></script>
  <script src="../assets/js/bootstrap-scrollspy.js"></script>
  <script src="../assets/js/bootstrap-tab.js"></script>
  <script src="../assets/js/bootstrap-tooltip.js"></script>
  <script src="../assets/js/bootstrap-popover.js"></script>
  <script src="../assets/js/bootstrap-button.js"></script>
  <script src="/js/bootstrap-collapse.js"></script>
  <script src="../assets/js/bootstrap-carousel.js"></script>
  <script src="../assets/js/bootstrap-typeahead.js"></script>

</body>
</html>
