2020-01-21 06:35:58 +00:00
<!DOCTYPE html>
< html lang = "{{ LANGUAGE_CODE }}" >
2023-01-27 23:11:10 +00:00
< head >
2020-01-21 06:35:58 +00:00
< title > {% block title %}{{ title }} - {{ SITE_LONG_NAME }}{% endblock %}< / title >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
{% if misc_config.meta_keywords %}
2023-01-27 23:11:10 +00:00
< meta name = "keywords" content = "{{ misc_config.meta_keywords }}" >
2020-01-21 06:35:58 +00:00
{% endif %}
{% if meta_description %}
2023-01-27 23:11:10 +00:00
< meta name = "description" content = "{{ meta_description }}" >
2020-01-21 06:35:58 +00:00
{% endif %}
< meta id = "viewport" name = "viewport" content = "width=device-width, initial-scale=1" >
<!-- Favicons -->
< link rel = "apple-touch-icon" sizes = "57x57" href = "/apple-touch-icon-57x57.png" >
< link rel = "apple-touch-icon" sizes = "60x60" href = "/apple-touch-icon-60x60.png" >
< link rel = "apple-touch-icon" sizes = "72x72" href = "/apple-touch-icon-72x72.png" >
< link rel = "apple-touch-icon" sizes = "76x76" href = "/apple-touch-icon-76x76.png" >
< link rel = "apple-touch-icon" sizes = "114x114" href = "/apple-touch-icon-114x114.png" >
< link rel = "apple-touch-icon" sizes = "120x120" href = "/apple-touch-icon-120x120.png" >
< link rel = "apple-touch-icon" sizes = "144x144" href = "/apple-touch-icon-144x144.png" >
< link rel = "apple-touch-icon" sizes = "152x152" href = "/apple-touch-icon-152x152.png" >
< link rel = "apple-touch-icon" sizes = "180x180" href = "/apple-touch-icon-180x180.png" >
< link rel = "icon" type = "image/png" href = "/favicon-32x32.png" sizes = "32x32" >
< link rel = "icon" type = "image/png" href = "/android-chrome-192x192.png" sizes = "192x192" >
< link rel = "icon" type = "image/png" href = "/favicon-96x96.png" sizes = "96x96" >
< link rel = "icon" type = "image/png" href = "/favicon-16x16.png" sizes = "16x16" >
< link rel = "manifest" href = "/manifest.json" >
< meta name = "msapplication-TileColor" content = "#FFBB33" >
< meta name = "msapplication-TileImage" content = "/mstile-144x144.png" >
{# Chrome 39 for Android colour #}
< meta name = "theme-color" content = "#FFBB33" >
{% if og_image %}
2023-01-27 23:11:10 +00:00
< meta property = "og:image" content = "{{ request.build_absolute_uri(og_image) }}" >
2020-01-21 06:35:58 +00:00
{% endif %}
{% block og_title %}{% endblock %}
< meta property = "og:site_name" content = "{{ SITE_LONG_NAME }}" >
< meta property = "og:url"
2023-01-27 23:11:10 +00:00
content="{{ DMOJ_SCHEME }}://{{ DMOJ_CANONICAL|default(site.domain) }}{{ request.get_full_path() }}">
2020-01-21 06:35:58 +00:00
{% if meta_description %}
2023-01-27 23:11:10 +00:00
< meta property = "og:description" content = "{{ meta_description }}" >
2020-01-21 06:35:58 +00:00
{% endif %}
<!-- [if lt IE 9]>
< script src = "https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" > < / script >
< script > window . bad _browser = true < / script >
<![endif]-->
{% block meta %}{% endblock %}
{% if not INLINE_FONTAWESOME %}
2023-01-27 23:11:10 +00:00
< link rel = "stylesheet" href = "{{ FONTAWESOME_CSS }}" >
2020-01-21 06:35:58 +00:00
{% endif %}
2022-12-18 09:31:31 +00:00
< link rel = "stylesheet" type = "text/css" href = "{{ static('markdown.css') }}" >
2020-01-21 06:35:58 +00:00
{% compress css %}
2023-01-27 23:11:10 +00:00
< link rel = "stylesheet" href = "{{ static('style.css') }}" >
{% if PYGMENT_THEME %}
< link rel = "stylesheet" href = "{{ static(PYGMENT_THEME) }}" >
{% endif %}{% if INLINE_FONTAWESOME %}
2020-01-21 06:35:58 +00:00
< link rel = "stylesheet" href = "{{ static('libs/fontawesome/font-awesome.css') }}" > {% endif %}
2023-01-27 23:11:10 +00:00
< link rel = "stylesheet" type = "text/css" href = "{{ static('libs/featherlight/featherlight.min.css') }}" >
< link rel = "stylesheet" type = "text/css" href = "{{ static('libs/clipboard/tooltip.css') }}" >
< link rel = "stylesheet" type = "text/css" href = "{{ static('libs/select2/select2.css') }}" >
< link rel = "stylesheet" type = "text/css" href = "{{ static('icofont/icofont.min.css') }}" >
2020-01-21 06:35:58 +00:00
{% endcompress %}
< link rel = "canonical"
2023-01-27 23:11:10 +00:00
href="{{ DMOJ_SCHEME }}://{{ DMOJ_CANONICAL|default(site.domain) }}{{ request.get_full_path() }}">
2020-01-21 06:35:58 +00:00
{% if request.user.is_impersonate %}
2023-01-27 23:11:10 +00:00
< style >
#nav-container {
background: #893e89 !important;
}
< / style >
2020-01-21 06:35:58 +00:00
{% endif %}
{% block media %}{% endblock %}
2022-12-18 09:31:31 +00:00
{% if use_darkmode %}
2023-01-27 23:11:10 +00:00
{% compress css %}
< link rel = "stylesheet" href = "{{ static('darkmode.css') }}" >
< link rel = "stylesheet" href = "{{ static('darkmode-svg.css') }}" >
{% endcompress %}
2022-12-18 09:31:31 +00:00
{% endif %}
2020-01-21 06:35:58 +00:00
{% if not INLINE_JQUERY %}
2023-01-27 23:11:10 +00:00
< script src = "{{ JQUERY_JS }}" > < / script >
2020-01-21 06:35:58 +00:00
{% endif %}
2022-11-14 02:39:18 +00:00
< script src = "https://unpkg.com/@popperjs/core@2" > < / script >
2020-01-21 06:35:58 +00:00
{% compress js %}
2023-01-27 23:11:10 +00:00
< script > { { inlinei18n ( LANGUAGE _CODE ) | safe } } < / script >
{% if INLINE_JQUERY %}
< script src = "{{ static('libs/jquery-3.4.1.min.js') }}" > < / script >
{% endif %}
< script src = "{{ static('libs/jquery-cookie.js') }}" > < / script >
< script src = "{{ static('libs/jquery-taphold.js') }}" > < / script >
< script src = "{{ static('libs/jquery.unveil.js') }}" > < / script >
< script src = "{{ static('libs/moment.js') }}" > < / script >
< script src = "{{ static('libs/select2/select2.js') }}" > < / script >
2023-01-29 05:56:52 +00:00
< script src = "{{ static('libs/clipboard/clipboard.js') }}" > < / script >
2023-01-27 23:11:10 +00:00
{% include "extra_js.html" %}
< script src = "{{ static('common.js') }}" > < / script >
< script src = "{{ static('libs/clipboard/tooltip.js') }}" > < / script >
< script >
moment.locale('{{ LANGUAGE_CODE }}');
$(function () {
$('img.unveil').unveil(200);
});
const loading_page = `{% include "loading-page.html" %}`;
< / script >
2020-01-21 06:35:58 +00:00
{% endcompress %}
2022-09-01 23:42:13 +00:00
2020-01-21 06:35:58 +00:00
{% block js_media %}{% endblock %}
{% if request.in_contest %}
2023-01-27 23:11:10 +00:00
< script > $ ( f u n c t i o n ( ) {
if ($("#contest-time-remaining").length) {
count_down($("#contest-time-remaining"));
}
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
var selected = null,
x_pos = 0, y_pos = 0,
x_elem = 0, y_elem = 0;
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
$('#contest-info').mousedown(function () {
selected = $(this);
x_elem = x_pos - selected.offset().left;
y_elem = y_pos - (selected.offset().top - $(window).scrollTop());
return false;
});
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
if (localStorage.getItem("contest_timer_position")) {
data = localStorage.getItem("contest_timer_position").split(":");
$("#contest-info").css({
left: data[0],
top: data[1]
});
}
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
$("#contest-info").show();
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
$("#contest-info-toggle").on('click', function() {
$.post("{{url('contest_mode_ajax')}}", function() {
window.location.reload();
})
});
2022-01-10 11:13:46 +00:00
2023-01-27 23:11:10 +00:00
$(document).mousemove(function (e) {
x_pos = e.screenX;
y_pos = e.screenY;
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
if (selected !== null) {
left_px = (x_pos - x_elem);
top_px = (y_pos - y_elem);
left_px = Math.max(Math.min(left_px, window.innerWidth), 0) / window.innerWidth * 100 + '%';
top_px = Math.max(Math.min(top_px, window.innerHeight), 0) / window.innerHeight * 100 + '%';
localStorage.setItem("contest_timer_position", left_px + ":" + top_px);
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
selected.css({
left: left_px,
top: top_px
});
}
2020-01-21 06:35:58 +00:00
});
2023-01-27 23:11:10 +00:00
$(document).mouseup(function () {
selected = null;
})
});
< / script >
2020-01-21 06:35:58 +00:00
{% endif %}
{% if request.user.is_authenticated %}
2023-01-27 23:11:10 +00:00
< script >
window.user = {
email: '{{ request.user.email|escapejs }}',
id: '{{ request.user.id|escapejs }}',
name: '{{ request.user.username|escapejs }}'
};
< / script >
2020-01-21 06:35:58 +00:00
{% else %}
2023-01-27 23:11:10 +00:00
< script > window . user = { } ; < / script >
2020-01-21 06:35:58 +00:00
{% endif %}
{% if misc_config.analytics %}
2023-01-27 23:11:10 +00:00
{{ misc_config.analytics|safe }}
2020-01-21 06:35:58 +00:00
{% endif %}
{# Don't run userscript since it may be malicious #}
{% if request.user.is_authenticated and request.profile.user_script and not request.user.is_impersonate %}
2023-01-27 23:11:10 +00:00
< script type = "text/javascript" > { { request . profile . user _script | safe } } < / script >
2020-01-21 06:35:58 +00:00
{% endif %}
< noscript >
2023-01-27 23:11:10 +00:00
< style >
#content {
margin: 80px auto auto;
}
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
#navigation {
top: 27px;
}
< / style >
2020-01-21 06:35:58 +00:00
< / noscript >
2023-09-02 00:42:58 +00:00
{% if request.profile.css_background %}
< style >
@media(min-width: 800px) {
#page-container {
background: {{request.profile.css_background|safe}};
}
}
< / style >
{% endif %}
2023-01-27 23:11:10 +00:00
< / head >
< body >
< svg width = "0" height = "0" style = "display: block" >
< defs >
2020-01-21 06:35:58 +00:00
< clipPath id = "rating-clip" > < circle cx = "8" cy = "8" r = "7" / > < / clipPath >
2023-01-27 23:11:10 +00:00
< / defs >
< / svg >
< nav id = "navigation" class = "unselectable" >
< div id = "nav-container" >
2023-09-01 23:52:25 +00:00
< span id = "navicon" > < i class = "fa fa-bars" > < / i > < / span >
2020-01-21 06:35:58 +00:00
< ul id = "nav-list" >
2023-01-27 23:11:10 +00:00
< li class = "home-nav-element" > < a href = "{{ url('home') }}" > {% include "site-logo-fragment.html" %}< / a > < / li >
< li class = "home-nav-element" > < span class = "nav-divider" > < / span > < / li >
< li class = "home-menu-item" > < a href = "{{ url('home') }}" class = "nav-home" > {{ _('Home') }}< / a > < / li >
{% for node in mptt_tree(nav_bar) recursive %}
< li >
< a href = "{{ node.path }}" class = "nav-{{ node.key }}{% if node.key in nav_tab %} active{% endif %}" >
{{ user_trans(node.label) }}
{% if not node.is_leaf_node %}
< div href = "javascript:void(0)" class = "nav-expand" > >< / div >
{% endif %}
< / a >
{% with children=node.get_children() %}
{% if children %}< ul > {{ loop(children) }}< / ul > {% endif %}
{% endwith %}
< / li >
{% endfor %}
2020-01-21 06:35:58 +00:00
< / ul >
2022-11-10 02:57:50 +00:00
< div style = "float: right; display: inline-flex; font-size: larger; align-items: center; height: 100%;" >
2023-01-27 23:11:10 +00:00
< span class = "navbar-icons" >
{% if request.user.is_authenticated %}
< span title = "{{_('Chat')}}" >
< a id = "chat-icon" href = "{{ url('chat', '') }}" class = "icofont-wechat navbar-icon" aria-hidden = "true" >
{% set unread_chat = request.profile.count_unread_chat_boxes %}
{% if unread_chat %}
< sub class = "unread_boxes" > {{unread_chat}}< / sub >
{% endif %}
< / a >
< / span >
2021-12-09 20:31:49 +00:00
2023-01-27 23:11:10 +00:00
{% set unseen_cnt = request.profile.count_unseen_notifications %}
< span title = "{{_('Notification')}}" class = "{{ 'notification-open' if unseen_cnt > 0 }}" >
< a href = "{{ url('notification') }}" class = "icofont-alarm navbar-icon" id = "notification" aria-hidden = "true" >
{% if unseen_cnt > 0 %}
2022-08-28 04:00:17 +00:00
< sub class = "unread_boxes" > {{unseen_cnt}}< / sub >
2023-01-27 23:11:10 +00:00
{% endif %}
< / a >
< / span >
{% endif %}
< span title = "{{_('Language')}}" >
< a class = "icofont-globe navbar-icon" id = "nav-lang-icon" aria-hidden = "true" >
< sub class = "sub-lang" > {{LANGUAGE_CODE}}< / sub >
< / a >
< div id = "lang-dropdown" class = "dropdown" role = "tooltip" >
{% for language in language_info_list(LANGUAGES) %}
< div value = "{{ language.code }}"
class="dropdown-item lang-dropdown-item" style="{{'font-weight: bold' if language.code == LANGUAGE_CODE}}">
{{ language.name_local }}
< / div >
{% endfor %}
< / div >
2020-07-03 02:50:31 +00:00
< / span >
2023-01-27 23:11:10 +00:00
< span title = "{{_('Dark Mode')}}" >
< a class = "icofont-adjust navbar-icon black" id = "nav-darkmode-icon" aria-hidden = "true" href = "?darkmode=1" > < / a >
< / span >
< / span >
{% if request.user.is_authenticated %}
< span id = "user-links" >
2023-09-01 23:20:10 +00:00
< ul > < li >
2023-01-27 23:11:10 +00:00
< span >
2023-08-24 03:14:09 +00:00
< img src = "{{ gravatar(request.profile, 32) }}" height = "24" width = "24" > {# -#}
2023-01-27 23:11:10 +00:00
< span >
< b class = "{{request.profile.css_class}}" > {{ request.user.username }}< / b >
< / span >
2022-11-10 02:57:50 +00:00
< / span >
2023-09-01 23:20:10 +00:00
< / li > < / ul >
2023-01-27 23:11:10 +00:00
< / span >
< div class = "dropdown" id = "userlink_dropdown" role = "tooptip" >
2023-08-24 16:10:39 +00:00
< a href = "{{ url('user_page') }}" >
< div class = "dropdown-item" > {{ _('Profile') }}< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% if request.user.is_staff or request.user.is_superuser %}
2023-08-24 16:10:39 +00:00
< a href = "{{ url('admin:index') }}" >
< div class = "dropdown-item" > {{ _('Admin') }}< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% endif %}
{% if request.user.is_superuser %}
2023-08-24 16:10:39 +00:00
< a href = "{{ url('internal_problem') }}" >
< div class = "dropdown-item" > {{ _('Internal') }}< / div >
< / a >
< a href = "{{ url('site_stats') }}" >
< div class = "dropdown-item" > {{ _('Stats') }}< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% endif %}
2023-08-24 16:10:39 +00:00
< a href = "{{ url('user_edit_profile') }}" >
< div class = "dropdown-item" > {{ _('Edit profile') }}< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% if request.user.is_impersonate %}
2023-08-24 16:10:39 +00:00
< a href = "{{ url('impersonate-stop') }}" >
< div class = "dropdown-item" > Stop impersonating< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% else %}
2023-08-24 16:10:39 +00:00
< a href = "#" id = "logout" class = "red" >
< div class = "dropdown-item" >
{{ _('Log out') }}
< form id = "logout-form" action = "{{ url('auth_logout') }}" method = "POST" >
{% csrf_token %}
< / form >
< / div >
< / a >
2023-01-27 23:11:10 +00:00
{% endif %}
< / div >
{% else %}
< span class = "anon" >
< a href = "{{ url('auth_login') }}?next={{ LOGIN_RETURN_PATH|urlencode }}" > < b > {{ _('Log in') }}< / b > < / a >
{{ _('or') }}
< a href = "{{ url('registration_register') }}" > < b > {{ _('Sign up') }}< / b > < / a >
< / span >
{% endif %}
2020-07-03 02:50:31 +00:00
< / div >
2023-01-27 23:11:10 +00:00
< / div >
< div id = "nav-shadow" > < / div >
< / nav >
2023-09-01 23:09:30 +00:00
< div id = "loading-bar" > < / div >
2023-01-27 23:11:10 +00:00
{% if request.in_contest %}
< div id = "contest-info" >
2022-01-10 11:13:46 +00:00
< div id = "contest-info-main" >
2023-01-27 23:11:10 +00:00
< a href = "{{ url('contest_view', request.participation.contest.key) }}" style = "vertical-align: middle; display: inline" >
{{ request.participation.contest.name }} -
{% if request.participation.spectate %}
{{ _('spectating') }}
{% elif request.participation.end_time %}
< div id = "contest-time-remaining" data-secs = "{{request.participation.end_time}}" >
{{ request.participation.time_remaining|timedelta("localized") }}
< / div >
2020-01-21 06:35:58 +00:00
{% else %}
2023-01-27 23:11:10 +00:00
{{ _('virtual') }}
2020-01-21 06:35:58 +00:00
{% endif %}
2023-01-27 23:11:10 +00:00
< / a >
2022-01-10 11:13:46 +00:00
< / div >
2023-01-27 23:11:10 +00:00
< div id = "contest-info-toggle" class = "{{'contest-info-toggle-mode-on' if request.contest_mode else 'contest-info-toggle-mode-off'}}" >
{% if request.contest_mode %}
< i class = "fa fa-toggle-on white" > < / i > {{_('Compete')}}
{% else %}
< i class = "fa fa-toggle-off white" > < / i > {{_('General')}}
{% endif %}
< / div >
< / div >
{% endif %}
< div id = "page-container" >
< noscript >
2020-01-21 06:35:58 +00:00
< div id = "noscript" > {{ _('This site works best with JavaScript enabled.') }}< / div >
2023-01-27 23:11:10 +00:00
< / noscript >
2023-02-08 05:14:48 +00:00
< main id = "content" class = "{{'wrapper' if layout != 'no_wrapper'}}" >
2020-01-21 06:35:58 +00:00
{% block title_row %}
2023-01-27 23:11:10 +00:00
< h2 class = "title-row" >
{% block content_title %}
{% if content_title %}{{ content_title }}{% else %}{{ title }}{% endif %}
{% endblock %}
< / h2 >
2020-01-21 06:35:58 +00:00
{% endblock %}
{% block header %}{% endblock %}
{% block title_ruler %}
2023-01-27 23:11:10 +00:00
< hr >
2020-01-21 06:35:58 +00:00
{% endblock %}
< div id = "content-body" > {% block body %}{% endblock %}< / div >
2023-01-27 23:11:10 +00:00
< / main >
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
{% if i18n_config.announcement %}
2020-01-21 06:35:58 +00:00
< div id = "announcement" > {{ i18n_config.announcement|safe }}< / div >
2023-01-27 23:11:10 +00:00
{% endif %}
2020-01-21 06:35:58 +00:00
2023-01-27 23:11:10 +00:00
{% block bodyend %}{% endblock %}
{% block footer %}
< footer >
< span id = "footer-content" >
2020-01-21 06:35:58 +00:00
< br >
2022-12-18 09:31:31 +00:00
< a class = "background-footer" target = "_blank" href = "https://dmoj.ca" > proudly powered by < b > DMOJ< / b > < / a > < a target = "_blank" href = "https://github.com/LQDJudge/online-judge" > | developed by LQDJudge team< / a > |
2020-01-21 06:35:58 +00:00
{% if i18n_config.footer %}
2023-01-27 23:11:10 +00:00
{{ i18n_config.footer|safe }} |
2020-01-21 06:35:58 +00:00
{% endif %}
2022-09-01 23:39:19 +00:00
< form action = "{{ url('set_language') }}" method = "post" style = "display: inline" id = "form-lang" >
2023-01-27 23:11:10 +00:00
{% csrf_token %}
< input name = "next" type = "hidden" value = "{{ request.get_full_path() }}" >
< select name = "language" onchange = "form.submit()" style = "height: 1.5em" >
2020-01-21 06:35:58 +00:00
{% for language in language_info_list(LANGUAGES) %}
2023-01-27 23:11:10 +00:00
< option value = "{{ language.code }}" { % if language . code = = LANGUAGE_CODE % } selected { % endif % } >
{{ language.name_local }} ({{ language.code }})
< / option >
2020-01-21 06:35:58 +00:00
{% endfor %}
2023-01-27 23:11:10 +00:00
< / select >
< / form >
< / span >
< / footer >
{% endblock %}
< / div >
2023-01-14 06:44:24 +00:00
< link rel = "preconnect" href = "https://fonts.googleapis.com" >
< link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin >
2023-01-16 04:49:03 +00:00
< link href = "https://fonts.googleapis.com/css2?family=Fira+Code&family=Noto+Sans&display=swap" rel = "stylesheet" >
2023-01-27 23:11:10 +00:00
< / body >
2020-01-21 06:35:58 +00:00
< / html >