<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        {% if page_description %}<meta name="description" content="{{ page_description }}">{% endif %}
        {% if site_author %}<meta name="author" content="{{ site_author }}">{% endif %}
        <!-- This is broken by doc revisioning.
        {% if canonical_url %}<link rel="canonical" href="{{ canonical_url }}">{% endif %} -->
        {% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">
        {% else %}<link rel="shortcut icon" href="{{ base_url }}/img/favicon.ico">{% endif %}

	    <title>{% if page_title %}{{ page_title }} - {% endif %}{{ site_name }}</title>

        <link href="{{ base_url }}/css/bootstrap-3.0.3.min.css" rel="stylesheet">
        <link rel="stylesheet" href="{{ base_url }}/css/highlight.css">
        <link href="{{ base_url }}/css/base.css" rel="stylesheet">
        <link href="{{ base_url }}/css/custom.css" rel="stylesheet">
        <link href="{{ base_url }}/css/v2.css" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
        {%- for path in extra_css %}
        <link href="{{ path }}" rel="stylesheet">
        {%- endfor %}

        <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
            <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
        <![endif]-->

        {% if google_analytics %}
            <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", "{{ google_analytics[0] }}", "{{ google_analytics[1] }}");
ga("send", "pageview");
</script>
        {% endif %}
    </head>

{% if page_title != None %}
    <body class="{{ page_title }}">
{% else %}
    <body class="home">
{% endif %}

        {% include 'main-banner.html' %}

        {% include "nav.html" %}

        {% set full_width_page_titles = [None, 'Quick Start', 'About', 'Talks', 'Documentation', 'Download', 'Community', 'Events'] %}

        <div class="container">
            {% if page_title == None %}
                {% include "landing.html" %}
            {% elif meta and meta.html %}
                {% include meta.html[0] %}
            {% elif page_title == 'About' %}
                {% include "about.html" %}
            {% elif page_title == 'Talks' %}
                {% include "talks.html" %}
            {% elif page_title == 'Quick Start' %}
                {% include "quick-start.html" %}
            {% elif page_title == 'Documentation' %}
                {% include "documentation.html" %}
            {% elif page_title == 'Download' %}
                {% include "download.html" %}
            {% elif page_title == 'Community' %}
                {% include "community.html" %}
            {% elif page_title == 'Events' %}
                {% include "events.html" %}
            {% else %}
                <div class="row">
                    <div class="col-md-3 v2-sidebar sidebar-container">{% include "toc.html" %}</div>

                    <div class="col-md-9" role="main">
                        <div class="doc-header">
                            {% include 'breadcrumbs.html' %}
                        </div>
                        {% for version in config.extra.versions %}
                          {% if config.extra.version == version.dir and not version.latest %}
                            <div class="alert alert-warning">
                                <p>
                                    Version {{ version.label }} is not the most recent version of the Apache Mynewt
                                    documentation. Click <a href="/latest{{ page.abs_url }}">here</a> to read the latest
                                    version.
                                </p>
                            </div>
                          {% endif %}
                        {% endfor %}
                        {% block content %}
                            {{ content }}
                        {% endblock %}
                        <div class="row">
                            {% include 'next_prev_links.html' %}
                        </div>
                        {% include 'footer.html' %}
                    </div>
                </div>
            {% endif %}
            {% if page_title in full_width_page_titles or (meta and meta.html) %}
                {% include 'footer.html' %}
            {% endif %}
        </div>

        <script src="{{ base_url }}/js/jquery-1.10.2.min.js"></script>
        <script src="{{ base_url }}/js/bootstrap-3.0.3.min.js"></script>
        <script src="{{ base_url }}/js/highlight.pack.js"></script>
        <script src="{{ base_url }}/js/base.js"></script>
        <script src="{{ base_url }}/js/custom.js"></script>

        {%- for path in extra_javascript %}
            <script src="{{ path }}"></script>
        {%- endfor %}

    </body>
</html>
