
<!--
Copyright 2017-present Open Networking Foundation

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


{% extends "admin/base.html" %}
{% load admin_static %}

{# Additional <head> content here, some extra meta tags or favicon #}
{#{% block extrahead %}#}
{#{% endblock %}#}


{# Additional CSS includes #}
{# {% block extrastyle %} #}
{# {% endblock %} #}


{# Additional JS files in footer, right before </body> #}
{#{% block extrajs %}#}
{#  <script type="text/javascript" src="{% static 'js/my_project.js' %}"></script>#}
{#{% endblock %}#}


{# Footer links (left side) #}
{#{% block footer_links %}#}
{#  <a href="/docs/" class="icon"><i class="icon-question-sign"></i>Documentation</a>#}
{#{% endblock %}#}

{# Additional header content like notifications or language switcher #}
{#{% block header_content %}#}
{#    {{ block.super }}#}
{#    <div class="header-content">#}
{#        <!-- First icon column -->#}
{#        <div class="header-column icon">#}
{#            <i class="icon-home"></i><br>#}
{#            <i class="icon-cog"></i>#}
{#        </div>#}
{#        <div class="header-column" style="margin-right: 20px">#}
{#            <a href="/" class="grey">Front-end</a><br>#}
{#            <a href="" class="grey">One more link</a>#}
{#        </div>#}
{#        <!-- Second icon column -->#}
{#        <div class="header-column icon">#}
{#            <i class="icon-comment"></i>#}
{#        </div>#}
{#        <div class="header-column">#}
{#            <a href="" class="grey">5 new messages</a>#}
{#        </div>#}
{#    </div>#}
{#{% endblock %}#}

{# Footer branding name (center) #}
{% block footer_branding %}
{{ XOS_BRANDING_NAME }}
{% endblock %}


{# Footer copyright (right side) #}
{% block copyright %}
{#  Copyright &copy; 2013 Client<br>Developed by <a href="http://yoursite.com" target="_blank">YourName</a> #}
{% endblock %}
