diff --git a/README.md b/README.md index 7087452..d4cdc43 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,197 @@ Support plagiarism detection via [Stanford MOSS](https://theory.stanford.edu/~ai Most of the setup are the same as DMOJ installations. You can view the installation guide of DMOJ here: https://docs.dmoj.ca/#/site/installation. There is one minor change: Instead of `git clone https://github.com/DMOJ/site.git`, you clone this repo `git clone https://github.com/LQDJudge/online-judge.git`. + +- Bước 1: cài các thư viện cần thiết + - $ ở đây nghĩa là sudo. Ví dụ dòng đầu nghĩa là chạy lệnh `sudo apt update` + +```jsx +$ apt update +$ apt install git gcc g++ make python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev gettext curl redis-server +$ curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash - +$ apt install nodejs +$ npm install -g sass postcss-cli postcss autoprefixer +``` + +- Bước 2: tạo DB + - Server đang dùng MariaDB ≥ 10.5, các bạn cũng có thể dùng Mysql nếu bị conflict + - Nếu các bạn chạy lệnh dưới này xong mà version mariadb bị cũ (< 10.5) thì có thể tra google cách cài MariaDB mới nhất (10.5 hoặc 10.6). + - Các bạn có thể thấy version MariaDB bằng cách gõ lệnh `sudo mysql` (Ctrl + C để quit) + +```jsx +$ apt update +$ apt install mariadb-server libmysqlclient-dev +``` + +- Bước 3: tạo table trong DB + - Các bạn có thể thay tên table và password + +```jsx +$ sudo mysql +mariadb> CREATE DATABASE dmoj DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; +mariadb> GRANT ALL PRIVILEGES ON dmoj.* TO 'dmoj'@'localhost' IDENTIFIED BY ''; +mariadb> exit +``` + +- Bước 4: Cài đặt môi trường ảo (virtual env) và pull code + - Nếu `pip3 install mysqlclient` bị lỗi thì thử chạy `sudo pip3 install mysqlclient==2.1.1` + +```jsx +$ python3 -m venv dmojsite +$ . dmojsite/bin/activate + +(dmojsite) $ git clone https://github.com/LQDJudge/online-judge.git +(dmojsite) $ cd online-judge +(dmojsite) $ git submodule init +(dmojsite) $ git submodule update +(dmojsite) $ pip3 install -r requirements.txt +(dmojsite) $ pip3 install mysqlclient +(dmojsite) $ pre-commit install +``` + +- Bước 5: tạo local_settings.py. Đây là file để custom setting cho Django. Các bạn tạo file vào `online-judge/dmoj/local_settings.py` + - File mẫu: https://github.com/DMOJ/docs/blob/master/sample_files/local_settings.py + - Nếu bạn đổi tên hoặc mật khẩu table databases thì thay đổi thông tin tương ứng trong `Databases` + - Sau khi xong, chạy lệnh `(dmojsite) $ python3 manage.py check` để kiểm tra +- Bước 6: Compile CSS và translation + - Giải thích: + - Lệnh 1 và 2 gọi sau mỗi lần thay đổi 1 file css hoặc file js (file html thì không cần) + - Lệnh 3 và 4 gọi sau mỗi lần thay đổi file dịch + - Note: Sau khi chạy lệnh này, folder tương ứng với STATIC_ROOT trong local_settings phải được tạo. Nếu chưa được tạo thì mình cần tạo folder đó trước khi chạy 2 lệnh đầu. + +```jsx +(dmojsite) $ ./make_style.sh +(dmojsite) $ python3 manage.py collectstatic +(dmojsite) $ python3 manage.py compilemessages +(dmojsite) $ python3 manage.py compilejsi18n +``` + +- Bước 7: Thêm dữ liệu vào DB + +```jsx +(dmojsite) $ python3 manage.py migrate +(dmojsite) $ python3 manage.py loaddata navbar +(dmojsite) $ python3 manage.py loaddata language_small +(dmojsite) $ python3 manage.py loaddata demo +``` + +- Bước 8: Chạy site. Đến đây thì cơ bản đã hoàn thành (chưa có judge, websocket, celery). Các bạn có thể truy cập tại `localhost:8000` + +```jsx +python3 manage.py runserver 0.0.0.0:8000 +``` + +**Một số lưu ý:** + +1. (WSL) có thể tải ứng dụng Terminal trong Windows Store +2. (WSL) mỗi lần mở ubuntu, các bạn cần chạy lệnh sau để mariadb khởi động: `sudo service mysql restart` (tương tự cho một số service khác như memcached, celery) +3. Sau khi cài đặt, các bạn chỉ cần activate virtual env và chạy lệnh runserver là ok +```jsx +. dmojsite/bin/activate +python3 manage.py runserver +``` +5. Đối với nginx, sau khi config xong theo guide của DMOJ, bạn cần thêm location như sau để sử dụng được tính năng profile image, thay thế `path/to/oj` thành đường dẫn nơi bạn đã clone source code. + +``` +location /profile_images/ { + root /path/to/oj; +} +``` + +6. Quy trình dev: + 1. Sau khi thay đổi code thì django tự build lại, các bạn chỉ cần F5 + 2. Một số style nằm trong các file .scss. Các bạn cần recompile css thì mới thấy được thay đổi. + +**Optional:** + +************Alias:************ Các bạn có thể lưu các alias này để sau này dùng cho nhanh + +- mtrans: để generate translation khi các bạn add một string trong code +- trans: compile translation (sau khi bạn đã dịch tiếng Việt) +- cr: chuyển tới folder OJ +- pr: chạy server +- sm: restart service (chủ yếu dùng cho WSL) +- sd: activate virtual env +- css: compile các file css + +```jsx +alias mtrans='python3 manage.py makemessages -l vi && python3 manage.py makedmojmessages -l vi' +alias pr='python3 manage.py runserver' +alias sd='source ~/LQDOJ/dmojsite/bin/activate' +alias sm='sudo service mysql restart && sudo service redis-server start && sudo service memcached start' +alias trans='python3 manage.py compilemessages -l vi && python3 manage.py compilejsi18n -l vi' +alias cr='cd ~/LQDOJ/online-judge' +alias css='./make_style.sh && python3 manage.py collectstatic --noinput' +``` + +**Memcached:** dùng cho in-memory cache + +```jsx +$ sudo apt install memcached +``` + +**Websocket:** dùng để live update (như chat) + +- Tạo file online-judge/websocket/config.js + +```jsx +module.exports = { + get_host: '127.0.0.1', + get_port: 15100, + post_host: '127.0.0.1', + post_port: 15101, + http_host: '127.0.0.1', + http_port: 15102, + long_poll_timeout: 29000, +}; +``` + +- Cài các thư viện + +```jsx +(dmojsite) $ npm install qu ws simplesets +(dmojsite) $ pip3 install websocket-client +``` + +- Khởi động (trong 1 tab riêng) + +```jsx +(dmojsite) $ node websocket/daemon.js +``` + +**************Celery:************** (dùng cho một số task như batch rejudge_ + +```jsx +celery -A dmoj_celery worker +``` + +**************Judge:************** + +- Cài đặt ở 1 folder riêng bên ngoài site: + +```jsx +$ apt install python3-dev python3-pip build-essential libseccomp-dev +$ git clone https://github.com/LQDJudge/judge-server.git +$ cd judge-server +$ sudo pip3 install -e . +``` + +- Tạo một file judge.yml ở bên ngoài folder judge-server (file mẫu https://github.com/DMOJ/docs/blob/master/sample_files/judge_conf.yml) +- Thêm judge vào site bằng UI: Admin → Judge → Thêm Judge → nhập id và key (chỉ cần thêm 1 lần) hoặc dùng lệnh `(dmojsite) $ python3 managed.py addjudge `. +- Chạy Bridge (cầu nối giữa judge và site) trong 1 tab riêng trong folder online-judge: + +```jsx +(dmojsite) $ python3 managed.py runbridged +``` + +- Khởi động Judge (trong 1 tab riêng): + +```jsx +$ dmoj -c judge.yml localhost +``` + +- Lưu ý: mỗi lần sau này muốn chạy judge thì mở 1 tab cho bridge và n tab cho judge. Mỗi judge cần 1 file yml khác nhau (chứa authentication khác nhau) + ### Some frequent difficulties when installation: 1. Missing the `local_settings.py`. You need to copy the `local_settings.py` in order to pass the check. diff --git a/chat_box/migrations/0013_alter_message_time.py b/chat_box/migrations/0013_alter_message_time.py new file mode 100644 index 0000000..0f4ddc3 --- /dev/null +++ b/chat_box/migrations/0013_alter_message_time.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.18 on 2023-08-28 01:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("chat_box", "0012_auto_20230308_1417"), + ] + + operations = [ + migrations.AlterField( + model_name="message", + name="time", + field=models.DateTimeField( + auto_now_add=True, db_index=True, verbose_name="posted time" + ), + ), + ] diff --git a/chat_box/migrations/0014_userroom_unread_count.py b/chat_box/migrations/0014_userroom_unread_count.py new file mode 100644 index 0000000..8f407b3 --- /dev/null +++ b/chat_box/migrations/0014_userroom_unread_count.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.18 on 2023-08-28 06:02 + +from django.db import migrations, models + + +def migrate(apps, schema_editor): + UserRoom = apps.get_model("chat_box", "UserRoom") + Message = apps.get_model("chat_box", "Message") + + for ur in UserRoom.objects.all(): + if not ur.room: + continue + messages = ur.room.message_set + last_msg = messages.first() + try: + if last_msg and last_msg.author != ur.user: + ur.unread_count = messages.filter(time__gte=ur.last_seen).count() + else: + ur.unread_count = 0 + ur.save() + except: + continue + + +class Migration(migrations.Migration): + + dependencies = [ + ("chat_box", "0013_alter_message_time"), + ] + + operations = [ + migrations.AddField( + model_name="userroom", + name="unread_count", + field=models.IntegerField(db_index=True, default=0), + ), + migrations.RunPython(migrate, migrations.RunPython.noop, atomic=True), + ] diff --git a/chat_box/models.py b/chat_box/models.py index 61e39a6..fb3fd7b 100644 --- a/chat_box/models.py +++ b/chat_box/models.py @@ -1,9 +1,10 @@ from django.db import models -from django.db.models import CASCADE +from django.db.models import CASCADE, Q from django.utils.translation import gettext_lazy as _ from judge.models.profile import Profile +from judge.caching import cache_wrapper __all__ = ["Message", "Room", "UserRoom", "Ignore"] @@ -17,19 +18,28 @@ class Room(models.Model): Profile, related_name="user_two", verbose_name="user 2", on_delete=CASCADE ) + @cache_wrapper(prefix="Rc") def contain(self, profile): return self.user_one == profile or self.user_two == profile + @cache_wrapper(prefix="Rou") def other_user(self, profile): return self.user_one if profile == self.user_two else self.user_two + @cache_wrapper(prefix="Rus") def users(self): return [self.user_one, self.user_two] + @cache_wrapper(prefix="Rlmb") + def last_message_body(self): + return self.message_set.first().body + class Message(models.Model): author = models.ForeignKey(Profile, verbose_name=_("user"), on_delete=CASCADE) - time = models.DateTimeField(verbose_name=_("posted time"), auto_now_add=True) + time = models.DateTimeField( + verbose_name=_("posted time"), auto_now_add=True, db_index=True + ) body = models.TextField(verbose_name=_("body of comment"), max_length=8192) hidden = models.BooleanField(verbose_name="is hidden", default=False) room = models.ForeignKey( @@ -56,6 +66,7 @@ class UserRoom(models.Model): Room, verbose_name="room id", on_delete=CASCADE, default=None, null=True ) last_seen = models.DateTimeField(verbose_name=_("last seen"), auto_now_add=True) + unread_count = models.IntegerField(default=0, db_index=True) class Meta: unique_together = ("user", "room") @@ -74,11 +85,9 @@ class Ignore(models.Model): @classmethod def is_ignored(self, current_user, new_friend): try: - return ( - current_user.ignored_chat_users.get() - .ignored_users.filter(id=new_friend.id) - .exists() - ) + return current_user.ignored_chat_users.ignored_users.filter( + id=new_friend.id + ).exists() except: return False @@ -89,6 +98,16 @@ class Ignore(models.Model): except: return Profile.objects.none() + @classmethod + def get_ignored_rooms(self, user): + try: + ignored_users = self.objects.get(user=user).ignored_users.all() + return Room.objects.filter(Q(user_one=user) | Q(user_two=user)).filter( + Q(user_one__in=ignored_users) | Q(user_two__in=ignored_users) + ) + except: + return Room.objects.none() + @classmethod def add_ignore(self, current_user, friend): ignore, created = self.objects.get_or_create(user=current_user) diff --git a/chat_box/utils.py b/chat_box/utils.py index e25e861..dd59d98 100644 --- a/chat_box/utils.py +++ b/chat_box/utils.py @@ -1,10 +1,12 @@ from cryptography.fernet import Fernet +import hmac +import hashlib from django.conf import settings -from django.db.models import OuterRef, Count, Subquery, IntegerField +from django.db.models import OuterRef, Count, Subquery, IntegerField, Q from django.db.models.functions import Coalesce -from chat_box.models import Ignore, Message, UserRoom +from chat_box.models import Ignore, Message, UserRoom, Room secret_key = settings.CHAT_SECRET_KEY fernet = Fernet(secret_key) @@ -24,25 +26,22 @@ def decrypt_url(message_encrypted): return None, None -def get_unread_boxes(profile): - ignored_users = Ignore.get_ignored_users(profile) - - mess = ( - Message.objects.filter(room=OuterRef("room"), time__gte=OuterRef("last_seen")) - .exclude(author=profile) - .exclude(author__in=ignored_users) - .order_by() - .values("room") - .annotate(unread_count=Count("pk")) - .values("unread_count") +def encrypt_channel(channel): + return ( + hmac.new( + settings.CHAT_SECRET_KEY.encode(), + channel.encode(), + hashlib.sha512, + ).hexdigest()[:16] + + "%s" % channel ) + +def get_unread_boxes(profile): + ignored_rooms = Ignore.get_ignored_rooms(profile) unread_boxes = ( - UserRoom.objects.filter(user=profile, room__isnull=False) - .annotate( - unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), - ) - .filter(unread_count__gte=1) + UserRoom.objects.filter(user=profile, unread_count__gt=0) + .exclude(room__in=ignored_rooms) .count() ) diff --git a/chat_box/views.py b/chat_box/views.py index cea58e1..5a15f74 100644 --- a/chat_box/views.py +++ b/chat_box/views.py @@ -21,6 +21,8 @@ from django.db.models import ( Exists, Count, IntegerField, + F, + Max, ) from django.db.models.functions import Coalesce from django.utils import timezone @@ -34,7 +36,7 @@ from judge.jinja2.gravatar import gravatar from judge.models import Friend from chat_box.models import Message, Profile, Room, UserRoom, Ignore -from chat_box.utils import encrypt_url, decrypt_url +from chat_box.utils import encrypt_url, decrypt_url, encrypt_channel import json @@ -49,7 +51,8 @@ class ChatView(ListView): self.room_id = None self.room = None self.messages = None - self.page_size = 20 + self.first_page_size = 20 # only for first request + self.follow_up_page_size = 50 def get_queryset(self): return self.messages @@ -63,10 +66,12 @@ class ChatView(ListView): def get(self, request, *args, **kwargs): request_room = kwargs["room_id"] + page_size = self.follow_up_page_size try: last_id = int(request.GET.get("last_id")) except Exception: last_id = 1e15 + page_size = self.first_page_size only_messages = request.GET.get("only_messages") if request_room: @@ -80,11 +85,12 @@ class ChatView(ListView): request_room = None self.room_id = request_room - self.messages = Message.objects.filter( - hidden=False, room=self.room_id, id__lt=last_id - )[: self.page_size] + self.messages = ( + Message.objects.filter(hidden=False, room=self.room_id, id__lt=last_id) + .select_related("author", "author__user") + .defer("author__about", "author__user_script")[:page_size] + ) if not only_messages: - update_last_seen(request, **kwargs) return super().get(request, *args, **kwargs) return render( @@ -101,10 +107,14 @@ class ChatView(ListView): context["title"] = self.title context["last_msg"] = event.last() - context["status_sections"] = get_status_context(self.request) + context["status_sections"] = get_status_context(self.request.profile) context["room"] = self.room_id context["has_next"] = self.has_next() context["unread_count_lobby"] = get_unread_count(None, self.request.profile) + context["chat_channel"] = encrypt_channel( + "chat_" + str(self.request.profile.id) + ) + context["chat_lobby_channel"] = encrypt_channel("chat_lobby") if self.room: users_room = [self.room.user_one, self.room.user_two] users_room.remove(self.request.profile) @@ -187,7 +197,7 @@ def post_message(request): if not room: event.post( - "chat_lobby", + encrypt_channel("chat_lobby"), { "type": "lobby", "author_id": request.profile.id, @@ -197,9 +207,10 @@ def post_message(request): }, ) else: + Room.last_message_body.dirty(room) for user in room.users(): event.post( - "chat_" + str(user.id), + encrypt_channel("chat_" + str(user.id)), { "type": "private", "author_id": request.profile.id, @@ -208,6 +219,10 @@ def post_message(request): "tmp_id": request.POST.get("tmp_id"), }, ) + if user != request.profile: + UserRoom.objects.filter(user=user, room=room).update( + unread_count=F("unread_count") + 1 + ) return JsonResponse(ret) @@ -254,35 +269,33 @@ def update_last_seen(request, **kwargs): room_id = request.POST.get("room") else: return HttpResponseBadRequest() - try: profile = request.profile room = None if room_id: - room = Room.objects.get(id=int(room_id)) + room = Room.objects.filter(id=int(room_id)).first() except Room.DoesNotExist: return HttpResponseBadRequest() - except Exception as e: - return HttpResponseBadRequest() if room and not room.contain(profile): return HttpResponseBadRequest() user_room, _ = UserRoom.objects.get_or_create(user=profile, room=room) user_room.last_seen = timezone.now() + user_room.unread_count = 0 user_room.save() return JsonResponse({"msg": "updated"}) def get_online_count(): - last_two_minutes = timezone.now() - timezone.timedelta(minutes=2) - return Profile.objects.filter(last_access__gte=last_two_minutes).count() + last_5_minutes = timezone.now() - timezone.timedelta(minutes=5) + return Profile.objects.filter(last_access__gte=last_5_minutes).count() def get_user_online_status(user): time_diff = timezone.now() - user.last_access - is_online = time_diff <= timezone.timedelta(minutes=2) + is_online = time_diff <= timezone.timedelta(minutes=5) return is_online @@ -319,47 +332,67 @@ def user_online_status_ajax(request): ) -def get_online_status(request_user, queryset, rooms=None): - if not queryset: +def get_online_status(profile, other_profile_ids, rooms=None): + if not other_profile_ids: return None - last_two_minutes = timezone.now() - timezone.timedelta(minutes=2) + joined_ids = ",".join([str(id) for id in other_profile_ids]) + other_profiles = Profile.objects.raw( + f"SELECT * from judge_profile where id in ({joined_ids}) order by field(id,{joined_ids})" + ) + last_5_minutes = timezone.now() - timezone.timedelta(minutes=5) ret = [] - if rooms: - unread_count = get_unread_count(rooms, request_user) + unread_count = get_unread_count(rooms, profile) count = {} + last_msg = {} + room_of_user = {} for i in unread_count: - count[i["other_user"]] = i["unread_count"] + room = Room.objects.get(id=i["room"]) + other_profile = room.other_user(profile) + count[other_profile.id] = i["unread_count"] + for room in rooms: + room = Room.objects.get(id=room) + other_profile = room.other_user(profile) + last_msg[other_profile.id] = room.last_message_body() + room_of_user[other_profile.id] = room.id - for user in queryset: + for other_profile in other_profiles: is_online = False - if user.last_access >= last_two_minutes: + if other_profile.last_access >= last_5_minutes: is_online = True - user_dict = {"user": user, "is_online": is_online} - if rooms and user.id in count: - user_dict["unread_count"] = count[user.id] - user_dict["url"] = encrypt_url(request_user.id, user.id) + user_dict = {"user": other_profile, "is_online": is_online} + if rooms: + user_dict.update( + { + "unread_count": count.get(other_profile.id), + "last_msg": last_msg.get(other_profile.id), + "room": room_of_user.get(other_profile.id), + } + ) + user_dict["url"] = encrypt_url(profile.id, other_profile.id) ret.append(user_dict) return ret -def get_status_context(request, include_ignored=False): +def get_status_context(profile, include_ignored=False): if include_ignored: - ignored_users = Profile.objects.none() + ignored_users = [] queryset = Profile.objects else: - ignored_users = Ignore.get_ignored_users(request.profile) + ignored_users = list( + Ignore.get_ignored_users(profile).values_list("id", flat=True) + ) queryset = Profile.objects.exclude(id__in=ignored_users) - last_two_minutes = timezone.now() - timezone.timedelta(minutes=2) + last_5_minutes = timezone.now() - timezone.timedelta(minutes=5) recent_profile = ( - Room.objects.filter(Q(user_one=request.profile) | Q(user_two=request.profile)) + Room.objects.filter(Q(user_one=profile) | Q(user_two=profile)) .annotate( last_msg_time=Subquery( Message.objects.filter(room=OuterRef("pk")).values("time")[:1] ), other_user=Case( - When(user_one=request.profile, then="user_two"), + When(user_one=profile, then="user_two"), default="user_one", ), ) @@ -369,50 +402,36 @@ def get_status_context(request, include_ignored=False): .values("other_user", "id")[:20] ) - recent_profile_id = [str(i["other_user"]) for i in recent_profile] - joined_id = ",".join(recent_profile_id) + recent_profile_ids = [str(i["other_user"]) for i in recent_profile] recent_rooms = [int(i["id"]) for i in recent_profile] - recent_list = None - if joined_id: - recent_list = Profile.objects.raw( - f"SELECT * from judge_profile where id in ({joined_id}) order by field(id,{joined_id})" - ) - friend_list = ( - Friend.get_friend_profiles(request.profile) - .exclude(id__in=recent_profile_id) - .exclude(id__in=ignored_users) - .order_by("-last_access") - ) + admin_list = ( queryset.filter(display_rank="admin") - .exclude(id__in=friend_list) - .exclude(id__in=recent_profile_id) + .exclude(id__in=recent_profile_ids) + .values_list("id", flat=True) ) + all_user_status = ( - queryset.filter(display_rank="user", last_access__gte=last_two_minutes) + queryset.filter(last_access__gte=last_5_minutes) .annotate(is_online=Case(default=True, output_field=BooleanField())) .order_by("-rating") - .exclude(id__in=friend_list) .exclude(id__in=admin_list) - .exclude(id__in=recent_profile_id)[:30] + .exclude(id__in=recent_profile_ids) + .values_list("id", flat=True)[:30] ) return [ { "title": "Recent", - "user_list": get_online_status(request.profile, recent_list, recent_rooms), - }, - { - "title": "Following", - "user_list": get_online_status(request.profile, friend_list), + "user_list": get_online_status(profile, recent_profile_ids, recent_rooms), }, { "title": "Admin", - "user_list": get_online_status(request.profile, admin_list), + "user_list": get_online_status(profile, admin_list), }, { "title": "Other", - "user_list": get_online_status(request.profile, all_user_status), + "user_list": get_online_status(profile, all_user_status), }, ] @@ -423,7 +442,7 @@ def online_status_ajax(request): request, "chat/online_status.html", { - "status_sections": get_status_context(request), + "status_sections": get_status_context(request.profile), "unread_count_lobby": get_unread_count(None, request.profile), }, ) @@ -447,7 +466,6 @@ def get_or_create_room(request): return HttpResponseBadRequest() request_id, other_id = decrypt_url(decrypted_other_id) - if not other_id or not request_id or request_id != request.profile.id: return HttpResponseBadRequest() @@ -475,48 +493,22 @@ def get_or_create_room(request): def get_unread_count(rooms, user): if rooms: - mess = ( - Message.objects.filter( - room=OuterRef("room"), time__gte=OuterRef("last_seen") - ) - .exclude(author=user) - .order_by() - .values("room") - .annotate(unread_count=Count("pk")) - .values("unread_count") - ) - - return ( - UserRoom.objects.filter(user=user, room__in=rooms) - .annotate( - unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), - other_user=Case( - When(room__user_one=user, then="room__user_two"), - default="room__user_one", - ), - ) - .filter(unread_count__gte=1) - .values("other_user", "unread_count") - ) + return UserRoom.objects.filter( + user=user, room__in=rooms, unread_count__gt=0 + ).values("unread_count", "room") else: # lobby - mess = ( - Message.objects.filter(room__isnull=True, time__gte=OuterRef("last_seen")) - .exclude(author=user) - .order_by() - .values("room") - .annotate(unread_count=Count("pk")) - .values("unread_count") - ) - + user_room = UserRoom.objects.filter(user=user, room__isnull=True).first() + if not user_room: + return 0 + last_seen = user_room.last_seen res = ( - UserRoom.objects.filter(user=user, room__isnull=True) - .annotate( - unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), - ) - .values_list("unread_count", flat=True) + Message.objects.filter(room__isnull=True, time__gte=last_seen) + .exclude(author=user) + .exclude(hidden=True) + .count() ) - return res[0] if len(res) else 0 + return res @login_required diff --git a/dmoj/settings.py b/dmoj/settings.py index dea5179..d5cfa38 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -9,6 +9,7 @@ https://docs.djangoproject.com/en/1.11/ref/settings/ """ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import datetime import os import tempfile @@ -83,6 +84,7 @@ DMOJ_STATS_SUBMISSION_RESULT_COLORS = { "CE": "#42586d", "ERR": "#ffa71c", } +DMOJ_PROFILE_IMAGE_ROOT = "profile_images" MARKDOWN_STYLES = {} MARKDOWN_DEFAULT_STYLE = {} @@ -475,10 +477,16 @@ ML_OUTPUT_PATH = None # Use subdomain for organizations USE_SUBDOMAIN = False +# Chat +CHAT_SECRET_KEY = "QUdVFsxk6f5-Hd8g9BXv81xMqvIZFRqMl-KbRzztW-U=" + +# Nginx +META_REMOTE_ADDRESS_KEY = "REMOTE_ADDR" + +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" + try: with open(os.path.join(os.path.dirname(__file__), "local_settings.py")) as f: exec(f.read(), globals()) except IOError: pass - -DEFAULT_AUTO_FIELD = "django.db.models.AutoField" diff --git a/dmoj/urls.py b/dmoj/urls.py index 54a7f12..402a569 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -65,6 +65,7 @@ from judge.views import ( internal, resolver, course, + email, ) from judge.views.problem_data import ( ProblemDataView, @@ -104,19 +105,19 @@ register_patterns = [ # confusing 404. url( r"^activate/(?P\w+)/$", - ActivationView.as_view(title="Activation key invalid"), + ActivationView.as_view(title=_("Activation key invalid")), name="registration_activate", ), url( r"^register/$", - RegistrationView.as_view(title="Register"), + RegistrationView.as_view(title=_("Register")), name="registration_register", ), url( r"^register/complete/$", TitledTemplateView.as_view( template_name="registration/registration_complete.html", - title="Registration Completed", + title=_("Registration Completed"), ), name="registration_complete", ), @@ -124,7 +125,7 @@ register_patterns = [ r"^register/closed/$", TitledTemplateView.as_view( template_name="registration/registration_closed.html", - title="Registration not allowed", + title=_("Registration not allowed"), ), name="registration_disallowed", ), @@ -183,6 +184,17 @@ register_patterns = [ ), name="password_reset_done", ), + url(r"^email/change/$", email.email_change_view, name="email_change"), + url( + r"^email/change/verify/(?P[0-9A-Za-z]+)-(?P.+)/$", + email.verify_email_view, + name="email_change_verify", + ), + url( + r"^email/change/pending$", + email.email_change_pending_view, + name="email_change_pending", + ), url(r"^social/error/$", register.social_auth_error, name="social_auth_error"), url(r"^2fa/$", totp.TOTPLoginView.as_view(), name="login_2fa"), url(r"^2fa/enable/$", totp.TOTPEnableView.as_view(), name="enable_2fa"), diff --git a/judge/admin/__init__.py b/judge/admin/__init__.py index 5150d9f..94af5aa 100644 --- a/judge/admin/__init__.py +++ b/judge/admin/__init__.py @@ -1,5 +1,6 @@ from django.contrib import admin from django.contrib.admin.models import LogEntry +from django.contrib.auth.models import User from judge.admin.comments import CommentAdmin from judge.admin.contest import ContestAdmin, ContestParticipationAdmin, ContestTagAdmin @@ -11,7 +12,7 @@ from judge.admin.interface import ( ) from judge.admin.organization import OrganizationAdmin, OrganizationRequestAdmin from judge.admin.problem import ProblemAdmin, ProblemPointsVoteAdmin -from judge.admin.profile import ProfileAdmin +from judge.admin.profile import ProfileAdmin, UserAdmin from judge.admin.runtime import JudgeAdmin, LanguageAdmin from judge.admin.submission import SubmissionAdmin from judge.admin.taxon import ProblemGroupAdmin, ProblemTypeAdmin @@ -66,3 +67,5 @@ admin.site.register(Submission, SubmissionAdmin) admin.site.register(Ticket, TicketAdmin) admin.site.register(VolunteerProblemVote, VolunteerProblemVoteAdmin) admin.site.register(Course) +admin.site.unregister(User) +admin.site.register(User, UserAdmin) diff --git a/judge/admin/contest.py b/judge/admin/contest.py index f183880..9c8b6fd 100644 --- a/judge/admin/contest.py +++ b/judge/admin/contest.py @@ -71,7 +71,6 @@ class ContestProblemInlineForm(ModelForm): "hidden_subtasks": TextInput(attrs={"size": "3"}), "points": TextInput(attrs={"size": "1"}), "order": TextInput(attrs={"size": "1"}), - "output_prefix_override": TextInput(attrs={"size": "1"}), } @@ -86,7 +85,7 @@ class ContestProblemInline(admin.TabularInline): "is_pretested", "max_submissions", "hidden_subtasks", - "output_prefix_override", + "show_testcases", "order", "rejudge_column", ) diff --git a/judge/admin/profile.py b/judge/admin/profile.py index d19a80b..422fc5d 100644 --- a/judge/admin/profile.py +++ b/judge/admin/profile.py @@ -3,6 +3,7 @@ from django.forms import ModelForm from django.utils.html import format_html from django.utils.translation import gettext, gettext_lazy as _, ungettext from reversion.admin import VersionAdmin +from django.contrib.auth.admin import UserAdmin as OldUserAdmin from django_ace import AceWidget from judge.models import Profile @@ -167,3 +168,38 @@ class ProfileAdmin(VersionAdmin): "javascript", request.profile.ace_theme ) return form + + +class UserAdmin(OldUserAdmin): + # Customize the fieldsets for adding and editing users + fieldsets = ( + (None, {"fields": ("username", "password")}), + ("Personal Info", {"fields": ("first_name", "last_name", "email")}), + ( + "Permissions", + { + "fields": ( + "is_active", + "is_staff", + "is_superuser", + "groups", + "user_permissions", + ) + }, + ), + ("Important dates", {"fields": ("last_login", "date_joined")}), + ) + + readonly_fields = ("last_login", "date_joined") + + def get_readonly_fields(self, request, obj=None): + fields = self.readonly_fields + if not request.user.is_superuser: + fields += ( + "is_staff", + "is_active", + "is_superuser", + "groups", + "user_permissions", + ) + return fields diff --git a/judge/caching.py b/judge/caching.py index ad27f2f..42e9311 100644 --- a/judge/caching.py +++ b/judge/caching.py @@ -5,9 +5,10 @@ from django.db.models.query import QuerySet import hashlib MAX_NUM_CHAR = 15 +NONE_RESULT = "__None__" -def cache_wrapper(prefix, timeout=86400): +def cache_wrapper(prefix, timeout=None): def arg_to_str(arg): if hasattr(arg, "id"): return str(arg.id) @@ -31,8 +32,11 @@ def cache_wrapper(prefix, timeout=86400): cache_key = get_key(func, *args, **kwargs) result = cache.get(cache_key) if result is not None: + if result == NONE_RESULT: + result = None return result - + if result is None: + result = NONE_RESULT result = func(*args, **kwargs) cache.set(cache_key, result, timeout) return result diff --git a/judge/contest_format/__init__.py b/judge/contest_format/__init__.py index 8d2ccc9..9f6d628 100644 --- a/judge/contest_format/__init__.py +++ b/judge/contest_format/__init__.py @@ -4,4 +4,5 @@ from judge.contest_format.ecoo import ECOOContestFormat from judge.contest_format.icpc import ICPCContestFormat from judge.contest_format.ioi import IOIContestFormat from judge.contest_format.new_ioi import NewIOIContestFormat +from judge.contest_format.ultimate import UltimateContestFormat from judge.contest_format.registry import choices, formats diff --git a/judge/contest_format/ultimate.py b/judge/contest_format/ultimate.py new file mode 100644 index 0000000..7960d02 --- /dev/null +++ b/judge/contest_format/ultimate.py @@ -0,0 +1,55 @@ +from django.utils.translation import gettext_lazy + +from judge.contest_format.ioi import IOIContestFormat +from judge.contest_format.registry import register_contest_format +from django.db.models import Min, OuterRef, Subquery + +# This contest format only counts last submission for each problem. + + +@register_contest_format("ultimate") +class UltimateContestFormat(IOIContestFormat): + name = gettext_lazy("Ultimate") + + def update_participation(self, participation): + cumtime = 0 + score = 0 + format_data = {} + + queryset = participation.submissions + if self.contest.freeze_after: + queryset = queryset.filter( + submission__date__lt=participation.start + self.contest.freeze_after + ) + + queryset = ( + queryset.values("problem_id") + .filter( + id=Subquery( + queryset.filter(problem_id=OuterRef("problem_id")) + .order_by("-id") + .values("id")[:1] + ) + ) + .values_list("problem_id", "submission__date", "points") + ) + + for problem_id, time, points in queryset: + if self.config["cumtime"]: + dt = (time - participation.start).total_seconds() + if points: + cumtime += dt + else: + dt = 0 + format_data[str(problem_id)] = { + "time": dt, + "points": points, + } + score += points + + self.handle_frozen_state(participation, format_data) + participation.cumtime = max(cumtime, 0) + participation.score = round(score, self.contest.points_precision) + participation.tiebreaker = 0 + participation.format_data = format_data + participation.save() diff --git a/judge/event_poster_amqp.py b/judge/event_poster_amqp.py index 959d882..24cec72 100644 --- a/judge/event_poster_amqp.py +++ b/judge/event_poster_amqp.py @@ -16,7 +16,7 @@ class EventPoster(object): def _connect(self): self._conn = pika.BlockingConnection( - pika.URLParameters(settings.EVENT_DAEMON_AMQP) + pika.URLParameters(settings.EVENT_DAEMON_AMQP), ) self._chan = self._conn.channel() @@ -25,7 +25,7 @@ class EventPoster(object): id = int(time() * 1000000) self._chan.basic_publish( self._exchange, - "", + "#", json.dumps({"id": id, "channel": channel, "message": message}), ) return id diff --git a/judge/forms.py b/judge/forms.py index 504338b..d627b0e 100644 --- a/judge/forms.py +++ b/judge/forms.py @@ -50,6 +50,7 @@ from judge.widgets import ( HeavySelect2Widget, Select2MultipleWidget, DateTimePickerWidget, + ImageWidget, ) from judge.tasks import rescore_contest @@ -78,12 +79,16 @@ class ProfileForm(ModelForm): "language", "ace_theme", "user_script", + "profile_image", + "css_background", ] widgets = { "user_script": AceWidget(theme="github"), "timezone": Select2Widget(attrs={"style": "width:200px"}), "language": Select2Widget(attrs={"style": "width:200px"}), "ace_theme": Select2Widget(attrs={"style": "width:200px"}), + "profile_image": ImageWidget, + "css_background": forms.TextInput(), } has_math_config = bool(settings.MATHOID_URL) @@ -100,12 +105,22 @@ class ProfileForm(ModelForm): def __init__(self, *args, **kwargs): user = kwargs.pop("user", None) super(ProfileForm, self).__init__(*args, **kwargs) + self.fields["profile_image"].required = False + + def clean_profile_image(self): + profile_image = self.cleaned_data.get("profile_image") + if profile_image: + if profile_image.size > 5 * 1024 * 1024: + raise ValidationError( + _("File size exceeds the maximum allowed limit of 5MB.") + ) + return profile_image def file_size_validator(file): - limit = 1 * 1024 * 1024 + limit = 10 * 1024 * 1024 if file.size > limit: - raise ValidationError("File too large. Size should not exceed 1MB.") + raise ValidationError("File too large. Size should not exceed 10MB.") class ProblemSubmitForm(ModelForm): @@ -474,6 +489,15 @@ class ContestCloneForm(Form): max_length=20, validators=[RegexValidator("^[a-z0-9]+$", _("Contest id must be ^[a-z0-9]+$"))], ) + organization = ChoiceField(choices=(), required=True) + + def __init__(self, *args, org_choices=(), profile=None, **kwargs): + super(ContestCloneForm, self).__init__(*args, **kwargs) + self.fields["organization"].widget = Select2Widget( + attrs={"style": "width: 100%", "data-placeholder": _("Group")}, + ) + self.fields["organization"].choices = org_choices + self.profile = profile def clean_key(self): key = self.cleaned_data["key"] @@ -481,6 +505,16 @@ class ContestCloneForm(Form): raise ValidationError(_("Contest with key already exists.")) return key + def clean_organization(self): + organization_id = self.cleaned_data["organization"] + try: + organization = Organization.objects.get(id=organization_id) + except Exception: + raise ValidationError(_("Group doesn't exist.")) + if not organization.admins.filter(id=self.profile.id).exists(): + raise ValidationError(_("You don't have permission in this group.")) + return organization + class ProblemPointsVoteForm(ModelForm): class Meta: @@ -496,19 +530,47 @@ class ContestProblemForm(ModelForm): "problem", "points", "partial", - "output_prefix_override", + "show_testcases", "max_submissions", ) widgets = { "problem": HeavySelect2Widget( - data_view="problem_select2", attrs={"style": "width:100%"} + data_view="problem_select2", attrs={"style": "width: 100%"} ), } +class ContestProblemModelFormSet(BaseModelFormSet): + def is_valid(self): + valid = super().is_valid() + + if not valid: + return valid + + problems = set() + duplicates = [] + + for form in self.forms: + if form.cleaned_data and not form.cleaned_data.get("DELETE", False): + problem = form.cleaned_data.get("problem") + if problem in problems: + duplicates.append(problem) + else: + problems.add(problem) + + if duplicates: + for form in self.forms: + problem = form.cleaned_data.get("problem") + if problem in duplicates: + form.add_error("problem", _("This problem is duplicated.")) + return False + + return True + + class ContestProblemFormSet( formset_factory( - ContestProblemForm, formset=BaseModelFormSet, extra=6, can_delete=True + ContestProblemForm, formset=ContestProblemModelFormSet, extra=6, can_delete=True ) ): model = ContestProblem diff --git a/judge/jinja2/gravatar.py b/judge/jinja2/gravatar.py index 2848d92..cffa413 100644 --- a/judge/jinja2/gravatar.py +++ b/judge/jinja2/gravatar.py @@ -9,14 +9,15 @@ from . import registry @registry.function -def gravatar(email, size=80, default=None): - if isinstance(email, Profile): +def gravatar(profile, size=80, default=None, profile_image=None, email=None): + if profile_image: + return profile_image + if profile and profile.profile_image: + return profile.profile_image.url + if profile: + email = email or profile.user.email if default is None: - default = email.mute - email = email.user.email - elif isinstance(email, AbstractUser): - email = email.email - + default = profile.mute gravatar_url = ( "//www.gravatar.com/avatar/" + hashlib.md5(utf8bytes(email.strip().lower())).hexdigest() diff --git a/judge/migrations/0162_profile_image.py b/judge/migrations/0162_profile_image.py new file mode 100644 index 0000000..b371f39 --- /dev/null +++ b/judge/migrations/0162_profile_image.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.18 on 2023-08-24 00:50 + +from django.db import migrations, models +import judge.models.profile + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0161_auto_20230803_1536"), + ] + + operations = [ + migrations.AddField( + model_name="profile", + name="profile_image", + field=models.ImageField( + null=True, upload_to=judge.models.profile.profile_image_path + ), + ), + ] diff --git a/judge/migrations/0163_email_change.py b/judge/migrations/0163_email_change.py new file mode 100644 index 0000000..985121d --- /dev/null +++ b/judge/migrations/0163_email_change.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.18 on 2023-08-25 00:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0162_profile_image"), + ] + + operations = [ + migrations.AddField( + model_name="profile", + name="email_change_pending", + field=models.EmailField(blank=True, max_length=254, null=True), + ), + ] diff --git a/judge/migrations/0164_show_testcase.py b/judge/migrations/0164_show_testcase.py new file mode 100644 index 0000000..33cbdf8 --- /dev/null +++ b/judge/migrations/0164_show_testcase.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.18 on 2023-08-25 23:03 + +from django.db import migrations, models + + +def migrate_show_testcases(apps, schema_editor): + ContestProblem = apps.get_model("judge", "ContestProblem") + + for c in ContestProblem.objects.all(): + if c.output_prefix_override == 1: + c.show_testcases = True + c.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0163_email_change"), + ] + + operations = [ + migrations.AddField( + model_name="contestproblem", + name="show_testcases", + field=models.BooleanField(default=False, verbose_name="visible testcases"), + ), + migrations.RunPython( + migrate_show_testcases, migrations.RunPython.noop, atomic=True + ), + ] diff --git a/judge/migrations/0165_drop_output_prefix_override.py b/judge/migrations/0165_drop_output_prefix_override.py new file mode 100644 index 0000000..ea9b17a --- /dev/null +++ b/judge/migrations/0165_drop_output_prefix_override.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.18 on 2023-08-25 23:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0164_show_testcase"), + ] + + operations = [ + migrations.RemoveField( + model_name="contestproblem", + name="output_prefix_override", + ), + ] diff --git a/judge/migrations/0166_display_rank_index.py b/judge/migrations/0166_display_rank_index.py new file mode 100644 index 0000000..ffea311 --- /dev/null +++ b/judge/migrations/0166_display_rank_index.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.18 on 2023-08-28 01:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0165_drop_output_prefix_override"), + ] + + operations = [ + migrations.AlterField( + model_name="profile", + name="display_rank", + field=models.CharField( + choices=[ + ("user", "Normal User"), + ("setter", "Problem Setter"), + ("admin", "Admin"), + ], + db_index=True, + default="user", + max_length=10, + verbose_name="display rank", + ), + ), + ] diff --git a/judge/migrations/0167_ultimate_contest_format.py b/judge/migrations/0167_ultimate_contest_format.py new file mode 100644 index 0000000..636e882 --- /dev/null +++ b/judge/migrations/0167_ultimate_contest_format.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.18 on 2023-09-01 00:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0166_display_rank_index"), + ] + + operations = [ + migrations.AlterField( + model_name="contest", + name="format_name", + field=models.CharField( + choices=[ + ("atcoder", "AtCoder"), + ("default", "Default"), + ("ecoo", "ECOO"), + ("icpc", "ICPC"), + ("ioi", "IOI"), + ("ioi16", "New IOI"), + ("ultimate", "Ultimate"), + ], + default="default", + help_text="The contest format module to use.", + max_length=32, + verbose_name="contest format", + ), + ), + ] diff --git a/judge/migrations/0168_css_background.py b/judge/migrations/0168_css_background.py new file mode 100644 index 0000000..6210a26 --- /dev/null +++ b/judge/migrations/0168_css_background.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.18 on 2023-09-02 00:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0167_ultimate_contest_format"), + ] + + operations = [ + migrations.AddField( + model_name="profile", + name="css_background", + field=models.TextField( + blank=True, + help_text='CSS custom background properties: url("image_url"), color, etc', + max_length=300, + null=True, + verbose_name="Custom background", + ), + ), + ] diff --git a/judge/models/contest.py b/judge/models/contest.py index a169bd2..8bb3d5b 100644 --- a/judge/models/contest.py +++ b/judge/models/contest.py @@ -542,10 +542,7 @@ class Contest(models.Model, PageVotable, Bookmarkable): return True # If the user is a contest organizer or curator - if ( - user.has_perm("judge.edit_own_contest") - and user.profile.id in self.editor_ids - ): + if hasattr(user, "profile") and user.profile.id in self.editor_ids: return True return False @@ -775,12 +772,9 @@ class ContestProblem(models.Model): partial = models.BooleanField(default=True, verbose_name=_("partial")) is_pretested = models.BooleanField(default=False, verbose_name=_("is pretested")) order = models.PositiveIntegerField(db_index=True, verbose_name=_("order")) - output_prefix_override = models.IntegerField( - help_text=_("0 to not show testcases, 1 to show"), + show_testcases = models.BooleanField( verbose_name=_("visible testcases"), - null=True, - blank=True, - default=0, + default=False, ) max_submissions = models.IntegerField( help_text=_( diff --git a/judge/models/profile.py b/judge/models/profile.py index 63453e4..96f3cfd 100644 --- a/judge/models/profile.py +++ b/judge/models/profile.py @@ -1,4 +1,5 @@ from operator import mul +import os from django.conf import settings from django.contrib.auth.models import User @@ -27,6 +28,12 @@ class EncryptedNullCharField(EncryptedCharField): return super(EncryptedNullCharField, self).get_prep_value(value) +def profile_image_path(profile, filename): + tail = filename.split(".")[-1] + new_filename = f"user_{profile.id}.{tail}" + return os.path.join(settings.DMOJ_PROFILE_IMAGE_ROOT, new_filename) + + class Organization(models.Model): name = models.CharField(max_length=128, verbose_name=_("organization title")) slug = models.SlugField( @@ -102,6 +109,13 @@ class Organization(models.Model): "Organization membership test must be Profile or primany key" ) + def delete(self, *args, **kwargs): + contests = self.contest_set + for contest in contests.all(): + if contest.organizations.count() == 1: + contest.delete() + super().delete(*args, **kwargs) + def __str__(self): return self.name @@ -169,6 +183,7 @@ class Profile(models.Model): ("setter", "Problem Setter"), ("admin", "Admin"), ), + db_index=True, ) mute = models.BooleanField( verbose_name=_("comment mute"), @@ -229,6 +244,15 @@ class Profile(models.Model): blank=True, help_text=_("Notes for administrators regarding this user."), ) + profile_image = models.ImageField(upload_to=profile_image_path, null=True) + email_change_pending = models.EmailField(blank=True, null=True) + css_background = models.TextField( + verbose_name=_("Custom background"), + null=True, + blank=True, + help_text=_('CSS custom background properties: url("image_url"), color, etc'), + max_length=300, + ) @cached_property def organization(self): diff --git a/judge/user_log.py b/judge/user_log.py index 91a4c67..b8aec43 100644 --- a/judge/user_log.py +++ b/judge/user_log.py @@ -1,4 +1,5 @@ from django.utils.timezone import now +from django.conf import settings from judge.models import Profile @@ -17,8 +18,8 @@ class LogUserAccessMiddleware(object): ): updates = {"last_access": now()} # Decided on using REMOTE_ADDR as nginx will translate it to the external IP that hits it. - if request.META.get("REMOTE_ADDR"): - updates["ip"] = request.META.get("REMOTE_ADDR") + if request.META.get(settings.META_REMOTE_ADDRESS_KEY): + updates["ip"] = request.META.get(settings.META_REMOTE_ADDRESS_KEY) Profile.objects.filter(user_id=request.user.pk).update(**updates) return response diff --git a/judge/utils/email_render.py b/judge/utils/email_render.py new file mode 100644 index 0000000..5d790f5 --- /dev/null +++ b/judge/utils/email_render.py @@ -0,0 +1,20 @@ +from django.template.loader import render_to_string +from django.contrib.sites.shortcuts import get_current_site +from django.conf import settings + + +def render_email_message(request, contexts): + current_site = get_current_site(request) + email_contexts = { + "username": request.user.username, + "domain": current_site.domain, + "protocol": "https" if request.is_secure() else "http", + "site_name": settings.SITE_NAME, + "message": None, + "title": None, + "button_text": "Click here", + "url_path": None, + } + email_contexts.update(contexts) + message = render_to_string("general_email.html", email_contexts) + return message diff --git a/judge/views/contests.py b/judge/views/contests.py index b9f4b14..c183435 100644 --- a/judge/views/contests.py +++ b/judge/views/contests.py @@ -453,9 +453,19 @@ class ContestClone( form_class = ContestCloneForm permission_required = "judge.clone_contest" + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs["org_choices"] = tuple( + Organization.objects.filter(admins=self.request.profile).values_list( + "id", "name" + ) + ) + kwargs["profile"] = self.request.profile + return kwargs + def form_valid(self, form): tags = self.object.tags.all() - organizations = self.object.organizations.all() + organization = form.cleaned_data["organization"] private_contestants = self.object.private_contestants.all() view_contest_scoreboard = self.object.view_contest_scoreboard.all() contest_problems = self.object.contest_problems.all() @@ -469,7 +479,7 @@ class ContestClone( contest.save() contest.tags.set(tags) - contest.organizations.set(organizations) + contest.organizations.set([organization]) contest.private_contestants.set(private_contestants) contest.view_contest_scoreboard.set(view_contest_scoreboard) contest.authors.add(self.request.profile) @@ -480,7 +490,14 @@ class ContestClone( ContestProblem.objects.bulk_create(contest_problems) return HttpResponseRedirect( - reverse("admin:judge_contest_change", args=(contest.id,)) + reverse( + "organization_contest_edit", + args=( + organization.id, + organization.slug, + contest.key, + ), + ) ) @@ -1340,9 +1357,7 @@ class ContestClarificationAjax(ContestMixin, DetailView): raise Http404() polling_time = 1 # minute - last_one_minute = last_five_minutes = timezone.now() - timezone.timedelta( - minutes=polling_time - ) + last_one_minute = timezone.now() - timezone.timedelta(minutes=polling_time) queryset = ContestProblemClarification.objects.filter( problem__in=self.object.contest_problems.all(), date__gte=last_one_minute diff --git a/judge/views/email.py b/judge/views/email.py new file mode 100644 index 0000000..5544daf --- /dev/null +++ b/judge/views/email.py @@ -0,0 +1,121 @@ +from django.contrib.auth.tokens import default_token_generator +from django.core.mail import send_mail +from django.shortcuts import render, redirect +from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode +from django.utils.encoding import force_bytes, force_text +from django.conf import settings +from django import forms +from django.utils.translation import gettext_lazy as _ +from django.urls import reverse +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import User +from django.contrib.auth.hashers import check_password + +from urllib.parse import urlencode, urlunparse, urlparse + +from judge.models import Profile +from judge.utils.email_render import render_email_message + + +class EmailChangeForm(forms.Form): + new_email = forms.EmailField(label=_("New Email")) + password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop("user", None) + super().__init__(*args, **kwargs) + + def clean_new_email(self): + new_email = self.cleaned_data.get("new_email") + if User.objects.filter(email=new_email).exists(): + raise forms.ValidationError(_("An account with this email already exists.")) + return new_email + + def clean_password(self): + password = self.cleaned_data.get("password") + if not self.user.check_password(password): + raise forms.ValidationError("Invalid password") + return password + + +@login_required +def email_change_view(request): + form = EmailChangeForm(request.POST or None, user=request.user) + + if request.method == "POST" and form.is_valid(): + new_email = request.POST.get("new_email") + user = request.user + profile = request.profile + + # Generate a token for email verification + token = default_token_generator.make_token(user) + uid = urlsafe_base64_encode(force_bytes(user.pk)) + + # Send the email to the user + subject = settings.SITE_NAME + " - " + _("Email Change Request") + email_contexts = { + "message": _( + "We have received a request to change your email to this email. Click the button below to change your email:" + ), + "title": _("Email Change"), + "button_text": _("Change Email"), + "url_path": reverse( + "email_change_verify", kwargs={"uidb64": uid, "token": token} + ), + } + message = render_email_message(request, email_contexts) + send_mail( + subject, + message, + settings.EMAIL_HOST_USER, + [new_email], + html_message=message, + ) + profile.email_change_pending = new_email + profile.save() + return redirect("email_change_pending") + + return render( + request, + "email_change/email_change.html", + { + "form": form, + "title": _("Change email"), + }, + ) + + +def verify_email_view(request, uidb64, token): + try: + uid = force_text(urlsafe_base64_decode(uidb64)) + user = User.objects.get(pk=uid) + except (TypeError, ValueError, OverflowError, User.DoesNotExist): + user = None + if user is not None and default_token_generator.check_token(user, token): + profile = Profile.objects.get(user=user) + new_email = profile.email_change_pending + if new_email and not User.objects.filter(email=new_email).exists(): + user.email = new_email + profile.email_change_pending = None + user.save() + profile.save() + + return render( + request, + "email_change/email_change_success.html", + {"title": _("Success"), "user": user}, + ) + + return render( + request, "email_change/email_change_failure.html", {"title": _("Invalid")} + ) + + +def email_change_pending_view(request): + return render( + request, + "email_change/email_change_pending.html", + { + "title": _("Email change pending"), + }, + ) diff --git a/judge/views/internal.py b/judge/views/internal.py index 4467fc3..eff02a4 100644 --- a/judge/views/internal.py +++ b/judge/views/internal.py @@ -3,7 +3,7 @@ import json from django.views.generic import ListView from django.utils.translation import gettext as _, gettext_lazy -from django.db.models import Count +from django.db.models import Count, Q from django.http import HttpResponseForbidden from django.urls import reverse @@ -38,13 +38,19 @@ class InternalProblem(InternalView, ListView): **kwargs ) + def get_search_query(self): + return self.request.GET.get("q") or self.request.POST.get("q") + def get_queryset(self): - queryset = ( - Problem.objects.annotate(vote_count=Count("volunteer_user_votes")) - .filter(vote_count__gte=1) - .order_by("-vote_count") - ) - return queryset + queryset = Problem.objects.annotate( + vote_count=Count("volunteer_user_votes") + ).filter(vote_count__gte=1) + query = self.get_search_query() + if query: + queryset = queryset.filter( + Q(code__icontains=query) | Q(name__icontains=query) + ) + return queryset.order_by("-vote_count") def get_context_data(self, **kwargs): context = super(InternalProblem, self).get_context_data(**kwargs) @@ -52,6 +58,7 @@ class InternalProblem(InternalView, ListView): context["title"] = self.title context["page_prefix"] = self.request.path + "?page=" context["first_page_href"] = self.request.path + context["query"] = self.get_search_query() return context diff --git a/judge/views/organization.py b/judge/views/organization.py index 962be71..0576afe 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -926,8 +926,12 @@ class EditOrganizationContest( super().post(request, *args, **kwargs) return HttpResponseRedirect( reverse( - "organization_contests", - args=(self.organization_id, self.organization.slug), + "organization_contest_edit", + args=( + self.organization_id, + self.organization.slug, + self.contest.key, + ), ) ) diff --git a/judge/views/register.py b/judge/views/register.py index 76e8267..58d1d6f 100644 --- a/judge/views/register.py +++ b/judge/views/register.py @@ -15,7 +15,7 @@ from registration.backends.default.views import ( from registration.forms import RegistrationForm from sortedm2m.forms import SortedMultipleChoiceField -from judge.models import Language, Organization, Profile, TIMEZONE +from judge.models import Language, Profile, TIMEZONE from judge.utils.recaptcha import ReCaptchaField, ReCaptchaWidget from judge.widgets import Select2MultipleWidget, Select2Widget @@ -43,29 +43,10 @@ class CustomRegistrationForm(RegistrationForm): empty_label=None, widget=Select2Widget(attrs={"style": "width:100%"}), ) - organizations = SortedMultipleChoiceField( - queryset=Organization.objects.filter(is_open=True), - label=_("Groups"), - required=False, - widget=Select2MultipleWidget(attrs={"style": "width:100%"}), - ) if ReCaptchaField is not None: captcha = ReCaptchaField(widget=ReCaptchaWidget()) - def clean_organizations(self): - organizations = self.cleaned_data.get("organizations") or [] - max_orgs = settings.DMOJ_USER_MAX_ORGANIZATION_COUNT - - if sum(org.is_open for org in organizations) > max_orgs: - raise forms.ValidationError( - _("You may not be part of more than {count} public groups.").format( - count=max_orgs - ) - ) - - return self.cleaned_data["organizations"] - def clean_email(self): if User.objects.filter(email=self.cleaned_data["email"]).exists(): raise forms.ValidationError( @@ -116,7 +97,6 @@ class RegistrationView(OldRegistrationView): cleaned_data = form.cleaned_data profile.timezone = cleaned_data["timezone"] profile.language = cleaned_data["language"] - profile.organizations.add(*cleaned_data["organizations"]) profile.save() return user diff --git a/judge/views/select2.py b/judge/views/select2.py index 0d1e60a..34d0778 100644 --- a/judge/views/select2.py +++ b/judge/views/select2.py @@ -1,8 +1,11 @@ +from urllib.parse import urljoin + from django.db.models import F, Q from django.http import Http404, JsonResponse from django.shortcuts import get_object_or_404 from django.utils.encoding import smart_text from django.views.generic.list import BaseListView +from django.conf import settings from chat_box.utils import encrypt_url @@ -54,7 +57,6 @@ class Select2View(BaseListView): class UserSelect2View(Select2View): def get(self, request, *args, **kwargs): self.org_id = kwargs.get("org_id", request.GET.get("org_id", "")) - print(self.org_id) return super(UserSelect2View, self).get(request, *args, **kwargs) def get_queryset(self): @@ -100,6 +102,21 @@ class UserSearchSelect2View(BaseListView): def get_queryset(self): return _get_user_queryset(self.term) + def get_json_result_from_object(self, user_tuple): + pk, username, email, display_rank, profile_image = user_tuple + return { + "text": username, + "id": username, + "gravatar_url": gravatar( + None, + self.gravatar_size, + self.gravatar_default, + self.get_profile_image_url(profile_image), + email, + ), + "display_rank": display_rank, + } + def get(self, request, *args, **kwargs): self.request = request self.kwargs = kwargs @@ -108,7 +125,7 @@ class UserSearchSelect2View(BaseListView): self.gravatar_default = request.GET.get("gravatar_default", None) self.object_list = self.get_queryset().values_list( - "pk", "user__username", "user__email", "display_rank" + "pk", "user__username", "user__email", "display_rank", "profile_image" ) context = self.get_context_data() @@ -116,15 +133,8 @@ class UserSearchSelect2View(BaseListView): return JsonResponse( { "results": [ - { - "text": username, - "id": username, - "gravatar_url": gravatar( - email, self.gravatar_size, self.gravatar_default - ), - "display_rank": display_rank, - } - for pk, username, email, display_rank in context["object_list"] + self.get_json_result_from_object(user_tuple) + for user_tuple in context["object_list"] ], "more": context["page_obj"].has_next(), } @@ -133,6 +143,11 @@ class UserSearchSelect2View(BaseListView): def get_name(self, obj): return str(obj) + def get_profile_image_url(self, profile_image): + if profile_image: + return urljoin(settings.MEDIA_URL, profile_image) + return None + class ContestUserSearchSelect2View(UserSearchSelect2View): def get_queryset(self): @@ -161,43 +176,20 @@ class AssigneeSelect2View(UserSearchSelect2View): ).distinct() -class ChatUserSearchSelect2View(BaseListView): - paginate_by = 20 - - def get_queryset(self): # TODO: add block - return _get_user_queryset(self.term) - - def get(self, request, *args, **kwargs): +class ChatUserSearchSelect2View(UserSearchSelect2View): + def get_json_result_from_object(self, user_tuple): if not self.request.user.is_authenticated: raise Http404() - self.request = request - self.kwargs = kwargs - self.term = kwargs.get("term", request.GET.get("term", "")) - self.gravatar_size = request.GET.get("gravatar_size", 128) - self.gravatar_default = request.GET.get("gravatar_default", None) - - self.object_list = self.get_queryset().values_list( - "pk", "user__username", "user__email", "display_rank" - ) - - context = self.get_context_data() - - return JsonResponse( - { - "results": [ - { - "text": username, - "id": encrypt_url(request.profile.id, pk), - "gravatar_url": gravatar( - email, self.gravatar_size, self.gravatar_default - ), - "display_rank": display_rank, - } - for pk, username, email, display_rank in context["object_list"] - ], - "more": context["page_obj"].has_next(), - } - ) - - def get_name(self, obj): - return str(obj) + pk, username, email, display_rank, profile_image = user_tuple + return { + "text": username, + "id": encrypt_url(self.request.profile.id, pk), + "gravatar_url": gravatar( + None, + self.gravatar_size, + self.gravatar_default, + self.get_profile_image_url(profile_image), + email, + ), + "display_rank": display_rank, + } diff --git a/judge/views/submission.py b/judge/views/submission.py index 147a2cc..1556dd9 100644 --- a/judge/views/submission.py +++ b/judge/views/submission.py @@ -259,13 +259,13 @@ class SubmissionStatus(SubmissionDetailBase): ) contest = submission.contest_or_none - prefix_length = 0 + show_testcases = False can_see_testcases = self.access_testcases_in_contest() if contest is not None: - prefix_length = contest.problem.output_prefix_override or 0 + show_testcases = contest.problem.show_testcases or False - if contest is None or prefix_length > 0 or can_see_testcases: + if contest is None or show_testcases or can_see_testcases: context["cases_data"] = get_cases_data(submission) context["can_see_testcases"] = True try: diff --git a/judge/views/user.py b/judge/views/user.py index 9796a90..db073f1 100644 --- a/judge/views/user.py +++ b/judge/views/user.py @@ -402,12 +402,12 @@ class UserPerformancePointsAjax(UserProblemsPage): @login_required def edit_profile(request): - profile = Profile.objects.get(user=request.user) - if profile.mute: - raise Http404() + profile = request.profile if request.method == "POST": form_user = UserForm(request.POST, instance=request.user) - form = ProfileForm(request.POST, instance=profile, user=request.user) + form = ProfileForm( + request.POST, request.FILES, instance=profile, user=request.user + ) if form_user.is_valid() and form.is_valid(): with transaction.atomic(), revisions.create_revision(): form_user.save() diff --git a/judge/widgets/__init__.py b/judge/widgets/__init__.py index cc25941..a9455a9 100644 --- a/judge/widgets/__init__.py +++ b/judge/widgets/__init__.py @@ -3,3 +3,4 @@ from judge.widgets.mixins import CompressorWidgetMixin from judge.widgets.pagedown import * from judge.widgets.select2 import * from judge.widgets.datetime import * +from judge.widgets.image import * diff --git a/judge/widgets/datetime.py b/judge/widgets/datetime.py index 6cd7fc5..15bb383 100644 --- a/judge/widgets/datetime.py +++ b/judge/widgets/datetime.py @@ -16,8 +16,8 @@ class DateTimePickerWidget(forms.DateTimeInput): @property def media(self): - css_url = "https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css" - js_url = "https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js" + css_url = "/static/datetime-picker/datetimepicker.min.css" + js_url = "/static/datetime-picker/datetimepicker.full.min.js" return forms.Media( js=[js_url], css={"screen": [css_url]}, diff --git a/judge/widgets/image.py b/judge/widgets/image.py new file mode 100644 index 0000000..89b4fb4 --- /dev/null +++ b/judge/widgets/image.py @@ -0,0 +1,16 @@ +from django import forms + + +class ImageWidget(forms.ClearableFileInput): + template_name = "widgets/image.html" + + def __init__(self, attrs=None, width=80, height=80): + self.width = width + self.height = height + super().__init__(attrs) + + def get_context(self, name, value, attrs=None): + context = super().get_context(name, value, attrs) + context["widget"]["height"] = self.height + context["widget"]["width"] = self.height + return context diff --git a/judge/widgets/pagedown.py b/judge/widgets/pagedown.py index c661ddb..f76ddac 100644 --- a/judge/widgets/pagedown.py +++ b/judge/widgets/pagedown.py @@ -47,11 +47,6 @@ else: "pagedown-extra/Markdown.Extra.js", "pagedown_init.js", ] - css = { - "all": [ - "markdown.css", - ] - } class AdminPagedownWidget(PagedownWidget, admin_widgets.AdminTextareaWidget): class Media: @@ -60,7 +55,6 @@ else: "pagedown_widget.css", "content-description.css", "admin/css/pagedown.css", - "markdown.css", "pagedown.css", ] } @@ -125,7 +119,6 @@ else: "pygment-github.css", "table.css", "ranks.css", - "markdown.css", "dmmd-preview.css", ] } diff --git a/locale/vi/LC_MESSAGES/django.po b/locale/vi/LC_MESSAGES/django.po index 0ab0dd6..f5c2204 100644 --- a/locale/vi/LC_MESSAGES/django.po +++ b/locale/vi/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: lqdoj2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-01 12:22+0700\n" +"POT-Creation-Date: 2023-09-02 07:40+0700\n" "PO-Revision-Date: 2021-07-20 03:44\n" "Last-Translator: Icyene\n" "Language-Team: Vietnamese\n" @@ -18,42 +18,58 @@ msgstr "" "X-Crowdin-Project-ID: 466004\n" "X-Crowdin-File-ID: 5\n" -#: chat_box/models.py:31 chat_box/models.py:54 chat_box/models.py:68 -#: judge/admin/interface.py:150 judge/models/contest.py:635 -#: judge/models/contest.py:844 judge/models/course.py:115 -#: judge/models/profile.py:366 judge/models/profile.py:444 +#: chat_box/models.py:39 chat_box/models.py:64 chat_box/models.py:79 +#: judge/admin/interface.py:150 judge/models/contest.py:636 +#: judge/models/contest.py:842 judge/models/course.py:115 +#: judge/models/profile.py:384 judge/models/profile.py:462 msgid "user" msgstr "người dùng" -#: chat_box/models.py:32 judge/models/comment.py:44 judge/models/comment.py:189 +#: chat_box/models.py:41 judge/models/comment.py:44 judge/models/comment.py:189 msgid "posted time" msgstr "thời gian đăng" -#: chat_box/models.py:33 judge/models/comment.py:49 +#: chat_box/models.py:43 judge/models/comment.py:49 msgid "body of comment" msgstr "nội dung bình luận" -#: chat_box/models.py:58 +#: chat_box/models.py:68 msgid "last seen" msgstr "xem lần cuối" -#: chat_box/views.py:45 +#: chat_box/views.py:47 msgid "LQDOJ Chat" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:365 msgid "Vietnamese" msgstr "Tiếng Việt" -#: dmoj/settings.py:364 +#: dmoj/settings.py:366 msgid "English" msgstr "" -#: dmoj/urls.py:135 +#: dmoj/urls.py:108 +msgid "Activation key invalid" +msgstr "Mã kích hoạt không hợp lệ" + +#: dmoj/urls.py:113 +msgid "Register" +msgstr "Đăng ký" + +#: dmoj/urls.py:120 +msgid "Registration Completed" +msgstr "Đăng ký hoàn thành" + +#: dmoj/urls.py:128 +msgid "Registration not allowed" +msgstr "Đăng ký không thành công" + +#: dmoj/urls.py:136 msgid "Login" msgstr "Đăng nhập" -#: dmoj/urls.py:212 templates/base.html:209 +#: dmoj/urls.py:224 templates/base.html:218 #: templates/organization/org-left-sidebar.html:2 msgid "Home" msgstr "Trang chủ" @@ -82,85 +98,85 @@ msgstr "Hiện bình luận" msgid "Included contests" msgstr "" -#: judge/admin/contest.py:80 judge/admin/volunteer.py:54 +#: judge/admin/contest.py:79 judge/admin/volunteer.py:54 #: templates/contest/clarification.html:42 templates/contest/contest.html:100 #: templates/contest/moss.html:41 templates/internal/left-sidebar.html:2 -#: templates/internal/problem.html:35 templates/problem/list.html:17 +#: templates/internal/problem.html:40 templates/problem/list.html:17 #: templates/problem/list.html:34 templates/problem/list.html:153 #: templates/user/user-problems.html:56 templates/user/user-problems.html:98 msgid "Problem" msgstr "Bài tập" -#: judge/admin/contest.py:156 +#: judge/admin/contest.py:155 msgid "Settings" msgstr "Cài đặt" -#: judge/admin/contest.py:169 +#: judge/admin/contest.py:168 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:173 +#: judge/admin/contest.py:172 msgid "Details" msgstr "Chi tiết" -#: judge/admin/contest.py:185 +#: judge/admin/contest.py:184 msgid "Format" msgstr "Thể thức" -#: judge/admin/contest.py:189 templates/contest/ranking-table.html:5 +#: judge/admin/contest.py:188 templates/contest/ranking-table.html:5 #: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:201 +#: judge/admin/contest.py:200 msgid "Access" msgstr "Truy cập" -#: judge/admin/contest.py:211 judge/admin/problem.py:218 +#: judge/admin/contest.py:210 judge/admin/problem.py:218 msgid "Justice" msgstr "Xử phạt" -#: judge/admin/contest.py:331 +#: judge/admin/contest.py:330 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." msgstr[0] "%d kỳ thi đã được đánh dấu hiển thị." -#: judge/admin/contest.py:338 +#: judge/admin/contest.py:337 msgid "Mark contests as visible" msgstr "Đánh dấu hiển thị các kỳ thi" -#: judge/admin/contest.py:349 +#: judge/admin/contest.py:348 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." msgstr[0] "%d kỳ thi đã được đánh dấu ẩn." -#: judge/admin/contest.py:356 +#: judge/admin/contest.py:355 msgid "Mark contests as hidden" msgstr "Ẩn các kỳ thi" -#: judge/admin/contest.py:377 judge/admin/submission.py:248 +#: judge/admin/contest.py:376 judge/admin/submission.py:241 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." msgstr[0] "%d bài nộp đã được lên lịch thành công để chấm lại." -#: judge/admin/contest.py:485 +#: judge/admin/contest.py:484 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "%d thí sinh đã được tính điểm lại." -#: judge/admin/contest.py:492 +#: judge/admin/contest.py:491 msgid "Recalculate results" msgstr "Tính toán lại kết quả" -#: judge/admin/contest.py:497 judge/admin/organization.py:99 +#: judge/admin/contest.py:496 judge/admin/organization.py:99 msgid "username" msgstr "tên đăng nhập" -#: judge/admin/contest.py:503 templates/base.html:317 +#: judge/admin/contest.py:502 templates/base.html:341 msgid "virtual" msgstr "ảo" @@ -189,7 +205,7 @@ msgid "diff" msgstr "" #: judge/admin/organization.py:61 judge/admin/problem.py:275 -#: judge/admin/profile.py:116 +#: judge/admin/profile.py:117 msgid "View on site" msgstr "Xem trên trang" @@ -221,8 +237,8 @@ msgstr "Điểm" msgid "Limits" msgstr "Giới hạn" -#: judge/admin/problem.py:217 judge/admin/submission.py:358 -#: templates/base.html:245 templates/stats/tab.html:4 +#: judge/admin/problem.py:217 judge/admin/submission.py:351 +#: templates/base.html:254 templates/stats/tab.html:4 #: templates/submission/list.html:347 msgid "Language" msgstr "Ngôn ngữ" @@ -255,12 +271,12 @@ msgstr[0] "%d bài tập đã được đánh dấu riêng tư." msgid "Mark problems as private" msgstr "Đánh dấu các bài tập là riêng tư" -#: judge/admin/problem.py:432 judge/admin/submission.py:321 +#: judge/admin/problem.py:432 judge/admin/submission.py:314 #: templates/problem/list.html:18 templates/problem/list.html:37 msgid "Problem code" msgstr "Mã bài" -#: judge/admin/problem.py:444 judge/admin/submission.py:327 +#: judge/admin/problem.py:444 judge/admin/submission.py:320 msgid "Problem name" msgstr "Tên bài" @@ -280,11 +296,11 @@ msgstr "Tổng điểm" msgid "Vote" msgstr "" -#: judge/admin/profile.py:40 +#: judge/admin/profile.py:41 msgid "timezone" msgstr "múi giờ" -#: judge/admin/profile.py:125 judge/admin/submission.py:334 +#: judge/admin/profile.py:126 judge/admin/submission.py:327 #: templates/notification/list.html:12 #: templates/organization/requests/log.html:9 #: templates/organization/requests/pending.html:19 @@ -292,28 +308,28 @@ msgstr "múi giờ" msgid "User" msgstr "Thành viên" -#: judge/admin/profile.py:131 templates/registration/registration_form.html:40 -#: templates/user/import/table_csv.html:8 +#: judge/admin/profile.py:132 templates/registration/registration_form.html:40 +#: templates/user/edit-profile.html:116 templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" -#: judge/admin/profile.py:137 judge/views/register.py:36 +#: judge/admin/profile.py:138 judge/views/register.py:36 #: templates/registration/registration_form.html:68 -#: templates/user/edit-profile.html:113 +#: templates/user/edit-profile.html:140 msgid "Timezone" msgstr "Múi giờ" -#: judge/admin/profile.py:143 +#: judge/admin/profile.py:144 msgid "date joined" msgstr "ngày tham gia" -#: judge/admin/profile.py:153 +#: judge/admin/profile.py:154 #, python-format msgid "%d user have scores recalculated." msgid_plural "%d users have scores recalculated." msgstr[0] "%d người dùng đã được tính điểm lại." -#: judge/admin/profile.py:160 +#: judge/admin/profile.py:161 msgid "Recalculate scores" msgstr "Tính điểm lại" @@ -338,7 +354,7 @@ msgid "Capabilities" msgstr "Khả năng" #: judge/admin/submission.py:31 judge/admin/submission.py:53 -#: judge/admin/submission.py:345 +#: judge/admin/submission.py:338 msgid "None" msgstr "None" @@ -360,48 +376,48 @@ msgctxt "contest problem" msgid "%(problem)s in %(contest)s" msgstr "%(problem)s trong %(contest)s" -#: judge/admin/submission.py:220 judge/admin/submission.py:261 +#: judge/admin/submission.py:213 judge/admin/submission.py:254 msgid "You do not have the permission to rejudge submissions." msgstr "Bạn không có quyền chấm lại bài." -#: judge/admin/submission.py:232 +#: judge/admin/submission.py:225 msgid "You do not have the permission to rejudge THAT many submissions." msgstr "Bạn không có quyền chấm lại nhiều bài nộp như vậy." -#: judge/admin/submission.py:255 +#: judge/admin/submission.py:248 msgid "Rejudge the selected submissions" msgstr "Chấm lại các bài nộp đã chọn" -#: judge/admin/submission.py:309 judge/views/problem_manage.py:226 +#: judge/admin/submission.py:302 judge/views/problem_manage.py:226 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." msgstr[0] "%d bài nộp đã được tính điểm lại." -#: judge/admin/submission.py:316 +#: judge/admin/submission.py:309 msgid "Rescore the selected submissions" msgstr "Tính điểm lại cái bài nộp" -#: judge/admin/submission.py:339 templates/notification/list.html:15 +#: judge/admin/submission.py:332 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:20 #: templates/problem/list.html:154 -#: templates/submission/status-testcases.html:144 -#: templates/submission/status-testcases.html:146 +#: templates/submission/status-testcases.html:139 +#: templates/submission/status-testcases.html:141 msgid "Time" msgstr "Thời gian" -#: judge/admin/submission.py:347 +#: judge/admin/submission.py:340 #, python-format msgid "%d KB" msgstr "%d KB" -#: judge/admin/submission.py:349 +#: judge/admin/submission.py:342 #, python-format msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:352 templates/submission/status-testcases.html:151 +#: judge/admin/submission.py:345 templates/submission/status-testcases.html:146 msgid "Memory" msgstr "Bộ nhớ" @@ -417,7 +433,7 @@ msgstr "Các bài tập trong nhóm này" msgid "These problems are included in this type of problems" msgstr "Các bài tập dạng này" -#: judge/admin/volunteer.py:60 templates/internal/problem.html:76 +#: judge/admin/volunteer.py:60 templates/internal/problem.html:81 #: templates/problem/list.html:20 templates/problem/list.html:44 msgid "Types" msgstr "Dạng" @@ -439,7 +455,7 @@ msgid "" "You need to have solved at least one problem before your voice can be heard." msgstr "Bạn phải giải ít nhất một bài trước khi được phép bình luận." -#: judge/comments.py:128 +#: judge/comments.py:123 msgid "Posted comment" msgstr "Bình luận đã đăng" @@ -467,66 +483,87 @@ msgstr "" msgid "New IOI" msgstr "IOI mới" -#: judge/forms.py:107 judge/views/organization.py:513 -#: judge/views/register.py:62 -#, python-brace-format -msgid "You may not be part of more than {count} public groups." -msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai." +#: judge/contest_format/ultimate.py:12 +msgid "Ultimate" +msgstr "" -#: judge/forms.py:149 +#: judge/forms.py:115 +msgid "File size exceeds the maximum allowed limit of 5MB." +msgstr "File tải lên không được quá 5MB." + +#: judge/forms.py:146 msgid "Any judge" msgstr "" -#: judge/forms.py:355 +#: judge/forms.py:352 msgid "Enter usernames separating by space" msgstr "Nhập các tên đăng nhập, cách nhau bởi dấu cách" -#: judge/forms.py:356 judge/views/stats.py:166 templates/stats/site.html:27 +#: judge/forms.py:353 judge/views/stats.py:166 templates/stats/site.html:27 msgid "New users" msgstr "Thành viên mới" -#: judge/forms.py:373 +#: judge/forms.py:370 #, python-brace-format msgid "These usernames don't exist: {usernames}" msgstr "Các tên đăng nhập này không tồn tại: {usernames}" -#: judge/forms.py:432 judge/views/register.py:30 +#: judge/forms.py:429 judge/views/register.py:30 #: templates/registration/registration_form.html:34 #: templates/user/base-users-table.html:5 #: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Tên đăng nhập" -#: judge/forms.py:433 templates/registration/registration_form.html:46 +#: judge/forms.py:430 judge/views/email.py:22 +#: templates/registration/registration_form.html:46 #: templates/registration/registration_form.html:60 -#: templates/user/import/table_csv.html:5 +#: templates/user/edit-profile.html:108 templates/user/import/table_csv.html:5 msgid "Password" msgstr "Mật khẩu" -#: judge/forms.py:459 +#: judge/forms.py:456 msgid "Two Factor Authentication tokens must be 6 decimal digits." msgstr "Two Factor Authentication phải chứa 6 chữ số." -#: judge/forms.py:472 templates/registration/totp_auth.html:32 +#: judge/forms.py:469 templates/registration/totp_auth.html:32 msgid "Invalid Two Factor Authentication token." msgstr "Token Two Factor Authentication không hợp lệ." -#: judge/forms.py:479 judge/models/problem.py:133 +#: judge/forms.py:476 judge/models/problem.py:133 msgid "Problem code must be ^[a-z0-9]+$" msgstr "Mã bài phải có dạng ^[a-z0-9]+$" -#: judge/forms.py:486 +#: judge/forms.py:483 msgid "Problem with code already exists." msgstr "Mã bài đã tồn tại." -#: judge/forms.py:493 judge/models/contest.py:91 +#: judge/forms.py:490 judge/models/contest.py:93 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Mã kỳ thi phải có dạng ^[a-z0-9]+$" -#: judge/forms.py:499 +#: judge/forms.py:497 templates/problem/search-form.html:46 +msgid "Group" +msgstr "" + +#: judge/forms.py:505 msgid "Contest with key already exists." msgstr "Mã kỳ thi đã tồn tại." +#: judge/forms.py:513 +msgid "Group doesn't exist." +msgstr "" + +#: judge/forms.py:515 +#, fuzzy +#| msgid "You do not have the permission to rejudge submissions." +msgid "You don't have permission in this group." +msgstr "Bạn không có quyền chấm lại bài." + +#: judge/forms.py:565 +msgid "This problem is duplicated." +msgstr "Bài này bị lặp" + #: judge/jinja2/datetime.py:26 templates/blog/blog.html:28 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" @@ -555,30 +592,35 @@ msgstr "Bạn phải là thành viên của nhóm." msgid "No such group" msgstr "Nhóm không tồn tại" -#: judge/models/bookmark.py:14 judge/models/comment.py:171 -#: judge/models/pagevote.py:13 +#: judge/models/bookmark.py:16 judge/models/comment.py:171 +#: judge/models/pagevote.py:15 msgid "associated page" msgstr "trang tương ứng" -#: judge/models/bookmark.py:45 +#: judge/models/bookmark.py:19 judge/models/comment.py:48 +#: judge/models/pagevote.py:18 judge/models/problem.py:713 +msgid "votes" +msgstr "bình chọn" + +#: judge/models/bookmark.py:32 #, fuzzy #| msgid "Bookmark" msgid "bookmark" msgstr "Lưu" -#: judge/models/bookmark.py:46 +#: judge/models/bookmark.py:33 #, fuzzy #| msgid "Bookmark" msgid "bookmarks" msgstr "Lưu" -#: judge/models/bookmark.py:60 +#: judge/models/bookmark.py:54 #, fuzzy #| msgid "Bookmark" msgid "make bookmark" msgstr "Lưu" -#: judge/models/bookmark.py:61 +#: judge/models/bookmark.py:55 #, fuzzy #| msgid "Bookmark" msgid "make bookmarks" @@ -608,11 +650,6 @@ msgstr "" msgid "commenter" msgstr "người bình luận" -#: judge/models/comment.py:48 judge/models/pagevote.py:16 -#: judge/models/problem.py:721 -msgid "votes" -msgstr "bình chọn" - #: judge/models/comment.py:50 msgid "hide the comment" msgstr "ẩn bình luận" @@ -667,104 +704,104 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:38 +#: judge/models/contest.py:40 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:42 +#: judge/models/contest.py:44 msgid "tag name" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:48 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:53 msgid "tag colour" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:55 msgid "tag description" msgstr "" -#: judge/models/contest.py:74 +#: judge/models/contest.py:76 msgid "contest tag" msgstr "" -#: judge/models/contest.py:75 judge/models/contest.py:243 +#: judge/models/contest.py:77 judge/models/contest.py:245 msgid "contest tags" msgstr "nhãn kỳ thi" -#: judge/models/contest.py:83 +#: judge/models/contest.py:85 msgid "Visible" msgstr "Hiển thị" -#: judge/models/contest.py:84 +#: judge/models/contest.py:86 msgid "Hidden for duration of contest" msgstr "Ẩn trong thời gian kỳ thi" -#: judge/models/contest.py:85 +#: judge/models/contest.py:87 msgid "Hidden for duration of participation" msgstr "Ẩn trong thời gian tham gia" -#: judge/models/contest.py:89 +#: judge/models/contest.py:91 msgid "contest id" msgstr "ID kỳ thi" -#: judge/models/contest.py:94 +#: judge/models/contest.py:96 msgid "contest name" msgstr "tên kỳ thi" -#: judge/models/contest.py:98 +#: judge/models/contest.py:100 msgid "These users will be able to edit the contest." msgstr "Những người dùng này có quyền chỉnh sửa kỳ thi." -#: judge/models/contest.py:104 +#: judge/models/contest.py:106 msgid "" "These users will be able to edit the contest, but will not be listed as " "authors." msgstr "Những người dùng này là tác giả và có quyền chỉnh sửa kỳ thi." -#: judge/models/contest.py:113 +#: judge/models/contest.py:115 msgid "These users will be able to view the contest, but not edit it." msgstr "" "Những người dùng này có thể thấy kỳ thi nhưng không có quyền chỉnh sửa." -#: judge/models/contest.py:118 judge/models/course.py:158 +#: judge/models/contest.py:120 judge/models/course.py:158 #: judge/models/runtime.py:211 msgid "description" msgstr "mô tả" -#: judge/models/contest.py:120 judge/models/problem.py:593 +#: judge/models/contest.py:122 judge/models/problem.py:583 #: judge/models/runtime.py:216 msgid "problems" msgstr "bài tập" -#: judge/models/contest.py:122 judge/models/contest.py:640 +#: judge/models/contest.py:124 judge/models/contest.py:641 msgid "start time" msgstr "thời gian bắt đầu" -#: judge/models/contest.py:123 +#: judge/models/contest.py:125 msgid "end time" msgstr "thời gian kết thúc" -#: judge/models/contest.py:125 judge/models/problem.py:186 -#: judge/models/problem.py:628 +#: judge/models/contest.py:127 judge/models/problem.py:186 +#: judge/models/problem.py:618 msgid "time limit" msgstr "giới hạn thời gian" -#: judge/models/contest.py:129 +#: judge/models/contest.py:131 msgid "" "Format hh:mm:ss. For example, if you want a 2-hour contest, enter 02:00:00" msgstr "" "Định dạng hh:mm:ss (giờ:phút:giây). Ví dụ, nếu muốn tạo kỳ thi dài 2h, hãy " "nhập 02:00:00" -#: judge/models/contest.py:133 +#: judge/models/contest.py:135 msgid "freeze after" msgstr "đóng băng sau" -#: judge/models/contest.py:137 +#: judge/models/contest.py:139 msgid "" "Format hh:mm:ss. For example, if you want to freeze contest after 2 hours, " "enter 02:00:00" @@ -772,12 +809,12 @@ msgstr "" "Định dạng hh:mm:ss (giờ:phút:giây). Ví dụ, nếu muốn đóng băng kỳ thi sau 2h, " "hãy nhập 02:00:00" -#: judge/models/contest.py:141 judge/models/course.py:28 +#: judge/models/contest.py:143 judge/models/course.py:28 #: judge/models/course.py:164 judge/models/problem.py:225 msgid "publicly visible" msgstr "công khai" -#: judge/models/contest.py:144 +#: judge/models/contest.py:146 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -785,84 +822,84 @@ msgstr "" "Đánh dấu ngay cả với các kỳ thi riêng tư của nhóm, quyết định việc kỳ thi có " "được hiển thị với các thành viên hay không." -#: judge/models/contest.py:150 +#: judge/models/contest.py:152 msgid "contest rated" msgstr "kỳ thi được xếp hạng" -#: judge/models/contest.py:151 +#: judge/models/contest.py:153 msgid "Whether this contest can be rated." msgstr "Quyết định kỳ thi có được xếp hạng không." -#: judge/models/contest.py:155 +#: judge/models/contest.py:157 msgid "scoreboard visibility" msgstr "khả năng hiển thị của bảng điểm" -#: judge/models/contest.py:158 +#: judge/models/contest.py:160 msgid "Scoreboard visibility through the duration of the contest" msgstr "Khả năng hiển thị của bảng điểm trong thời gian kỳ thi" -#: judge/models/contest.py:163 +#: judge/models/contest.py:165 msgid "view contest scoreboard" msgstr "xem bảng điểm kỳ thi" -#: judge/models/contest.py:166 +#: judge/models/contest.py:168 msgid "These users will be able to view the scoreboard." msgstr "Những người dùng này được phép xem bảng điểm." -#: judge/models/contest.py:169 +#: judge/models/contest.py:171 msgid "no comments" msgstr "không bình luận" -#: judge/models/contest.py:170 +#: judge/models/contest.py:172 msgid "Use clarification system instead of comments." msgstr "Dùng hệ thống thông báo thay vì bình luận." -#: judge/models/contest.py:175 +#: judge/models/contest.py:177 msgid "Rating floor for contest" msgstr "Cận dưới rating được xếp hạng trong kỳ thi" -#: judge/models/contest.py:181 +#: judge/models/contest.py:183 msgid "Rating ceiling for contest" msgstr "Cận trên rating được xếp hạng trong kỳ thi" -#: judge/models/contest.py:186 +#: judge/models/contest.py:188 msgid "rate all" msgstr "xếp hạng tất cả" -#: judge/models/contest.py:187 +#: judge/models/contest.py:189 msgid "Rate all users who joined." msgstr "Xếp hạng tất cả người dùng đã tham gia (kể cả không nộp)." -#: judge/models/contest.py:192 +#: judge/models/contest.py:194 msgid "exclude from ratings" msgstr "không xếp hạng" -#: judge/models/contest.py:197 +#: judge/models/contest.py:199 msgid "private to specific users" msgstr "riêng tư với các người dùng này" -#: judge/models/contest.py:202 +#: judge/models/contest.py:204 msgid "private contestants" msgstr "thí sinh riêng tư" -#: judge/models/contest.py:203 +#: judge/models/contest.py:205 msgid "If private, only these users may see the contest" msgstr "Nếu riêng tư, chỉ những người dùng này mới thấy kỳ thi" -#: judge/models/contest.py:207 +#: judge/models/contest.py:209 msgid "hide problem tags" msgstr "ẩn nhãn kỳ thi" -#: judge/models/contest.py:208 +#: judge/models/contest.py:210 msgid "Whether problem tags should be hidden by default." msgstr "" "Quyết định việc nhãn bài tập (DP, Tham lam, ...) được ẩn trong kỳ thi không." -#: judge/models/contest.py:212 +#: judge/models/contest.py:214 msgid "run pretests only" msgstr "chỉ chạy pretests" -#: judge/models/contest.py:214 +#: judge/models/contest.py:216 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -871,51 +908,51 @@ msgstr "" "Quyết định việc các máy chấm chỉ chấm pretests thay vì tất cả các test. Sau " "kỳ thi, hãy bỏ đánh dấu ô này và chấm lại tất cả các bài." -#: judge/models/contest.py:221 judge/models/interface.py:96 -#: judge/models/problem.py:283 +#: judge/models/contest.py:223 judge/models/interface.py:96 +#: judge/models/problem.py:285 msgid "private to organizations" msgstr "riêng tư với các tổ chức" -#: judge/models/contest.py:226 judge/models/course.py:34 -#: judge/models/interface.py:92 judge/models/problem.py:279 -#: judge/models/profile.py:130 +#: judge/models/contest.py:228 judge/models/course.py:34 +#: judge/models/interface.py:92 judge/models/problem.py:281 +#: judge/models/profile.py:144 msgid "organizations" msgstr "tổ chức" -#: judge/models/contest.py:227 +#: judge/models/contest.py:229 msgid "If private, only these organizations may see the contest" msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được kỳ thi" -#: judge/models/contest.py:230 judge/models/problem.py:256 +#: judge/models/contest.py:232 judge/models/problem.py:256 msgid "OpenGraph image" msgstr "Hình ảnh OpenGraph" -#: judge/models/contest.py:233 judge/models/profile.py:85 +#: judge/models/contest.py:235 judge/models/profile.py:92 msgid "Logo override image" msgstr "Hình ảnh ghi đè logo" -#: judge/models/contest.py:238 +#: judge/models/contest.py:240 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "Ảnh này sẽ thay thế cho logo mặc định trong kỳ thi." -#: judge/models/contest.py:246 +#: judge/models/contest.py:248 msgid "the amount of live participants" msgstr "số lượng thí sinh thi trực tiếp" -#: judge/models/contest.py:250 +#: judge/models/contest.py:252 msgid "contest summary" msgstr "tổng kết kỳ thi" -#: judge/models/contest.py:252 judge/models/problem.py:262 +#: judge/models/contest.py:254 judge/models/problem.py:262 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:256 judge/models/profile.py:80 +#: judge/models/contest.py:258 judge/models/profile.py:87 msgid "access code" msgstr "mật khẩu truy cập" -#: judge/models/contest.py:261 +#: judge/models/contest.py:263 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." @@ -923,296 +960,292 @@ msgstr "" "Mật khẩu truy cập cho các thí sinh muốn tham gia kỳ thi. Để trống nếu không " "dùng." -#: judge/models/contest.py:267 judge/models/problem.py:244 +#: judge/models/contest.py:269 judge/models/problem.py:244 msgid "personae non gratae" msgstr "Chặn tham gia" -#: judge/models/contest.py:269 +#: judge/models/contest.py:271 msgid "Bans the selected users from joining this contest." msgstr "Cấm những người dùng được chọn tham gia kỳ thi." -#: judge/models/contest.py:272 +#: judge/models/contest.py:274 msgid "contest format" msgstr "format kỳ thi" -#: judge/models/contest.py:276 +#: judge/models/contest.py:278 msgid "The contest format module to use." msgstr "Format kỳ thi sử dụng." -#: judge/models/contest.py:279 +#: judge/models/contest.py:281 msgid "contest format configuration" msgstr "Tùy chỉnh format kỳ thi" -#: judge/models/contest.py:283 +#: judge/models/contest.py:285 msgid "" "A JSON object to serve as the configuration for the chosen contest format " "module. Leave empty to use None. Exact format depends on the contest format " "selected." msgstr "" -#: judge/models/contest.py:296 +#: judge/models/contest.py:298 msgid "precision points" msgstr "Hiển thị điểm" -#: judge/models/contest.py:299 +#: judge/models/contest.py:301 msgid "Number of digits to round points to." msgstr "Số chữ số thập phân trên bảng điểm." -#: judge/models/contest.py:608 +#: judge/models/contest.py:609 msgid "See private contests" msgstr "" -#: judge/models/contest.py:609 +#: judge/models/contest.py:610 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:610 +#: judge/models/contest.py:611 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:611 +#: judge/models/contest.py:612 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:612 templates/contest/moss.html:72 +#: judge/models/contest.py:613 templates/contest/moss.html:72 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:613 +#: judge/models/contest.py:614 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:614 +#: judge/models/contest.py:615 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:615 +#: judge/models/contest.py:616 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:616 +#: judge/models/contest.py:617 msgid "Change contest visibility" msgstr "" -#: judge/models/contest.py:617 +#: judge/models/contest.py:618 msgid "Edit contest problem label script" msgstr "Cách hiển thị thứ tự bài tập" -#: judge/models/contest.py:619 judge/models/contest.py:766 -#: judge/models/contest.py:847 judge/models/contest.py:877 +#: judge/models/contest.py:620 judge/models/contest.py:767 +#: judge/models/contest.py:845 judge/models/contest.py:875 #: judge/models/course.py:178 judge/models/submission.py:116 msgid "contest" msgstr "kỳ thi" -#: judge/models/contest.py:620 +#: judge/models/contest.py:621 msgid "contests" msgstr "kỳ thi" -#: judge/models/contest.py:629 +#: judge/models/contest.py:630 msgid "associated contest" msgstr "" -#: judge/models/contest.py:642 +#: judge/models/contest.py:643 msgid "score" msgstr "điểm" -#: judge/models/contest.py:643 +#: judge/models/contest.py:644 msgid "cumulative time" msgstr "tổng thời gian" -#: judge/models/contest.py:645 +#: judge/models/contest.py:646 msgid "is disqualified" msgstr "đã bị loại" -#: judge/models/contest.py:647 +#: judge/models/contest.py:648 msgid "Whether this participation is disqualified." msgstr "Quyết định thí sinh có bị loại không." -#: judge/models/contest.py:649 +#: judge/models/contest.py:650 msgid "tie-breaking field" msgstr "" -#: judge/models/contest.py:651 +#: judge/models/contest.py:652 msgid "virtual participation id" msgstr "id lần tham gia ảo" -#: judge/models/contest.py:653 +#: judge/models/contest.py:654 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "0 nghĩa là tham gia chính thức, ngược lại là lần tham gia ảo thứ n." -#: judge/models/contest.py:656 +#: judge/models/contest.py:657 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:659 +#: judge/models/contest.py:660 msgid "same as format_data, but including frozen results" msgstr "" -#: judge/models/contest.py:663 +#: judge/models/contest.py:664 #, fuzzy #| msgid "score" msgid "final score" msgstr "điểm" -#: judge/models/contest.py:665 +#: judge/models/contest.py:666 #, fuzzy #| msgid "cumulative time" msgid "final cumulative time" msgstr "tổng thời gian" -#: judge/models/contest.py:741 +#: judge/models/contest.py:742 #, python-format msgid "%s spectating in %s" msgstr "%s đang theo dõi trong %s" -#: judge/models/contest.py:746 +#: judge/models/contest.py:747 #, python-format msgid "%s in %s, v%d" msgstr "%s trong %s, v%d" -#: judge/models/contest.py:751 +#: judge/models/contest.py:752 #, python-format msgid "%s in %s" msgstr "%s trong %s" -#: judge/models/contest.py:754 +#: judge/models/contest.py:755 msgid "contest participation" msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:755 +#: judge/models/contest.py:756 msgid "contest participations" msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:762 judge/models/contest.py:818 -#: judge/models/contest.py:880 judge/models/problem.py:592 -#: judge/models/problem.py:599 judge/models/problem.py:620 -#: judge/models/problem.py:651 judge/models/problem_data.py:50 +#: judge/models/contest.py:763 judge/models/contest.py:816 +#: judge/models/contest.py:878 judge/models/problem.py:582 +#: judge/models/problem.py:589 judge/models/problem.py:610 +#: judge/models/problem.py:641 judge/models/problem_data.py:50 msgid "problem" msgstr "bài tập" -#: judge/models/contest.py:770 judge/models/contest.py:830 +#: judge/models/contest.py:771 judge/models/contest.py:828 #: judge/models/course.py:182 judge/models/problem.py:209 msgid "points" msgstr "điểm" -#: judge/models/contest.py:771 +#: judge/models/contest.py:772 msgid "partial" msgstr "thành phần" -#: judge/models/contest.py:772 judge/models/contest.py:832 +#: judge/models/contest.py:773 judge/models/contest.py:830 msgid "is pretested" msgstr "dùng pretest" -#: judge/models/contest.py:773 judge/models/interface.py:47 +#: judge/models/contest.py:774 judge/models/interface.py:47 msgid "order" msgstr "thứ tự" -#: judge/models/contest.py:775 -msgid "0 to not show testcases, 1 to show" -msgstr "0 để ẩn test, 1 để hiện" - #: judge/models/contest.py:776 msgid "visible testcases" msgstr "hiển thị test" -#: judge/models/contest.py:783 +#: judge/models/contest.py:781 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "Số lần nộp tối đa, đặt là 0 nếu không có giới hạn." -#: judge/models/contest.py:785 +#: judge/models/contest.py:783 msgid "max submissions" msgstr "số lần nộp tối đa" -#: judge/models/contest.py:788 +#: judge/models/contest.py:786 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:792 +#: judge/models/contest.py:790 #, fuzzy #| msgid "Only for format new IOI. Separated by commas, e.g: 2, 3" msgid "Separated by commas, e.g: 2, 3" msgstr "" "Chỉ dùng với format IOI mới. Các sub cách nhau bởi dấu phẩy. Ví dụ: 2, 3" -#: judge/models/contest.py:793 +#: judge/models/contest.py:791 #, fuzzy #| msgid "frozen subtasks" msgid "hidden subtasks" msgstr "Đóng băng subtasks" -#: judge/models/contest.py:805 +#: judge/models/contest.py:803 msgid "contest problem" msgstr "bài trong kỳ thi" -#: judge/models/contest.py:806 +#: judge/models/contest.py:804 msgid "contest problems" msgstr "bài trong kỳ thi" -#: judge/models/contest.py:812 judge/models/submission.py:233 +#: judge/models/contest.py:810 judge/models/submission.py:233 msgid "submission" msgstr "bài nộp" -#: judge/models/contest.py:825 judge/models/contest.py:851 +#: judge/models/contest.py:823 judge/models/contest.py:849 msgid "participation" msgstr "lần tham gia" -#: judge/models/contest.py:833 +#: judge/models/contest.py:831 msgid "Whether this submission was ran only on pretests." msgstr "Quyết định bài nộp chỉ được chạy trên pretest không." -#: judge/models/contest.py:838 +#: judge/models/contest.py:836 msgid "contest submission" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:839 +#: judge/models/contest.py:837 msgid "contest submissions" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:855 +#: judge/models/contest.py:853 msgid "rank" msgstr "rank" -#: judge/models/contest.py:856 +#: judge/models/contest.py:854 msgid "rating" msgstr "rating" -#: judge/models/contest.py:857 +#: judge/models/contest.py:855 msgid "raw rating" msgstr "rating thật" -#: judge/models/contest.py:858 +#: judge/models/contest.py:856 msgid "contest performance" msgstr "" -#: judge/models/contest.py:859 +#: judge/models/contest.py:857 msgid "last rated" msgstr "lần cuối được xếp hạng" -#: judge/models/contest.py:863 +#: judge/models/contest.py:861 msgid "contest rating" msgstr "rating kỳ thi" -#: judge/models/contest.py:864 +#: judge/models/contest.py:862 msgid "contest ratings" msgstr "rating kỳ thi" -#: judge/models/contest.py:888 +#: judge/models/contest.py:886 msgid "contest moss result" msgstr "kết quả MOSS kỳ thi" -#: judge/models/contest.py:889 +#: judge/models/contest.py:887 msgid "contest moss results" msgstr "kết quả MOSS kỳ thi" -#: judge/models/contest.py:894 +#: judge/models/contest.py:892 msgid "clarified problem" msgstr "" -#: judge/models/contest.py:896 +#: judge/models/contest.py:894 msgid "clarification body" msgstr "" -#: judge/models/contest.py:898 +#: judge/models/contest.py:896 msgid "clarification timestamp" msgstr "" @@ -1222,7 +1255,7 @@ msgstr "" msgid "course name" msgstr "tên đăng nhập" -#: judge/models/course.py:23 judge/models/profile.py:46 +#: judge/models/course.py:23 judge/models/profile.py:53 msgid "organization description" msgstr "mô tả tổ chức" @@ -1248,7 +1281,7 @@ msgstr "" msgid "Course name shown in URL" msgstr "Tên được hiển thị trong đường dẫn" -#: judge/models/course.py:43 judge/models/profile.py:38 +#: judge/models/course.py:43 judge/models/profile.py:45 msgid "Only alphanumeric and hyphens" msgstr "" @@ -1325,7 +1358,7 @@ msgstr "mục cha" msgid "post title" msgstr "tiêu đề bài đăng" -#: judge/models/interface.py:79 judge/models/problem.py:677 +#: judge/models/interface.py:79 judge/models/problem.py:667 msgid "authors" msgstr "tác giả" @@ -1333,7 +1366,7 @@ msgstr "tác giả" msgid "slug" msgstr "slug" -#: judge/models/interface.py:81 judge/models/problem.py:675 +#: judge/models/interface.py:81 judge/models/problem.py:665 msgid "public visibility" msgstr "khả năng hiển thị công khai" @@ -1361,15 +1394,15 @@ msgstr "hình ảnh openGraph" msgid "If private, only these organizations may see the blog post." msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được bài đăng." -#: judge/models/interface.py:146 +#: judge/models/interface.py:136 msgid "Edit all posts" msgstr "Chỉnh sửa tất cả bài đăng" -#: judge/models/interface.py:147 +#: judge/models/interface.py:137 msgid "blog post" msgstr "bài đăng" -#: judge/models/interface.py:148 +#: judge/models/interface.py:138 msgid "blog posts" msgstr "bài đăng" @@ -1397,25 +1430,25 @@ msgstr "thời gian gửi" msgid "messages in the thread" msgstr "tin nhắn trong chuỗi" -#: judge/models/pagevote.py:19 +#: judge/models/pagevote.py:24 #, fuzzy #| msgid "votes" msgid "pagevote" msgstr "bình chọn" -#: judge/models/pagevote.py:20 +#: judge/models/pagevote.py:25 #, fuzzy #| msgid "votes" msgid "pagevotes" msgstr "bình chọn" -#: judge/models/pagevote.py:40 +#: judge/models/pagevote.py:49 #, fuzzy #| msgid "volunteer vote" msgid "pagevote vote" msgstr "vote từ TNV" -#: judge/models/pagevote.py:41 +#: judge/models/pagevote.py:50 #, fuzzy #| msgid "volunteer votes" msgid "pagevote votes" @@ -1466,7 +1499,7 @@ msgstr "đường dẫn" msgid "full name" msgstr "tên đầy đủ" -#: judge/models/problem.py:86 judge/models/profile.py:43 +#: judge/models/problem.py:86 judge/models/profile.py:50 #: judge/models/runtime.py:34 msgid "short name" msgstr "tên ngắn" @@ -1562,7 +1595,7 @@ msgstr "" "Giới hạn thời gian cho bài tập này, theo đơn vị giây. Có thể nhập số thực " "(ví dụ 1.5)" -#: judge/models/problem.py:197 judge/models/problem.py:635 +#: judge/models/problem.py:197 judge/models/problem.py:625 msgid "memory limit" msgstr "Giới hạn bộ nhớ" @@ -1635,95 +1668,95 @@ msgstr "Số lượng người dùng đã giải được bài" msgid "solve rate" msgstr "Tỉ lệ giải đúng" -#: judge/models/problem.py:280 +#: judge/models/problem.py:282 msgid "If private, only these organizations may see the problem." msgstr "Nếu bài riêng tư, chỉ những tổ chức này thấy được" -#: judge/models/problem.py:286 +#: judge/models/problem.py:288 msgid "pdf statement" msgstr "Đề bài bằng file pdf" -#: judge/models/problem.py:604 judge/models/problem.py:625 -#: judge/models/problem.py:656 judge/models/runtime.py:161 +#: judge/models/problem.py:594 judge/models/problem.py:615 +#: judge/models/problem.py:646 judge/models/runtime.py:161 msgid "language" msgstr "" -#: judge/models/problem.py:607 +#: judge/models/problem.py:597 msgid "translated name" msgstr "" -#: judge/models/problem.py:609 +#: judge/models/problem.py:599 msgid "translated description" msgstr "" -#: judge/models/problem.py:613 +#: judge/models/problem.py:603 msgid "problem translation" msgstr "" -#: judge/models/problem.py:614 +#: judge/models/problem.py:604 msgid "problem translations" msgstr "" -#: judge/models/problem.py:644 +#: judge/models/problem.py:634 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:645 +#: judge/models/problem.py:635 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:658 judge/models/submission.py:249 +#: judge/models/problem.py:648 judge/models/submission.py:249 msgid "source code" msgstr "mã nguồn" -#: judge/models/problem.py:662 +#: judge/models/problem.py:652 msgid "language-specific template" msgstr "" -#: judge/models/problem.py:663 +#: judge/models/problem.py:653 msgid "language-specific templates" msgstr "" -#: judge/models/problem.py:670 +#: judge/models/problem.py:660 msgid "associated problem" msgstr "" -#: judge/models/problem.py:676 +#: judge/models/problem.py:666 msgid "publish date" msgstr "" -#: judge/models/problem.py:678 +#: judge/models/problem.py:668 msgid "editorial content" msgstr "nội dung lời giải" -#: judge/models/problem.py:689 +#: judge/models/problem.py:681 #, python-format msgid "Editorial for %s" msgstr "" -#: judge/models/problem.py:693 +#: judge/models/problem.py:685 msgid "solution" msgstr "lời giải" -#: judge/models/problem.py:694 +#: judge/models/problem.py:686 msgid "solutions" msgstr "lời giải" -#: judge/models/problem.py:699 +#: judge/models/problem.py:691 #, fuzzy #| msgid "point value" msgid "proposed point value" msgstr "điểm" -#: judge/models/problem.py:700 +#: judge/models/problem.py:692 msgid "The amount of points you think this problem deserves." msgstr "Bạn nghĩ bài này đáng bao nhiêu điểm?" -#: judge/models/problem.py:714 +#: judge/models/problem.py:706 msgid "The time this vote was cast" msgstr "" -#: judge/models/problem.py:720 +#: judge/models/problem.py:712 msgid "vote" msgstr "" @@ -1895,206 +1928,214 @@ msgstr "điểm" msgid "case is pretest?" msgstr "test là pretest?" -#: judge/models/profile.py:31 +#: judge/models/profile.py:38 msgid "organization title" msgstr "tiêu đề tổ chức" -#: judge/models/profile.py:34 +#: judge/models/profile.py:41 msgid "organization slug" msgstr "tên ngắn đường dẫn" -#: judge/models/profile.py:35 +#: judge/models/profile.py:42 msgid "Organization name shown in URL" msgstr "Tên được hiển thị trong đường dẫn" -#: judge/models/profile.py:44 +#: judge/models/profile.py:51 msgid "Displayed beside user name during contests" msgstr "Hiển thị bên cạnh tên người dùng trong kỳ thi" -#: judge/models/profile.py:49 +#: judge/models/profile.py:56 msgid "registrant" msgstr "người tạo" -#: judge/models/profile.py:52 +#: judge/models/profile.py:59 msgid "User who registered this organization" msgstr "Người tạo tổ chức" -#: judge/models/profile.py:56 +#: judge/models/profile.py:63 msgid "administrators" msgstr "người quản lý" -#: judge/models/profile.py:58 +#: judge/models/profile.py:65 msgid "Those who can edit this organization" msgstr "Những người có thể chỉnh sửa tổ chức" -#: judge/models/profile.py:61 +#: judge/models/profile.py:68 msgid "creation date" msgstr "ngày tạo" -#: judge/models/profile.py:64 +#: judge/models/profile.py:71 msgid "is open organization?" msgstr "tổ chức mở?" -#: judge/models/profile.py:65 +#: judge/models/profile.py:72 msgid "Allow joining organization" msgstr "Cho phép mọi người tham gia tổ chức" -#: judge/models/profile.py:69 +#: judge/models/profile.py:76 msgid "maximum size" msgstr "số lượng thành viên tối đa" -#: judge/models/profile.py:73 +#: judge/models/profile.py:80 msgid "" "Maximum amount of users in this organization, only applicable to private " "organizations" msgstr "Số người tối đa trong tổ chức, chỉ áp dụng với tổ chức riêng tư" -#: judge/models/profile.py:79 +#: judge/models/profile.py:86 msgid "Student access code" msgstr "Mã truy cập cho học sinh" -#: judge/models/profile.py:90 +#: judge/models/profile.py:97 msgid "" "This image will replace the default site logo for users viewing the " "organization." msgstr "Ảnh này sẽ thay thế logo mặc định khi ở trong tổ chức." -#: judge/models/profile.py:129 judge/models/profile.py:158 -#: judge/models/profile.py:372 judge/models/profile.py:451 +#: judge/models/profile.py:143 judge/models/profile.py:172 +#: judge/models/profile.py:390 judge/models/profile.py:469 msgid "organization" msgstr "" -#: judge/models/profile.py:135 +#: judge/models/profile.py:149 msgid "user associated" msgstr "" -#: judge/models/profile.py:137 +#: judge/models/profile.py:151 msgid "self-description" msgstr "" -#: judge/models/profile.py:140 +#: judge/models/profile.py:154 msgid "location" msgstr "" -#: judge/models/profile.py:146 +#: judge/models/profile.py:160 msgid "preferred language" msgstr "" -#: judge/models/profile.py:154 +#: judge/models/profile.py:168 msgid "last access time" msgstr "" -#: judge/models/profile.py:155 +#: judge/models/profile.py:169 msgid "last IP" msgstr "" -#: judge/models/profile.py:166 +#: judge/models/profile.py:180 msgid "display rank" msgstr "" -#: judge/models/profile.py:174 +#: judge/models/profile.py:189 msgid "comment mute" msgstr "" -#: judge/models/profile.py:175 +#: judge/models/profile.py:190 msgid "Some users are at their best when silent." msgstr "" -#: judge/models/profile.py:179 +#: judge/models/profile.py:194 msgid "unlisted user" msgstr "" -#: judge/models/profile.py:180 +#: judge/models/profile.py:195 msgid "User will not be ranked." msgstr "" -#: judge/models/profile.py:184 +#: judge/models/profile.py:199 #, fuzzy #| msgid "Banned from joining" msgid "banned from voting" msgstr "Bị cấm tham gia" -#: judge/models/profile.py:185 +#: judge/models/profile.py:200 msgid "User will not be able to vote on problems' point values." msgstr "" -#: judge/models/profile.py:190 +#: judge/models/profile.py:205 msgid "user script" msgstr "" -#: judge/models/profile.py:194 +#: judge/models/profile.py:209 msgid "User-defined JavaScript for site customization." msgstr "" -#: judge/models/profile.py:198 +#: judge/models/profile.py:213 msgid "current contest" msgstr "kỳ thi hiện tại" -#: judge/models/profile.py:205 +#: judge/models/profile.py:220 msgid "math engine" msgstr "" -#: judge/models/profile.py:209 +#: judge/models/profile.py:224 msgid "the rendering engine used to render math" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:227 msgid "2FA enabled" msgstr "" -#: judge/models/profile.py:214 +#: judge/models/profile.py:229 msgid "check to enable TOTP-based two factor authentication" msgstr "đánh dấu để sử dụng TOTP-based two factor authentication" -#: judge/models/profile.py:220 +#: judge/models/profile.py:235 msgid "TOTP key" msgstr "mã TOTP" -#: judge/models/profile.py:221 +#: judge/models/profile.py:236 msgid "32 character base32-encoded key for TOTP" msgstr "" -#: judge/models/profile.py:223 +#: judge/models/profile.py:238 msgid "TOTP key must be empty or base32" msgstr "" -#: judge/models/profile.py:227 +#: judge/models/profile.py:242 msgid "internal notes" msgstr "ghi chú nội bộ" -#: judge/models/profile.py:230 +#: judge/models/profile.py:245 msgid "Notes for administrators regarding this user." msgstr "Ghi chú riêng cho quản trị viên." -#: judge/models/profile.py:359 +#: judge/models/profile.py:249 +msgid "Custom background" +msgstr "Background tự chọn" + +#: judge/models/profile.py:249 +msgid "CSS custom background properties: url(\"image_url\"), color, etc" +msgstr "CSS background tự chọn. Ví dụ: url(\"image_url\"), white, ..." + +#: judge/models/profile.py:377 msgid "user profile" msgstr "thông tin người dùng" -#: judge/models/profile.py:360 +#: judge/models/profile.py:378 msgid "user profiles" msgstr "thông tin người dùng" -#: judge/models/profile.py:376 +#: judge/models/profile.py:394 msgid "request time" msgstr "thời gian đăng ký" -#: judge/models/profile.py:379 +#: judge/models/profile.py:397 msgid "state" msgstr "trạng thái" -#: judge/models/profile.py:386 +#: judge/models/profile.py:404 msgid "reason" msgstr "lý do" -#: judge/models/profile.py:389 +#: judge/models/profile.py:407 msgid "organization join request" msgstr "đơn đăng ký tham gia" -#: judge/models/profile.py:390 +#: judge/models/profile.py:408 msgid "organization join requests" msgstr "đơn đăng ký tham gia" -#: judge/models/profile.py:456 +#: judge/models/profile.py:474 #, fuzzy #| msgid "last seen" msgid "last visit" @@ -2580,17 +2621,17 @@ msgstr "" msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problem_data.py:237 +#: judge/utils/problem_data.py:236 msgid "Invalid interactor judge" msgstr "" -#: judge/utils/problem_data.py:249 +#: judge/utils/problem_data.py:260 #, fuzzy #| msgid "Invalid Return" msgid "Invalid signature handler" msgstr "Invalid Return" -#: judge/utils/problem_data.py:254 +#: judge/utils/problem_data.py:263 msgid "Invalid signature header" msgstr "" @@ -2648,7 +2689,7 @@ msgstr "%h:%m" #: judge/views/about.py:10 templates/organization/home.html:47 #: templates/organization/org-right-sidebar.html:70 -#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 +#: templates/user/user-about.html:72 templates/user/user-tabs.html:4 #: templates/user/users-table.html:22 msgid "About" msgstr "Giới thiệu" @@ -2662,11 +2703,11 @@ msgstr "Hướng dẫn viết trình chấm" msgid "Page %d of Posts" msgstr "Trang %d" -#: judge/views/blog.py:152 +#: judge/views/blog.py:149 msgid "Ticket feed" msgstr "Báo cáo" -#: judge/views/blog.py:169 +#: judge/views/blog.py:166 msgid "Comment feed" msgstr "Bình luận" @@ -2682,8 +2723,8 @@ msgstr "Bạn phải giải ít nhất 1 bài trước khi được vote." msgid "You already voted." msgstr "Bạn đã vote." -#: judge/views/comment.py:253 judge/views/organization.py:810 -#: judge/views/organization.py:956 judge/views/organization.py:1121 +#: judge/views/comment.py:253 judge/views/organization.py:807 +#: judge/views/organization.py:957 judge/views/organization.py:1122 msgid "Edited from site" msgstr "Chỉnh sửa từ web" @@ -2692,7 +2733,7 @@ msgid "Editing comment" msgstr "Chỉnh sửa bình luận" #: judge/views/contests.py:119 judge/views/contests.py:387 -#: judge/views/contests.py:392 judge/views/contests.py:649 +#: judge/views/contests.py:392 judge/views/contests.py:663 msgid "No such contest" msgstr "Không có contest nào như vậy" @@ -2703,7 +2744,7 @@ msgstr "Không tìm thấy kỳ thi với mã \"%s\"." #: judge/views/contests.py:139 judge/views/stats.py:178 #: templates/organization/org-left-sidebar.html:5 templates/stats/site.html:21 -#: templates/user/user-bookmarks.html:54 +#: templates/user/user-bookmarks.html:56 msgid "Contests" msgstr "Kỳ thi" @@ -2716,117 +2757,161 @@ msgstr "Không tìm thấy kỳ thi nào như vậy." msgid "Access to contest \"%s\" denied" msgstr "Truy cập tới kỳ thi \"%s\" bị từ chối" -#: judge/views/contests.py:454 +#: judge/views/contests.py:451 msgid "Clone Contest" msgstr "Nhân bản kỳ thi" -#: judge/views/contests.py:523 +#: judge/views/contests.py:537 msgid "Contest not ongoing" msgstr "Kỳ thi đang không diễn ra" -#: judge/views/contests.py:524 +#: judge/views/contests.py:538 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" kỳ thi đang không diễn ra." -#: judge/views/contests.py:531 +#: judge/views/contests.py:545 msgid "Already in contest" msgstr "Đã ở trong kỳ thi" -#: judge/views/contests.py:532 +#: judge/views/contests.py:546 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Bạn đã ở trong kỳ thi: \"%s\"." -#: judge/views/contests.py:542 +#: judge/views/contests.py:556 msgid "Banned from joining" msgstr "Bị cấm tham gia" -#: judge/views/contests.py:544 +#: judge/views/contests.py:558 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "Bạn không được phép tham gia kỳ thi này." -#: judge/views/contests.py:633 +#: judge/views/contests.py:647 #, python-format msgid "Enter access code for \"%s\"" msgstr "Nhập mật khẩu truy cập cho \"%s\"" -#: judge/views/contests.py:650 +#: judge/views/contests.py:664 #, python-format msgid "You are not in contest \"%s\"." msgstr "Bạn không ở trong kỳ thi \"%s\"." -#: judge/views/contests.py:673 +#: judge/views/contests.py:687 msgid "ContestCalendar requires integer year and month" msgstr "Lịch thi yêu cầu giá trị cho năm và tháng là số nguyên" -#: judge/views/contests.py:731 +#: judge/views/contests.py:745 #, python-format msgid "Contests in %(month)s" msgstr "Các kỳ thi trong %(month)s" -#: judge/views/contests.py:732 +#: judge/views/contests.py:746 msgid "F Y" msgstr "F Y" -#: judge/views/contests.py:792 +#: judge/views/contests.py:806 #, python-format msgid "%s Statistics" msgstr "%s Thống kê" -#: judge/views/contests.py:1085 +#: judge/views/contests.py:1099 #, python-format msgid "%s Rankings" msgstr "%s Bảng điểm" -#: judge/views/contests.py:1096 +#: judge/views/contests.py:1110 msgid "???" msgstr "???" -#: judge/views/contests.py:1123 +#: judge/views/contests.py:1137 #, python-format msgid "Your participation in %s" msgstr "Lần tham gia trong %s" -#: judge/views/contests.py:1124 +#: judge/views/contests.py:1138 #, python-format msgid "%s's participation in %s" msgstr "Lần tham gia của %s trong %s" -#: judge/views/contests.py:1138 +#: judge/views/contests.py:1152 msgid "Live" msgstr "Trực tiếp" -#: judge/views/contests.py:1157 templates/contest/contest-tabs.html:19 +#: judge/views/contests.py:1171 templates/contest/contest-tabs.html:19 msgid "Participation" msgstr "Lần tham gia" -#: judge/views/contests.py:1206 +#: judge/views/contests.py:1220 #, python-format msgid "%s MOSS Results" msgstr "%s Kết quả MOSS" -#: judge/views/contests.py:1242 +#: judge/views/contests.py:1256 #, python-format msgid "Running MOSS for %s..." msgstr "Đang chạy MOSS cho %s..." -#: judge/views/contests.py:1265 +#: judge/views/contests.py:1279 #, python-format msgid "Contest tag: %s" msgstr "Nhãn kỳ thi: %s" -#: judge/views/contests.py:1280 judge/views/ticket.py:72 +#: judge/views/contests.py:1294 judge/views/ticket.py:72 msgid "Issue description" msgstr "Mô tả vấn đề" -#: judge/views/contests.py:1323 +#: judge/views/contests.py:1337 #, python-format msgid "New clarification for %s" msgstr "Thông báo mới cho %s" +#: judge/views/email.py:21 +msgid "New Email" +msgstr "Email mới" + +#: judge/views/email.py:31 +msgid "An account with this email already exists." +msgstr "Email đã được dùng cho tài khoản khác." + +#: judge/views/email.py:55 +msgid "Email Change Request" +msgstr "Thay đổi Email" + +#: judge/views/email.py:58 +msgid "" +"We have received a request to change your email to this email. Click the " +"button below to change your email:" +msgstr "" +"Chúng tôi đã nhận được yêu cầu thay đổi địa chỉ email của bạn thành địa chỉ " +"email này. Vui lòng nhấp vào nút bên dưới để thay đổi địa chỉ email của bạn:" + +#: judge/views/email.py:60 +msgid "Email Change" +msgstr "Thay đổi Email" + +#: judge/views/email.py:61 +msgid "Change Email" +msgstr "Thay đổi Email" + +#: judge/views/email.py:83 templates/user/edit-profile.html:120 +msgid "Change email" +msgstr "Thay đổi email" + +#: judge/views/email.py:106 +msgid "Success" +msgstr "Thành công" + +#: judge/views/email.py:110 +msgid "Invalid" +msgstr "Không hợp lệ" + +#: judge/views/email.py:119 +msgid "Email change pending" +msgstr "Yêu cầu thay đổi email đang đợi xác thực." + #: judge/views/error.py:17 msgid "404 error" msgstr "Lỗi 404" @@ -2852,7 +2937,7 @@ msgstr "trang bị sập %s" msgid "Internal problems" msgstr "bài trong kỳ thi" -#: judge/views/internal.py:76 +#: judge/views/internal.py:83 #, fuzzy #| msgid "request time" msgid "Request times" @@ -2889,74 +2974,77 @@ msgstr "Không thể chỉnh sửa tổ chức" msgid "You are not allowed to edit this organization." msgstr "Bạn không được phép chỉnh sửa tổ chức này." -#: judge/views/organization.py:193 judge/views/organization.py:340 -#, fuzzy -#| msgid "Can't edit organization" +#: judge/views/organization.py:193 judge/views/organization.py:337 msgid "Can't access organization" -msgstr "Không thể chỉnh sửa tổ chức" +msgstr "Không thể truy cập nhóm" -#: judge/views/organization.py:194 judge/views/organization.py:341 +#: judge/views/organization.py:194 judge/views/organization.py:338 msgid "You are not allowed to access this organization." msgstr "Bạn không được phép chỉnh sửa tổ chức này." -#: judge/views/organization.py:230 judge/views/register.py:48 -#: judge/views/stats.py:184 templates/contest/list.html:89 -#: templates/problem/list-base.html:97 templates/stats/site.html:33 -#: templates/user/user-left-sidebar.html:4 templates/user/user-list-tabs.html:6 +#: judge/views/organization.py:230 judge/views/stats.py:184 +#: templates/contest/list.html:89 templates/problem/list-base.html:97 +#: templates/stats/site.html:33 templates/user/user-left-sidebar.html:4 +#: templates/user/user-list-tabs.html:6 msgid "Groups" msgstr "Nhóm" -#: judge/views/organization.py:347 +#: judge/views/organization.py:344 #, python-format msgid "%s Members" msgstr "%s Thành viên" -#: judge/views/organization.py:469 +#: judge/views/organization.py:466 #, python-brace-format msgid "All submissions in {0}" msgstr "Bài nộp trong {0}" -#: judge/views/organization.py:499 judge/views/organization.py:505 -#: judge/views/organization.py:512 +#: judge/views/organization.py:496 judge/views/organization.py:502 +#: judge/views/organization.py:509 msgid "Joining group" msgstr "Tham gia nhóm" -#: judge/views/organization.py:500 +#: judge/views/organization.py:497 msgid "You are already in the group." msgstr "Bạn đã ở trong nhóm." -#: judge/views/organization.py:505 +#: judge/views/organization.py:502 msgid "This group is not open." msgstr "Nhóm này là nhóm kín." -#: judge/views/organization.py:528 +#: judge/views/organization.py:510 +#, python-brace-format +msgid "You may not be part of more than {count} public groups." +msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai." + +#: judge/views/organization.py:525 msgid "Leaving group" msgstr "Rời nhóm" -#: judge/views/organization.py:529 +#: judge/views/organization.py:526 #, python-format msgid "You are not in \"%s\"." msgstr "Bạn không ở trong \"%s\"." -#: judge/views/organization.py:554 +#: judge/views/organization.py:551 #, python-format msgid "Request to join %s" msgstr "Đăng ký tham gia %s" -#: judge/views/organization.py:584 +#: judge/views/organization.py:581 msgid "Join request detail" msgstr "Chi tiết đơn đăng ký" -#: judge/views/organization.py:626 +#: judge/views/organization.py:623 msgid "Manage join requests" msgstr "Quản lý đơn đăng ký" -#: judge/views/organization.py:630 +#: judge/views/organization.py:627 #, python-format msgid "Managing join requests for %s" msgstr "Quản lý đơn đăng ký cho %s" -#: judge/views/organization.py:670 +#: judge/views/organization.py:667 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2965,96 +3053,96 @@ msgstr "" "Tổ chức chỉ có thể chứa %d thành viên. Bạn không thể chấp thuận nhiều hơn %d " "người." -#: judge/views/organization.py:688 +#: judge/views/organization.py:685 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "Đã chấp thuận %d người." -#: judge/views/organization.py:691 +#: judge/views/organization.py:688 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "Đã từ chối %d người." -#: judge/views/organization.py:731 +#: judge/views/organization.py:728 #, python-format msgid "Add member for %s" msgstr "Thêm thành viên cho %s" -#: judge/views/organization.py:743 +#: judge/views/organization.py:740 #, fuzzy #| msgid "Edited from site" msgid "Added members from site" msgstr "Chỉnh sửa từ web" -#: judge/views/organization.py:763 judge/views/organization.py:771 +#: judge/views/organization.py:760 judge/views/organization.py:768 msgid "Can't kick user" msgstr "Không thể đuổi" -#: judge/views/organization.py:764 +#: judge/views/organization.py:761 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:772 +#: judge/views/organization.py:769 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/organization.py:793 judge/views/organization.py:945 +#: judge/views/organization.py:790 judge/views/organization.py:946 #, fuzzy, python-format #| msgid "Editing %s" msgid "Edit %s" msgstr "Đang chỉnh sửa %s" -#: judge/views/organization.py:821 templates/organization/list.html:45 +#: judge/views/organization.py:818 templates/organization/list.html:45 msgid "Create group" msgstr "Tạo nhóm" -#: judge/views/organization.py:836 +#: judge/views/organization.py:833 msgid "Exceeded limit" msgstr "" -#: judge/views/organization.py:837 +#: judge/views/organization.py:834 #, python-format msgid "You created too many groups. You can only create at most %d groups" msgstr "" -#: judge/views/organization.py:842 judge/views/organization.py:867 -#: judge/views/organization.py:1011 +#: judge/views/organization.py:839 judge/views/organization.py:864 +#: judge/views/organization.py:1012 msgid "Added from site" msgstr "Thêm từ web" -#: judge/views/organization.py:858 +#: judge/views/organization.py:855 #: templates/organization/org-right-sidebar.html:55 msgid "Add contest" msgstr "Thêm kỳ thi" -#: judge/views/organization.py:901 judge/views/organization.py:1063 +#: judge/views/organization.py:898 judge/views/organization.py:1064 msgid "Permission denied" msgstr "Truy cập bị từ chối" -#: judge/views/organization.py:902 +#: judge/views/organization.py:899 #, fuzzy #| msgid "You are not allowed to edit this organization." msgid "You are not allowed to edit this contest" msgstr "Bạn không được phép chỉnh sửa tổ chức này." -#: judge/views/organization.py:1000 +#: judge/views/organization.py:1001 #, python-format msgid "Add blog for %s" msgstr "Thêm bài đăng cho %s" -#: judge/views/organization.py:1064 +#: judge/views/organization.py:1065 msgid "Not allowed to edit this blog" msgstr "Bạn không được phép chỉnh sửa bài đăng này." -#: judge/views/organization.py:1096 +#: judge/views/organization.py:1097 #, python-format msgid "Edit blog %s" msgstr "Chỉnh sửa %s" -#: judge/views/organization.py:1147 +#: judge/views/organization.py:1148 #, python-format msgid "Pending blogs in %s" msgstr "Bài đang đợi duyệt trong %s" @@ -3078,41 +3166,41 @@ msgstr "Hướng dẫn cho {0}" msgid "Editorial for {0}" msgstr "Hướng dẫn cho {0}" -#: judge/views/problem.py:467 templates/contest/contest.html:96 +#: judge/views/problem.py:461 templates/contest/contest.html:96 #: templates/organization/org-left-sidebar.html:4 -#: templates/user/user-about.html:28 templates/user/user-bookmarks.html:34 +#: templates/user/user-about.html:28 templates/user/user-bookmarks.html:35 #: templates/user/user-tabs.html:5 templates/user/users-table.html:19 msgid "Problems" msgstr "Bài tập" -#: judge/views/problem.py:843 +#: judge/views/problem.py:837 msgid "Problem feed" msgstr "Bài tập" -#: judge/views/problem.py:1071 +#: judge/views/problem.py:1062 msgid "Banned from submitting" msgstr "Bị cấm nộp bài" -#: judge/views/problem.py:1073 +#: judge/views/problem.py:1064 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "Bạn đã bị cấm nộp bài này." -#: judge/views/problem.py:1096 +#: judge/views/problem.py:1087 msgid "Too many submissions" msgstr "Quá nhiều lần nộp" -#: judge/views/problem.py:1098 +#: judge/views/problem.py:1089 msgid "You have exceeded the submission limit for this problem." msgstr "Bạn đã vượt quá số lần nộp cho bài này." -#: judge/views/problem.py:1177 judge/views/problem.py:1182 +#: judge/views/problem.py:1168 judge/views/problem.py:1173 #, python-format msgid "Submit to %(problem)s" msgstr "Nộp bài cho %(problem)s" -#: judge/views/problem.py:1208 +#: judge/views/problem.py:1199 msgid "Clone Problem" msgstr "Nhân bản bài tập" @@ -3188,11 +3276,11 @@ msgstr "Các bài nộp tốt nhất cho {0}" msgid "A username must contain letters, numbers, or underscores" msgstr "Tên đăng nhập phải chứa ký tự, chữ số, hoặc dấu gạch dưới" -#: judge/views/register.py:42 templates/user/edit-profile.html:117 +#: judge/views/register.py:42 templates/user/edit-profile.html:144 msgid "Preferred language" msgstr "Ngôn ngữ ưa thích" -#: judge/views/register.py:73 +#: judge/views/register.py:54 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -3200,7 +3288,7 @@ msgid "" msgstr "" "Email \"%s\" đã được sử dụng. Mỗi email chỉ có thể đăng ký một tài khoản." -#: judge/views/register.py:85 +#: judge/views/register.py:66 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -3208,11 +3296,11 @@ msgstr "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." -#: judge/views/register.py:93 judge/views/register.py:131 +#: judge/views/register.py:74 judge/views/register.py:111 msgid "Registration" msgstr "Đăng ký" -#: judge/views/register.py:145 +#: judge/views/register.py:125 msgid "Authentication failure" msgstr "Xác thực thất bại" @@ -3231,8 +3319,8 @@ msgstr "Thống kê ngôn ngữ" msgid "Submissions" msgstr "Bài nộp" -#: judge/views/stats.py:160 templates/blog/list.html:45 -#: templates/comments/list.html:4 templates/stats/site.html:39 +#: judge/views/stats.py:160 templates/comments/list.html:4 +#: templates/stats/site.html:39 msgid "Comments" msgstr "Bình luận" @@ -3418,7 +3506,7 @@ msgid "Updated on site" msgstr "Được cập nhật trên web" #: judge/views/user.py:431 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:282 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:300 #: templates/user/user-tabs.html:11 msgid "Edit profile" msgstr "Chỉnh sửa thông tin" @@ -3445,7 +3533,7 @@ msgstr "Kinh độ / Vĩ độ không hợp lệ" msgid "Like" msgstr "Thích" -#: templates/actionbar/list.html:28 +#: templates/actionbar/list.html:28 templates/blog/list.html:45 msgid "Comment" msgstr "Bình luận" @@ -3509,26 +3597,26 @@ msgstr "Chỉnh sửa thông tin" msgid "Rejudge" msgstr "Chấm lại" -#: templates/base.html:227 templates/chat/chat.html:600 +#: templates/base.html:236 templates/chat/chat.html:65 msgid "Chat" msgstr "Chat" -#: templates/base.html:237 +#: templates/base.html:246 msgid "Notification" msgstr "Thông báo" -#: templates/base.html:258 +#: templates/base.html:267 msgid "Dark Mode" msgstr "" -#: templates/base.html:274 +#: templates/base.html:284 msgid "Profile" msgstr "Trang cá nhân" -#: templates/base.html:276 templates/chat/chat.html:21 +#: templates/base.html:288 templates/chat/chat_js.html:5 #: templates/comments/content-list.html:81 #: templates/contest/contest-list-tabs.html:4 -#: templates/contest/ranking-table.html:47 templates/internal/problem.html:57 +#: templates/contest/ranking-table.html:47 templates/internal/problem.html:62 #: templates/organization/org-left-sidebar.html:12 #: templates/problem/left-sidebar.html:6 #: templates/problem/problem-list-tabs.html:6 @@ -3537,44 +3625,44 @@ msgstr "Trang cá nhân" msgid "Admin" msgstr "Admin" -#: templates/base.html:279 +#: templates/base.html:293 msgid "Internal" msgstr "Nội bộ" -#: templates/base.html:280 +#: templates/base.html:296 msgid "Stats" msgstr "Thống kê" -#: templates/base.html:287 +#: templates/base.html:309 msgid "Log out" msgstr "Đăng xuất" -#: templates/base.html:296 +#: templates/base.html:319 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Đăng nhập" -#: templates/base.html:297 templates/registration/registration_form.html:72 +#: templates/base.html:320 templates/registration/registration_form.html:72 msgid "or" msgstr "hoặc" -#: templates/base.html:298 +#: templates/base.html:321 msgid "Sign up" msgstr "Đăng ký" -#: templates/base.html:311 +#: templates/base.html:335 msgid "spectating" msgstr "đang theo dõi" -#: templates/base.html:323 +#: templates/base.html:347 msgid "Compete" msgstr "Thi" -#: templates/base.html:325 +#: templates/base.html:349 msgid "General" msgstr "Chung" -#: templates/base.html:332 +#: templates/base.html:356 msgid "This site works best with JavaScript enabled." msgstr "" @@ -3621,7 +3709,7 @@ msgid "News" msgstr "Tin tức" #: templates/blog/list.html:46 -msgid "Tickets" +msgid "Ticket" msgstr "Báo cáo" #: templates/blog/list.html:47 @@ -3646,47 +3734,47 @@ msgstr "Thêm mới" msgid "No clarifications have been made at this time." msgstr "Không có thông báo nào." -#: templates/chat/chat.html:5 templates/chat/chat.html:574 +#: templates/chat/chat.html:5 templates/chat/chat_js.html:548 msgid "Chat Box" msgstr "Chat Box" -#: templates/chat/chat.html:19 -msgid "Recent" -msgstr "Gần đây" +#: templates/chat/chat.html:67 +msgid "Online Users" +msgstr "Trực tuyến" -#: templates/chat/chat.html:20 -msgid "Following" -msgstr "Bạn bè" - -#: templates/chat/chat.html:22 -msgid "Other" -msgstr "Thành viên khác" - -#: templates/chat/chat.html:169 -msgid "New message(s)" -msgstr "Tin nhắn mới" - -#: templates/chat/chat.html:435 -msgid "Mute this user and delete all messages?" -msgstr "Mute người dùng này và xóa tất cả tin nhắn chung?" - -#: templates/chat/chat.html:536 templates/chat/chat.html:617 +#: templates/chat/chat.html:78 templates/chat/chat_js.html:510 #: templates/user/base-users-js.html:10 #: templates/user/base-users-two-col.html:19 msgid "Search by handle..." msgstr "Tìm kiếm theo tên..." -#: templates/chat/chat.html:602 templates/chat/chat.html:609 -msgid "Online Users" -msgstr "Trực tuyến" +#: templates/chat/chat.html:97 +msgid "Enter your message" +msgstr "Nhập tin nhắn" -#: templates/chat/chat.html:638 +#: templates/chat/chat.html:98 msgid "Emoji" msgstr "" -#: templates/chat/chat.html:639 -msgid "Enter your message" -msgstr "Nhập tin nhắn" +#: templates/chat/chat_js.html:3 +msgid "Recent" +msgstr "Gần đây" + +#: templates/chat/chat_js.html:4 +msgid "Following" +msgstr "Bạn bè" + +#: templates/chat/chat_js.html:6 +msgid "Other" +msgstr "Thành viên khác" + +#: templates/chat/chat_js.html:124 +msgid "New message(s)" +msgstr "Tin nhắn mới" + +#: templates/chat/chat_js.html:401 +msgid "Mute this user and delete all messages?" +msgstr "Mute người dùng này và xóa tất cả tin nhắn chung?" #: templates/chat/message.html:20 templates/fine_uploader/script.html:25 #: templates/organization/blog/edit.html:37 @@ -3753,10 +3841,7 @@ msgid "Hide" msgstr "Ẩn" #: templates/comments/content-list.html:94 -#, fuzzy, python-format -#| msgid "" -#| "This comment is hidden due to too much negative feedback. Click here to view it." +#, python-format msgid "" "This comment is hidden due to too much negative feedback. Click here " @@ -3869,11 +3954,17 @@ msgstr "Thứ bảy" msgid "Create" msgstr "Tạo mới" -#: templates/contest/clone.html:37 +#: templates/contest/clone.html:45 msgid "Enter a new key for the cloned contest:" msgstr "Nhập mã kỳ thi cho kỳ thi nhân bản:" -#: templates/contest/clone.html:40 templates/problem/clone.html:40 +#: templates/contest/clone.html:47 +#, fuzzy +#| msgid "Groups" +msgid "Group:" +msgstr "Nhóm" + +#: templates/contest/clone.html:55 templates/problem/clone.html:40 msgid "Clone!" msgstr "Nhân bản!" @@ -3984,7 +4075,7 @@ msgstr "Nhân bản" msgid "Leave contest" msgstr "Rời kỳ thi" -#: templates/contest/contest.html:42 templates/contest/list.html:401 +#: templates/contest/contest.html:42 templates/contest/list.html:408 msgid "Virtual join" msgstr "Tham gia ảo" @@ -4009,7 +4100,7 @@ msgid "AC Rate" msgstr "Tỷ lệ AC" #: templates/contest/contest.html:103 templates/contest/list.html:242 -#: templates/contest/list.html:291 templates/contest/list.html:378 +#: templates/contest/list.html:291 templates/contest/list.html:385 #: templates/problem/list.html:24 msgid "Users" msgstr "Người nộp" @@ -4065,7 +4156,7 @@ msgstr "Tham gia" msgid "Search contests..." msgstr "Tìm kiếm kỳ thi..." -#: templates/contest/list.html:221 +#: templates/contest/list.html:221 templates/internal/problem.html:33 msgid "Search" msgstr "Tìm kiếm" @@ -4078,7 +4169,7 @@ msgid "Active Contests" msgstr "Kỳ thi bạn đang tham gia" #: templates/contest/list.html:241 templates/contest/list.html:290 -#: templates/contest/list.html:333 templates/contest/list.html:375 +#: templates/contest/list.html:338 templates/contest/list.html:382 msgid "Contest" msgstr "Kỳ thi" @@ -4092,22 +4183,30 @@ msgstr "Cửa số thi còn %(countdown)s" msgid "Ends in %(countdown)s" msgstr "Kết thúc trong %(countdown)s" -#: templates/contest/list.html:284 +#: templates/contest/list.html:283 msgid "Ongoing Contests" msgstr "Kỳ thi đang diễn ra" -#: templates/contest/list.html:326 +#: templates/contest/list.html:324 +msgid "There is no ongoing contest at this time." +msgstr "Không có kỳ thi nào đang diễn ra hiện tại." + +#: templates/contest/list.html:331 msgid "Upcoming Contests" msgstr "Kỳ thi sắp tới" -#: templates/contest/list.html:357 -msgid "There are no scheduled contests at this time." +#: templates/contest/list.html:363 +msgid "There is no scheduled contest at this time." msgstr "Không có kỳ thi nào được lên lịch hiện tại." -#: templates/contest/list.html:364 +#: templates/contest/list.html:370 msgid "Past Contests" msgstr "Kỳ thi trong quá khứ" +#: templates/contest/list.html:423 +msgid "There is no past contest." +msgstr "Không có kỳ thi nào trong quá khứ." + #: templates/contest/media-js.html:147 msgid "Are you sure you want to leave?" msgstr "Bạn có chắc muốn rời?" @@ -4165,11 +4264,11 @@ msgstr "Khôi phục kết quả" msgid "Disqualify" msgstr "Hủy kết quả" -#: templates/contest/ranking-table.html:54 templates/user/edit-profile.html:94 +#: templates/contest/ranking-table.html:54 templates/user/edit-profile.html:100 msgid "Fullname" msgstr "Tên đầy đủ" -#: templates/contest/ranking-table.html:55 templates/user/edit-profile.html:98 +#: templates/contest/ranking-table.html:55 templates/user/edit-profile.html:104 #: templates/user/import/table_csv.html:7 msgid "School" msgstr "Trường" @@ -4242,6 +4341,26 @@ msgstr "Còn" msgid "Upcoming contests" msgstr "Kỳ thi sắp diễn ra" +#: templates/email_change/email_change.html:15 +msgid "Verify Email" +msgstr "Xác thực Email" + +#: templates/email_change/email_change_failure.html:3 +msgid "Invalid reset link." +msgstr "Đường dẫn không hợp lệ" + +#: templates/email_change/email_change_pending.html:4 +msgid "An email was sent to" +msgstr "Email đã được gửi đến" + +#: templates/email_change/email_change_pending.html:4 +msgid "If you don't see it, kindly check your spam folder as well." +msgstr "Nếu bạn không tìm thấy nó, vui lòng kiểm tra thư mục spam của bạn." + +#: templates/email_change/email_change_success.html:3 +msgid "Your email was sucessfully changed to" +msgstr "Bạn đã đổi email thành công." + #: templates/feed/has_next.html:3 msgid "View more" msgstr "Xem thêm" @@ -4270,6 +4389,10 @@ msgstr "Dừng" msgid "Continue" msgstr "Tiếp tục" +#: templates/general_email.html:15 +msgid "Dear" +msgstr "Xin chào" + #: templates/internal/left-sidebar.html:3 msgid "Average speed" msgstr "Tốc độ trung bình" @@ -4278,33 +4401,33 @@ msgstr "Tốc độ trung bình" msgid "Slow requests" msgstr "Requests chậm" -#: templates/internal/problem.html:36 +#: templates/internal/problem.html:41 msgid "Code" msgstr "" -#: templates/internal/problem.html:37 +#: templates/internal/problem.html:42 #, fuzzy #| msgid "Total points" msgid "Vote count" msgstr "Tổng điểm" -#: templates/internal/problem.html:60 +#: templates/internal/problem.html:65 #, fuzzy #| msgid "contest problem" msgid "Votes for problem" msgstr "bài trong kỳ thi" -#: templates/internal/problem.html:68 +#: templates/internal/problem.html:73 msgid "Knowledge" msgstr "" -#: templates/internal/problem.html:72 +#: templates/internal/problem.html:77 #, fuzzy #| msgid "Rankings" msgid "Thinking" msgstr "Bảng xếp hạng" -#: templates/internal/problem.html:80 templates/problem/feed/problems.html:97 +#: templates/internal/problem.html:85 templates/problem/feed/problems.html:97 #, fuzzy #| msgid "Feed" msgid "Feedback" @@ -4324,8 +4447,8 @@ msgstr "Hoạt động" #: templates/organization/blog/edit.html:36 #: templates/organization/contest/add.html:36 -#: templates/organization/contest/edit.html:87 -#: templates/organization/form.html:24 +#: templates/organization/contest/edit.html:86 +#: templates/organization/form.html:23 msgid "Save" msgstr "Lưu" @@ -4339,12 +4462,15 @@ msgid "Author" msgstr "Tác giả" #: templates/organization/blog/pending.html:14 -#, fuzzy -#| msgid "posted time" msgid "Post time" -msgstr "thời gian đăng" +msgstr "Thời gian đăng" -#: templates/organization/contest/edit.html:61 +#: templates/organization/contest/edit.html:40 +#: templates/organization/form.html:6 +msgid "Please fix below errors" +msgstr "Vui lòng sửa các lỗi bên dưới" + +#: templates/organization/contest/edit.html:60 msgid "If you run out of rows, click Save" msgstr "Ấn nút lưu lại nếu cần thêm hàng" @@ -4485,6 +4611,10 @@ msgstr "Từ chối" msgid "Kick" msgstr "Đuổi" +#: templates/pagedown.html:9 +msgid "Update Preview" +msgstr "Cập nhật xem trước" + #: templates/problem/clone.html:37 msgid "Enter a new code for the cloned problem:" msgstr "Nhập mã bài mới cho bài tập được nhân bản:" @@ -4800,7 +4930,7 @@ msgid "Memory limit:" msgstr "Bộ nhớ:" #: templates/problem/problem.html:244 templates/problem/raw.html:67 -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:155 msgid "Input:" msgstr "Input:" @@ -4809,7 +4939,7 @@ msgid "stdin" msgstr "bàn phím" #: templates/problem/problem.html:250 templates/problem/raw.html:70 -#: templates/submission/status-testcases.html:164 +#: templates/submission/status-testcases.html:159 msgid "Output:" msgstr "Output:" @@ -4894,10 +5024,6 @@ msgstr "Hiển thị hướng dẫn" msgid "Have editorial" msgstr "Có hướng dẫn" -#: templates/problem/search-form.html:46 -msgid "Group" -msgstr "" - #: templates/problem/search-form.html:70 templates/problem/search-form.html:72 #: templates/submission/list.html:381 #: templates/submission/submission-list-tabs.html:4 @@ -4978,6 +5104,42 @@ msgstr "%(key)s không phải mã xác thực hợp lệ." msgid "Your account has been successfully activated." msgstr "Tài khoản được kích hoạt thành công." +#: templates/registration/activation_email.html:2 +msgid "Account activation" +msgstr "Kích hoạt tài khoản" + +#: templates/registration/activation_email.html:3 +#, python-format +msgid "" +"Thanks for registering! We're glad to have you. The last step is activating " +"your account. Please activate your account in the next %(expiration_days)d " +"days." +msgstr "" +"Cảm ơn bạn đã đăng ký! Chúng tôi rất vui được chào đón bạn. Bước cuối cùng " +"là kích hoạt tài khoản của bạn. Vui lòng kích hoạt tài khoản trong vòng " +"%(expiration_days)d ngày." + +#: templates/registration/activation_email.html:5 +msgid "Activate" +msgstr "Kích hoạt" + +#: templates/registration/activation_email.html:10 +msgid "" +"Alternatively, you can reply to this message to activate your account. Your " +"reply must keep the following text intact for this to work:" +msgstr "" +"Hoặc bạn có thể trả lời tin nhắn này để kích hoạt tài khoản của bạn. Email " +"trả lời của bạn phải giữ nguyên đoạn văn sau đây:" + +#: templates/registration/activation_email.html:16 +msgid "See you soon!" +msgstr "Hẹn sớm gặp lại bạn!" + +#: templates/registration/activation_email_subject.txt:1 +#, python-format +msgid "Activate your %(SITE_NAME)s account" +msgstr "Kích hoạt tài khoản %(SITE_NAME)s" + #: templates/registration/login.html:9 msgid "Invalid username or password." msgstr "Tên đăng nhập hoặc mật khẩu không hợp lệ." @@ -5016,6 +5178,7 @@ msgid "Your password has been set. You may go ahead and log in now" msgstr "Mật khẩu đã được cập nhật. Hãy thử đăng nhập lại" #: templates/registration/password_reset_confirm.html:9 +#: templates/registration/password_reset_email.html:5 msgid "Reset Password" msgstr "Reset mật khẩu" @@ -5023,7 +5186,7 @@ msgstr "Reset mật khẩu" msgid "" "We've emailed you instructions for setting your password. You should be " "receiving them shortly." -msgstr "Kiểm tra email để xem hướng dẫn đặt mật khẩu." +msgstr "Chúng tôi đã gửi email cho bạn để đặt lại mật khẩu." #: templates/registration/password_reset_done.html:5 msgid "" @@ -5031,13 +5194,25 @@ msgid "" "you registered with, and check your spam folder." msgstr "Nếu bạn không nhận được email, hãy kiểm tra hộp thư rác (spam)." +#: templates/registration/password_reset_email.html:2 +msgid "Password Reset" +msgstr "Đặt lại mật khẩu" + +#: templates/registration/password_reset_email.html:3 +msgid "" +"We have received a request to reset your password. Click the button below to " +"reset your password:" +msgstr "" +"Chúng tôi đã nhận được yêu cầu đặt lại mật khẩu của bạn. Nhấn vào nút bên " +"dưới để đặt lại mật khẩu của bạn:" + #: templates/registration/password_reset_email.txt:1 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" -"Bạn nhận được email này vì bạn đã yêu cầu reset mật khẩu tại %(site_name)s." +"Bạn nhận được email này vì bạn đã yêu cầu đặt lại mật khẩu tại %(site_name)s." #: templates/registration/password_reset_email.txt:3 msgid "Please go to the following page and choose a new password:" @@ -5059,7 +5234,7 @@ msgstr "%(site_name)s team" #: templates/registration/password_reset_subject.txt:1 #, python-format msgid "Password reset on %(site_name)s" -msgstr "Reset mật khẩu trên %(site_name)s" +msgstr "Đặt lại mật khẩu trên %(site_name)s" #: templates/registration/profile_creation.html:36 #: templates/registration/username_select.html:7 @@ -5073,8 +5248,11 @@ msgstr "Đăng ký hiện tại đã bị dừng. Hãy liên hệ admin." #: templates/registration/registration_complete.html:3 msgid "" "You have successfully been registered. An email has been sent to the email " -"address you provided to confirm your registration." -msgstr "Bạn đã đăng ký thành công. Kiểm tra email để hoàn thành việc xác thực." +"address you provided to confirm your registration. If you don't see it, " +"kindly check your spam folder as well." +msgstr "" +"Bạn đã đăng ký thành công. Kiểm tra email để hoàn thành việc xác thực. Nếu " +"bạn không tìm thấy nó, vui lòng kiểm tra thư mục spam của bạn." #: templates/registration/registration_form.html:61 msgid "(again, for confirmation)" @@ -5090,22 +5268,9 @@ msgstr "chọn từ bản đồ" #: templates/registration/registration_form.html:78 msgid "Default language" -msgstr "Ngôn ngữ ưa thích" +msgstr "Ngôn ngữ mặc định" -#: templates/registration/registration_form.html:81 -#: templates/user/edit-profile.html:147 -msgid "Affiliated organizations" -msgstr "Tổ chức bạn muốn tham gia" - -#: templates/registration/registration_form.html:97 -msgid "By registering, you agree to our" -msgstr "Bạn đồng ý với" - -#: templates/registration/registration_form.html:98 -msgid "Terms & Conditions" -msgstr "Điều khoản của chúng tôi" - -#: templates/registration/registration_form.html:101 +#: templates/registration/registration_form.html:89 msgid "Register!" msgstr "Đăng ký!" @@ -5113,7 +5278,7 @@ msgstr "Đăng ký!" #: templates/registration/totp_disable.html:45 #: templates/registration/totp_enable.html:83 msgid "Enter the 6-digit code generated by your app:" -msgstr "" +msgstr "Nhập mã xác thực gồm 6 chữ số từ app bạn chọn" #: templates/registration/totp_auth.html:41 #, python-format @@ -5279,84 +5444,84 @@ msgstr "Xem mã nguồn" msgid "Resubmit" msgstr "Nộp lại" -#: templates/submission/status-testcases.html:10 +#: templates/submission/status-testcases.html:5 msgid "We are waiting for a suitable judge to process your submission..." msgstr "Các máy chấm đang bận. Hãy kiên nhẫn chờ đợi một chút..." -#: templates/submission/status-testcases.html:12 +#: templates/submission/status-testcases.html:7 msgid "Your submission is being processed..." msgstr "Đang chấm..." -#: templates/submission/status-testcases.html:14 +#: templates/submission/status-testcases.html:9 msgid "Compilation Error" msgstr "Lỗi biên dịch" -#: templates/submission/status-testcases.html:18 +#: templates/submission/status-testcases.html:13 msgid "Compilation Warnings" msgstr "Cảnh báo khi biên dịch" -#: templates/submission/status-testcases.html:23 +#: templates/submission/status-testcases.html:18 msgid "Pretest Execution Results" msgstr "Kết quả chấm Pretest" -#: templates/submission/status-testcases.html:25 +#: templates/submission/status-testcases.html:20 msgid "Execution Results" msgstr "Kết quả chấm" -#: templates/submission/status-testcases.html:32 -#: templates/submission/status-testcases.html:47 -#: templates/submission/status-testcases.html:98 +#: templates/submission/status-testcases.html:27 +#: templates/submission/status-testcases.html:42 +#: templates/submission/status-testcases.html:93 msgid "Batch " msgstr "Nhóm " -#: templates/submission/status-testcases.html:37 -#: templates/submission/status-testcases.html:39 -#: templates/submission/status-testcases.html:124 +#: templates/submission/status-testcases.html:32 +#: templates/submission/status-testcases.html:34 +#: templates/submission/status-testcases.html:119 msgid "Case" msgstr "Test" -#: templates/submission/status-testcases.html:58 +#: templates/submission/status-testcases.html:53 msgid "Overall: " msgstr "Tổng cộng: " -#: templates/submission/status-testcases.html:72 +#: templates/submission/status-testcases.html:67 msgid "Point: " msgstr "Điểm: " -#: templates/submission/status-testcases.html:77 +#: templates/submission/status-testcases.html:72 msgid "Time: " msgstr "Thời gian: " -#: templates/submission/status-testcases.html:86 +#: templates/submission/status-testcases.html:81 msgid "Memory: " msgstr "Bộ nhớ: " -#: templates/submission/status-testcases.html:109 -#: templates/submission/status-testcases.html:138 +#: templates/submission/status-testcases.html:104 +#: templates/submission/status-testcases.html:133 msgid "Point" msgstr "Điểm" -#: templates/submission/status-testcases.html:126 +#: templates/submission/status-testcases.html:121 msgid "Pretest" msgstr "Pretest" -#: templates/submission/status-testcases.html:128 +#: templates/submission/status-testcases.html:123 msgid "Test case" msgstr "Test" -#: templates/submission/status-testcases.html:168 +#: templates/submission/status-testcases.html:163 msgid "Answer:" msgstr "Kết quả:" -#: templates/submission/status-testcases.html:173 +#: templates/submission/status-testcases.html:168 msgid "Judge feedback:" msgstr "Phản hồi từ máy chấm:" -#: templates/submission/status-testcases.html:195 +#: templates/submission/status-testcases.html:190 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "AC pretest không đồng nghĩa AC cả bài nhé :))" -#: templates/submission/status-testcases.html:198 +#: templates/submission/status-testcases.html:193 msgid "Submission aborted!" msgstr "Đã hủy chấm bài nộp!" @@ -5501,43 +5666,55 @@ msgstr "Top Score" msgid "Rank" msgstr "Rank" -#: templates/user/edit-profile.html:104 -msgid "Self-description" -msgstr "Tự giới thiệu" - -#: templates/user/edit-profile.html:112 -msgid "Select your closest major city" -msgstr "Chọn thành phố gần nhất" - -#: templates/user/edit-profile.html:121 -msgid "Editor theme" -msgstr "Giao diện cho code editor" - -#: templates/user/edit-profile.html:126 -msgid "Math engine" -msgstr "" - -#: templates/user/edit-profile.html:132 templates/user/edit-profile.html:133 -msgid "Change your avatar" -msgstr "Đổi ảnh đại diện" - -#: templates/user/edit-profile.html:139 +#: templates/user/edit-profile.html:111 msgid "Change your password" msgstr "Đổi mật khẩu" -#: templates/user/edit-profile.html:156 +#: templates/user/edit-profile.html:125 +msgid "Avatar" +msgstr "Ảnh đại diện" + +#: templates/user/edit-profile.html:131 +msgid "Self-description" +msgstr "Tự giới thiệu" + +#: templates/user/edit-profile.html:139 +msgid "Select your closest major city" +msgstr "Chọn thành phố gần nhất" + +#: templates/user/edit-profile.html:148 +msgid "Editor theme" +msgstr "Giao diện cho code editor" + +#: templates/user/edit-profile.html:153 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:164 msgid "Two Factor Authentication is enabled." msgstr "Two Factor Authentication đã được kích hoạt." -#: templates/user/edit-profile.html:163 -msgid "Two Factor Authentication is disabled." -msgstr "Two Factor Authentication đã được hủy kích hoạt." - #: templates/user/edit-profile.html:168 +msgid "Disable" +msgstr "Tắt" + +#: templates/user/edit-profile.html:171 +msgid "Two Factor Authentication is disabled." +msgstr "Two Factor Authentication chưa kích hoạt." + +#: templates/user/edit-profile.html:172 +msgid "Enable" +msgstr "Bật" + +#: templates/user/edit-profile.html:176 +msgid "CSS background" +msgstr "" + +#: templates/user/edit-profile.html:180 msgid "User-script" msgstr "" -#: templates/user/edit-profile.html:172 +#: templates/user/edit-profile.html:184 msgid "Update profile" msgstr "Cập nhật thông tin" @@ -5598,80 +5775,76 @@ msgstr "Rank theo rating" msgid "Rank by points" msgstr "Rank theo điểm" -#: templates/user/user-about.html:64 -msgid "From" -msgstr "Đến từ" - -#: templates/user/user-about.html:75 +#: templates/user/user-about.html:65 msgid "Admin Notes" msgstr "Lưu ý của admin" -#: templates/user/user-about.html:90 +#: templates/user/user-about.html:79 msgid "You have not shared any information." msgstr "Bạn chưa chia sẻ thông tin nào." -#: templates/user/user-about.html:92 +#: templates/user/user-about.html:81 msgid "This user has not shared any information." msgstr "Người dùng này chưa chia sẻ thông tin nào." -#: templates/user/user-about.html:101 +#: templates/user/user-about.html:90 msgid "Awards" msgstr "Thành tích" -#: templates/user/user-about.html:112 +#: templates/user/user-about.html:101 #, python-format msgid "%(label)s (%(date)s)" msgstr "%(label)s (%(date)s)" -#: templates/user/user-about.html:130 +#: templates/user/user-about.html:119 msgid "Mon" msgstr "Thứ 2" -#: templates/user/user-about.html:135 +#: templates/user/user-about.html:124 msgid "Tues" msgstr "Thứ 3" -#: templates/user/user-about.html:140 +#: templates/user/user-about.html:129 msgid "Wed" msgstr "Thứ 4" -#: templates/user/user-about.html:145 +#: templates/user/user-about.html:134 msgid "Thurs" msgstr "Thứ 5" -#: templates/user/user-about.html:150 +#: templates/user/user-about.html:139 msgid "Fri" msgstr "Thứ 6" -#: templates/user/user-about.html:155 +#: templates/user/user-about.html:144 msgid "Sat" msgstr "Thứ 7" -#: templates/user/user-about.html:160 +#: templates/user/user-about.html:149 msgid "Sun" msgstr "CN" -#: templates/user/user-about.html:169 +#: templates/user/user-about.html:158 msgid "Less" msgstr "Ít" -#: templates/user/user-about.html:175 +#: templates/user/user-about.html:164 msgid "More" msgstr "Nhiều" -#: templates/user/user-about.html:184 +#: templates/user/user-about.html:173 msgid "Rating History" msgstr "Các lần thi" -#: templates/user/user-about.html:255 +#: templates/user/user-about.html:244 msgid "past year" msgstr "năm ngoái" -#: templates/user/user-about.html:272 +#: templates/user/user-about.html:261 msgid "total submission(s)" msgstr "bài nộp" -#: templates/user/user-about.html:276 +#: templates/user/user-about.html:265 msgid "submissions in the last year" msgstr "bài nộp trong năm qua" @@ -5703,7 +5876,7 @@ msgstr "Max rating:" msgid "Posts" msgstr "Bài đăng" -#: templates/user/user-bookmarks.html:75 +#: templates/user/user-bookmarks.html:78 msgid "Editorials" msgstr "Lời giải" @@ -5757,6 +5930,27 @@ msgstr "Thông tin" msgid "Check all" msgstr "Chọn tất cả" +#~ msgid "0 to not show testcases, 1 to show" +#~ msgstr "0 để ẩn test, 1 để hiện" + +#~ msgid "{settings.SITE_NAME} - Email Change Request" +#~ msgstr "{settings.SITE_NAME} - Thay đổi email" + +#~ msgid "Affiliated organizations" +#~ msgstr "Tổ chức bạn muốn tham gia" + +#~ msgid "By registering, you agree to our" +#~ msgstr "Bạn đồng ý với" + +#~ msgid "Terms & Conditions" +#~ msgstr "Điều khoản của chúng tôi" + +#~ msgid "Change your avatar" +#~ msgstr "Đổi ảnh đại diện" + +#~ msgid "From" +#~ msgstr "Đến từ" + #, fuzzy #~| msgid "How did you corrupt the custom checker path?" #~ msgid "How did you corrupt the interactor path?" @@ -5858,9 +6052,6 @@ msgstr "Chọn tất cả" #~ msgid "Color theme" #~ msgstr "Chủ đề màu sắc" -#~ msgid "Change color theme" -#~ msgstr "Đổi chủ đề màu sắc" - #~ msgid "commented on {time}" #~ msgstr "bình luận vào {time}" @@ -6011,9 +6202,6 @@ msgstr "Chọn tất cả" #~ msgid "Organization news" #~ msgstr "Tin tức tổ chức" -#~ msgid "There is no news at this time." -#~ msgstr "Không có tin tức." - #~ msgid "Admin organization" #~ msgstr "Trang admin tổ chức" diff --git a/resources/base.scss b/resources/base.scss index cd7cef8..fe5acca 100644 --- a/resources/base.scss +++ b/resources/base.scss @@ -191,11 +191,19 @@ header { display: block; margin: 0; - & > li > a > span { + & > li > span { height: 36px; padding-top: 8px; display: block; white-space: nowrap; + cursor: pointer; + + &:hover { + border-top: 2px solid #9c3706; + color: black; + background: rgba(255, 255, 255, 0.25); + margin: 0; + } & > img { vertical-align: middle; @@ -233,7 +241,7 @@ header { top: 0; left: 0; right: 10px; - height: 48px; + height: $navbar_height; } nav { @@ -377,7 +385,7 @@ hr { } #content { - margin: 48px auto 1em auto; + margin: $navbar_height auto 1em auto; padding-top: 1em; // Header @@ -860,6 +868,16 @@ select { margin-bottom: 1em; } +#loading-bar { + position: fixed; + top: 0; + left: 0; + height: 2px; + background-color: #993932; + width: 0; + z-index: 9999; +} + @media (max-width: 799px) { #user-links, .anon { padding-right: 0.5em; diff --git a/resources/blog.scss b/resources/blog.scss index 41b8528..60144e0 100644 --- a/resources/blog.scss +++ b/resources/blog.scss @@ -181,6 +181,7 @@ .left-sidebar-item { display: flex; align-items: center; + border-radius: .5em; .sidebar-icon { font-size: large; @@ -278,7 +279,6 @@ padding: 0.8em 0.2em 0.8em 0.2em; display: inline-block; flex: 1; - border-radius: 8px; .sidebar-icon { display: none; @@ -290,6 +290,7 @@ margin-bottom: 1em; border-radius: 7px; display: flex; + background: inherit; } .blog-box { @@ -305,9 +306,19 @@ @media (min-width: 800px) { .left-sidebar-item { + margin-bottom: 10px; + margin-left: 10px; + border: 1px solid lightgray; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background-color: white; padding: 0.8em 0.2em 0.8em 1em; } + .sidebar-text { + overflow: hidden; + text-overflow: ellipsis; + } + .middle-content, .blog-sidebar, .right-sidebar { @@ -345,9 +356,7 @@ height: 100%; margin-top: -4em; padding-top: 4em; - border-right: 1px solid lightgray; - box-shadow: 0px -10px 2px 0px rgb(0 0 0 / 50%); - background: white; + border-right: 1px; } .feed-table { diff --git a/resources/chatbox.scss b/resources/chatbox.scss index c433ce1..fac7090 100644 --- a/resources/chatbox.scss +++ b/resources/chatbox.scss @@ -11,15 +11,6 @@ float: right; margin-right: 1em; } -#emoji-button { - position: absolute; - right: 1em; - font-size: 2em; - color: lightgray; -} -#emoji-button:hover { - color: gray; -} #chat-log { padding: 0; padding-top: 2em; @@ -39,15 +30,15 @@ #chat-online { border-right: 1px solid #ccc; padding-bottom: 0 !important; - min-width: 25%; border-bottom: 0; + font-size: 1.2em; } #chat-online-content { margin-bottom: 0; overflow: hidden; overflow-wrap: break-word; overflow-y: auto; - max-height: calc(100% - 44px); + max-height: 100%; } #chat-box { /*border: 1px solid #ccc;*/ @@ -58,37 +49,40 @@ overflow-y: scroll; border-bottom-left-radius: 0; border-bottom-right-radius: 0; - height: 75%; + flex-grow: 1; } #chat-input { - width: 100%; - padding: 0.4em 4em 1em 1.2em; - border: 0; color: black; - border-top-left-radius: 0; - border-top-right-radius: 0; - height: 100%; - font-size: 16px; + border: 2px solid #e4a81c; } #chat-online-content { padding: 0; width: 100%; } +.selected-status-row { + background-color: lightgray; +} +.status_last_message { + color: darkgray; + font-size: 0.8em; +} + @media (min-width: 800px) { #chat-container { display: flex; width: 100%; - height: calc(100vh - 3em);; + height: calc(100vh - 3em); border: 1px solid #ccc; /*border-radius: 0 4px 0 0;*/ border-bottom: 0; } #chat-online { margin: 0; + width: 35%; } - .chat-left-panel, .chat-right-panel { - display: block !important; + #chat-area { + flex-grow: 1; } } #chat-input, #chat-log .content-message { @@ -97,14 +91,7 @@ .info-pic { height: 100%; } -.info-circle { - position: absolute; - cx: 12%; - cy: 12%; - r: 12%; - stroke: white; - stroke-width: 1; -} + .info-name { margin-left: 10px; font-size: 2em; @@ -138,29 +125,30 @@ transition: 1.5s ease-in-out; } .status-pic { - height: 1.3em; - width: 1.3em; - border-radius: 0.3em; + height: 32px; + width: 32px; + border-radius: 50%; } .status-container { position: relative; display: inline-flex; + flex: 0 0 auto; } .status-circle { position: absolute; bottom: 0; right: 0; - cx: 18px; - cy: 18px; + cx: 27px; + cy: 27px; r: 4.5px; stroke: white; stroke-width: 1; } .status-row { display: flex; - font-size: 15px; - padding: 0.2em 0.2em 0.2em 1em; - border-radius: 4px; + padding: 15px; + gap: 0.5em; + border-radius: 6px; } .status-row:hover { background: lightgray; @@ -168,6 +156,7 @@ } .status-list { padding: 0; + margin: 0; } .status-section-title { cursor: pointer; @@ -178,6 +167,8 @@ border-radius: 15px; max-width: 70%; width: fit-content; + font-size: 1.05rem; + line-height: 1.3; } .message-text-other { background: #eeeeee; @@ -187,7 +178,12 @@ background: rgb(0, 132, 255); color: white; } - +.chat-input-icon { + color: #045343; +} +.chat-input-icon:hover { + background: lightgray; +} .chat { .active-span { color: #636363; @@ -200,6 +196,7 @@ background-color: darkcyan; border-radius: 2px; padding: 0 0.5em; + align-self: flex-end; } #setting-content { display: none; @@ -225,9 +222,6 @@ @media (max-width: 799px) { #chat-area { - height: 500px; - } - #emoji-button { - display: none; + height: calc(100vh - 120px); } } diff --git a/resources/common.js b/resources/common.js index 488fb33..fabff56 100644 --- a/resources/common.js +++ b/resources/common.js @@ -385,6 +385,13 @@ function onWindowReady() { showTooltip(e.trigger, fallbackMessage(e.action)); }); }); + $('a').click(function() { + $("#loading-bar").show(); + $("#loading-bar").animate({ width: "100%" }, 1500, function() { + $(this).hide(); + $("#loading-bar").css({ width: 0}); + }); + }); } $(function() { @@ -429,4 +436,5 @@ $(function() { $('html').click(function () { $nav_list.hide(); }); + }); \ No newline at end of file diff --git a/resources/darkmode.css b/resources/darkmode.css index bff07e2..cebfd6c 100644 --- a/resources/darkmode.css +++ b/resources/darkmode.css @@ -23,113 +23,113 @@ _______|_______/__/ ____ \__\__|___\__\__|___\__\____ /* User-Agent Style */ html { - background-color: #181a1b !important; + background-color: #141616 !important; } html { color-scheme: dark !important; } html, body, input, textarea, select, button, dialog { - background-color: #181a1b; + background-color: #141616; } html, body, input, textarea, select, button { - border-color: #736b5e; - color: #e8e6e3; + border-color: #5f594e; + color: #c1bfbc; } a { - color: #3391ff; + color: #2a78d4; } table { - border-color: #545b5e; + border-color: #464c4e; } ::placeholder { - color: #b2aba1; + color: #948e86; } input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill { - background-color: #404400 !important; - color: #e8e6e3 !important; + background-color: #353800 !important; + color: #c1bfbc !important; } ::-webkit-scrollbar { - background-color: #202324; - color: #aba499; + background-color: #1b1d1e; + color: #8e887f; } ::-webkit-scrollbar-thumb { - background-color: #454a4d; + background-color: #393d40; } ::-webkit-scrollbar-thumb:hover { - background-color: #575e62; -} -::-webkit-scrollbar-thumb:active { background-color: #484e51; } +::-webkit-scrollbar-thumb:active { + background-color: #3c4143; +} ::-webkit-scrollbar-corner { - background-color: #181a1b; + background-color: #141616; } ::selection { - background-color: #004daa !important; - color: #e8e6e3 !important; + background-color: #00408d !important; + color: #c1bfbc !important; } ::-moz-selection { - background-color: #004daa !important; - color: #e8e6e3 !important; + background-color: #00408d !important; + color: #c1bfbc !important; } /* Invert Style */ .jfk-bubble.gtx-bubble, .captcheck_answer_label > input + img, span#closed_text > img[src^="https://www.gstatic.com/images/branding/googlelogo"], span[data-href^="https://www.hcaptcha.com/"] > #icon, #bit-notification-bar-iframe, ::-webkit-calendar-picker-indicator { - filter: invert(100%) hue-rotate(180deg) contrast(90%) !important; + filter: invert(100%) hue-rotate(180deg) brightness(83%) contrast(90%) !important; } /* Variables Style */ :root { - --darkreader-neutral-background: #131516; - --darkreader-neutral-text: #d8d4cf; - --darkreader-selection-background: #004daa; - --darkreader-selection-text: #e8e6e3; + --darkreader-neutral-background: #101112; + --darkreader-neutral-text: #b3b0ac; + --darkreader-selection-background: #00408d; + --darkreader-selection-text: #c1bfbc; } /* Modified CSS */ :root, [data-md-color-scheme="default"] { --darkreader-bg--md-default-fg-color: rgba(0, 0, 0, 0.87); - --darkreader-text--md-default-fg-color: rgba(232, 230, 227, 0.87); + --darkreader-text--md-default-fg-color: rgba(193, 191, 188, 0.87); --darkreader-bg--md-default-fg-color--light: rgba(0, 0, 0, 0.54); - --darkreader-text--md-default-fg-color--light: rgba(232, 230, 227, 0.54); - --darkreader-border--md-default-fg-color--light: rgba(140, 130, 115, 0.54); + --darkreader-text--md-default-fg-color--light: rgba(193, 191, 188, 0.54); + --darkreader-border--md-default-fg-color--light: rgba(116, 108, 95, 0.54); --darkreader-bg--md-default-fg-color--lighter: rgba(0, 0, 0, 0.32); - --darkreader-text--md-default-fg-color--lighter: rgba(232, 230, 227, 0.32); - --darkreader-border--md-default-fg-color--lighter: rgba(140, 130, 115, 0.32); + --darkreader-text--md-default-fg-color--lighter: rgba(193, 191, 188, 0.32); + --darkreader-border--md-default-fg-color--lighter: rgba(116, 108, 95, 0.32); --darkreader-bg--md-default-fg-color--lightest: rgba(0, 0, 0, 0.07); - --darkreader-text--md-default-fg-color--lightest: rgba(232, 230, 227, 0.07); - --darkreader-border--md-default-fg-color--lightest: rgba(140, 130, 115, 0.07); - --darkreader-bg--md-default-bg-color: #181a1b; - --darkreader-text--md-default-bg-color: #e8e6e3; - --darkreader-border--md-default-bg-color: #303436; - --md-default-bg-color--light: hsla(0,0%,100%,0.7); - --md-default-bg-color--lighter: hsla(0,0%,100%,0.3); - --md-default-bg-color--lightest: hsla(0,0%,100%,0.12); - --darkreader-bg--md-primary-fg-color: #334191; - --darkreader-text--md-primary-fg-color: #6d94cb; - --darkreader-border--md-primary-fg-color: #2f3c86; + --darkreader-text--md-default-fg-color--lightest: rgba(193, 191, 188, 0.07); + --darkreader-border--md-default-fg-color--lightest: rgba(116, 108, 95, 0.07); + --darkreader-bg--md-default-bg-color: #141616; + --darkreader-text--md-default-bg-color: #c1bfbc; + --darkreader-border--md-default-bg-color: #282b2d; + --md-default-bg-color--light: hsla(0,0%,100%,.7); + --md-default-bg-color--lighter: hsla(0,0%,100%,.3); + --md-default-bg-color--lightest: hsla(0,0%,100%,.12); + --darkreader-bg--md-primary-fg-color: #2a3678; + --darkreader-text--md-primary-fg-color: #5a7ba8; + --darkreader-border--md-primary-fg-color: #27326f; --md-primary-fg-color--light: #5d6cc0; - --darkreader-bg--md-primary-fg-color--dark: #263281; - --darkreader-text--md-primary-bg-color: #e8e6e3; - --darkreader-text--md-primary-bg-color--light: rgba(232, 230, 227, 0.7); - --darkreader-bg--md-accent-fg-color: #01189b; - --darkreader-text--md-accent-fg-color: #539bfe; - --darkreader-border--md-accent-fg-color: #011899; - --darkreader-bg--md-accent-fg-color--transparent: rgba(1, 24, 155, 0.1); - --darkreader-bg--md-accent-bg-color: #181a1b; - --darkreader-text--md-accent-bg-color: #e8e6e3; - --md-accent-bg-color--light: hsla(0,0%,100%,0.7); - --darkreader-text--md-code-fg-color: #beb9b0; - --darkreader-bg--md-code-bg-color: #1e2021; - --darkreader-bg--md-code-hl-color: rgba(153, 153, 0, 0.5); - --darkreader-text--md-code-hl-number-color: #d93f3f; - --darkreader-text--md-code-hl-special-color: #ed3774; - --darkreader-text--md-code-hl-function-color: #b159c0; - --darkreader-text--md-code-hl-constant-color: #7561db; - --darkreader-text--md-code-hl-keyword-color: #518ecb; - --darkreader-text--md-code-hl-string-color: #7ee2b0; + --darkreader-bg--md-primary-fg-color--dark: #20296b; + --darkreader-text--md-primary-bg-color: #c1bfbc; + --darkreader-text--md-primary-bg-color--light: rgba(193, 191, 188, 0.7); + --darkreader-bg--md-accent-fg-color: #011481; + --darkreader-text--md-accent-fg-color: #4581d3; + --darkreader-border--md-accent-fg-color: #01147f; + --darkreader-bg--md-accent-fg-color--transparent: rgba(1, 20, 129, 0.1); + --darkreader-bg--md-accent-bg-color: #141616; + --darkreader-text--md-accent-bg-color: #c1bfbc; + --md-accent-bg-color--light: hsla(0,0%,100%,.7); + --darkreader-text--md-code-fg-color: #9e9a92; + --darkreader-bg--md-code-bg-color: #191b1b; + --darkreader-bg--md-code-hl-color: rgba(127, 127, 0, 0.5); + --darkreader-text--md-code-hl-number-color: #b43434; + --darkreader-text--md-code-hl-special-color: #c52e60; + --darkreader-text--md-code-hl-function-color: #934a9f; + --darkreader-text--md-code-hl-constant-color: #6151b6; + --darkreader-text--md-code-hl-keyword-color: #4376a8; + --darkreader-text--md-code-hl-string-color: #69bc92; --darkreader-text--md-code-hl-name-color: var(--darkreader-text--md-code-fg-color); --darkreader-text--md-code-hl-operator-color: var(--darkreader-text--md-default-fg-color--light); --darkreader-text--md-code-hl-punctuation-color: var(--darkreader-text--md-default-fg-color--light); @@ -138,26 +138,26 @@ select:-webkit-autofill { --darkreader-text--md-code-hl-variable-color: var(--darkreader-text--md-default-fg-color--light); --md-typeset-color: var(--md-default-fg-color); --darkreader-text--md-typeset-a-color: var(--darkreader-text--md-primary-fg-color); - --darkreader-bg--md-typeset-mark-color: rgba(153, 153, 0, 0.5); - --darkreader-bg--md-typeset-del-color: rgba(165, 25, 9, 0.15); - --darkreader-bg--md-typeset-ins-color: rgba(9, 170, 90, 0.15); - --darkreader-bg--md-typeset-kbd-color: #1b1d1e; - --darkreader-bg--md-typeset-kbd-accent-color: #181a1b; - --darkreader-bg--md-typeset-kbd-border-color: #404548; - --darkreader-border--md-typeset-table-color: rgba(140, 130, 115, 0.12); + --darkreader-bg--md-typeset-mark-color: rgba(127, 127, 0, 0.5); + --darkreader-bg--md-typeset-del-color: rgba(137, 21, 7, 0.15); + --darkreader-bg--md-typeset-ins-color: rgba(7, 141, 75, 0.15); + --darkreader-bg--md-typeset-kbd-color: #161819; + --darkreader-bg--md-typeset-kbd-accent-color: #141616; + --darkreader-bg--md-typeset-kbd-border-color: #35393c; + --darkreader-border--md-typeset-table-color: rgba(116, 108, 95, 0.12); --darkreader-text--md-admonition-fg-color: var(--darkreader-text--md-default-fg-color); --darkreader-bg--md-admonition-bg-color: var(--darkreader-bg--md-default-bg-color); - --darkreader-text--md-footer-fg-color: #e8e6e3; - --darkreader-text--md-footer-fg-color--light: rgba(232, 230, 227, 0.7); - --darkreader-text--md-footer-fg-color--lighter: rgba(232, 230, 227, 0.3); + --darkreader-text--md-footer-fg-color: #c1bfbc; + --darkreader-text--md-footer-fg-color--light: rgba(193, 191, 188, 0.7); + --darkreader-text--md-footer-fg-color--lighter: rgba(193, 191, 188, 0.3); --darkreader-bg--md-footer-bg-color: rgba(0, 0, 0, 0.87); --darkreader-bg--md-footer-bg-color--dark: rgba(0, 0, 0, 0.32); - --darkreader-bg--md-shadow-z1: 0 0.2rem 0.5rem rgba(0,0,0,0.05), - 0 0 0.05rem rgba(0,0,0,0.1); - --darkreader-bg--md-shadow-z2: 0 0.2rem 0.5rem rgba(0,0,0,0.1), - 0 0 0.05rem rgba(0,0,0,0.25); - --darkreader-bg--md-shadow-z3: 0 0.2rem 0.5rem rgba(0,0,0,0.2), - 0 0 0.05rem rgba(0,0,0,0.35); + --darkreader-bg--md-shadow-z1: 0 0.2rem 0.5rem rgba(0,0,0,.05), + 0 0 0.05rem rgba(0,0,0,.1); + --darkreader-bg--md-shadow-z2: 0 0.2rem 0.5rem rgba(0,0,0,.1), + 0 0 0.05rem rgba(0,0,0,.25); + --darkreader-bg--md-shadow-z3: 0 0.2rem 0.5rem rgba(0,0,0,.2), + 0 0 0.05rem rgba(0,0,0,.35); } .md-icon svg { fill: currentcolor; @@ -188,7 +188,7 @@ body { color: var(--darkreader-text--md-default-fg-color--light); } .md-typeset hr { - border-bottom: 0.05rem solid var(--darkreader-border--md-default-fg-color--lightest); + border-bottom: .05rem solid var(--darkreader-border--md-default-fg-color--lightest); } .md-typeset code, .md-typeset kbd, @@ -197,9 +197,9 @@ body { } .md-typeset kbd { background-color: var(--darkreader-bg--md-typeset-kbd-color); - box-shadow: 0 0.1rem 0 0.05rem var(--darkreader-bg--md-typeset-kbd-border-color), - 0 0.1rem 0 var(--darkreader-bg--md-typeset-kbd-border-color), - 0 -0.1rem 0.2rem var(--darkreader-bg--md-typeset-kbd-accent-color) inset; + box-shadow: 0 .1rem 0 .05rem var(--darkreader-bg--md-typeset-kbd-border-color), + 0 .1rem 0 var(--darkreader-bg--md-typeset-kbd-border-color), + 0 -.1rem .2rem var(--darkreader-bg--md-typeset-kbd-accent-color) inset; color: var(--darkreader-text--md-default-fg-color); } .md-typeset mark { @@ -208,7 +208,7 @@ body { } .md-typeset abbr { text-decoration-color: initial; - border-bottom: 0.05rem dotted var(--darkreader-border--md-default-fg-color--light); + border-bottom: .05rem dotted var(--darkreader-border--md-default-fg-color--light); } @media (hover: none) { .md-typeset abbr[title]:-webkit-any(:focus, :hover)::after { @@ -223,24 +223,24 @@ body { } } .md-typeset blockquote { - border-left: 0.2rem solid var(--darkreader-border--md-default-fg-color--lighter) ; + border-left: .2rem solid var(--darkreader-border--md-default-fg-color--lighter); } [dir="rtl"] .md-typeset blockquote { - border-right: 0.2rem solid var(--darkreader-border--md-default-fg-color--lighter) ; + border-right: .2rem solid var(--darkreader-border--md-default-fg-color--lighter); } .md-typeset blockquote { color: var(--darkreader-text--md-default-fg-color--light); } .md-typeset table:not([class]) { background-color: var(--darkreader-bg--md-default-bg-color); - border: 0.05rem solid var(--darkreader-border--md-typeset-table-color); + border: .05rem solid var(--darkreader-border--md-typeset-table-color); } .md-typeset table:not([class]) td { - border-top: 0.05rem solid var(--darkreader-border--md-typeset-table-color); + border-top: .05rem solid var(--darkreader-border--md-typeset-table-color); } .md-typeset table:not([class]) tbody tr:hover { background-color: rgba(0, 0, 0, 0.04); - box-shadow: 0 0.05rem 0 var(--darkreader-bg--md-default-bg-color) inset; + box-shadow: 0 .05rem 0 var(--darkreader-bg--md-default-bg-color) inset; } .md-typeset table th[role="columnheader"]:hover::after { background-color: var(--darkreader-bg--md-default-fg-color--lighter); @@ -271,7 +271,7 @@ body { outline-color: var(--darkreader-border--md-accent-fg-color); } :root { - --darkreader-bgimg--md-clipboard-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgMjFIOFY3aDExbTAtMkg4YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMWEyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAwLTItMm0tMy00SDRhMiAyIDAgMCAwLTIgMnYxNGgyVjNoMTJWMVoiLz48L3N2Zz4iIC8+PC9zdmc+"); + --darkreader-bgimg--md-clipboard-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgMjFIOFY3aDExbTAtMkg4YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMWEyIDIgMCAwIDAgMi0yVjdhMiAyIDAgMCAwLTItMm0tMy00SDRhMiAyIDAgMCAwLTIgMnYxNGgyVjNoMTJWMVoiLz48L3N2Zz4iIC8+PC9zdmc+"); } .md-clipboard { color: var(--darkreader-text--md-default-fg-color--lightest); @@ -384,7 +384,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { } .md-typeset .md-input { box-shadow: var(--darkreader-bg--md-shadow-z1); - border-bottom: 0.1rem solid var(--darkreader-border--md-default-fg-color--lighter); + border-bottom: .1rem solid var(--darkreader-border--md-default-fg-color--lighter); } .md-typeset .md-input:-webkit-any(:focus, :hover) { border-bottom-color: var(--darkreader-border--md-accent-fg-color); @@ -419,8 +419,8 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { fill: currentcolor; } :root { - --darkreader-bgimg--md-nav-icon--prev: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-nav-icon--next: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-nav-icon--prev: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-nav-icon--next: url("data:image/svg+xml;charset=utf-8,"); --darkreader-bgimg--md-toc-icon: url("data:image/svg+xml;charset=utf-8,"); } .md-nav__title .md-nav__button.md-logo :-webkit-any(img, svg) { @@ -464,7 +464,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { } .md-nav--primary .md-nav__title ~ .md-nav__list { background-color: var(--darkreader-bg--md-default-bg-color); - box-shadow: 0 0.05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; + box-shadow: 0 .05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; } .md-nav--primary .md-nav__title ~ .md-nav__list > :first-child { border-top-color: initial; @@ -474,7 +474,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { color: var(--darkreader-text--md-primary-bg-color); } .md-nav--primary .md-nav__item { - border-top: 0.05rem solid var(--darkreader-border--md-default-fg-color--lightest); + border-top: .05rem solid var(--darkreader-border--md-default-fg-color--lightest); } .md-nav--primary .md-nav__item--active > .md-nav__link { color: var(--darkreader-text--md-typeset-a-color); @@ -503,13 +503,13 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { } @media screen and (min-width: 60em) { .md-nav--secondary .md-nav__title { - box-shadow: 0 0 0.4rem 0.4rem var(--darkreader-bg--md-default-bg-color); + box-shadow: 0 0 .4rem .4rem var(--darkreader-bg--md-default-bg-color); background: var(--darkreader-bg--md-default-bg-color); } } @media screen and (min-width: 76.25em) { .md-nav--primary .md-nav__title { - box-shadow: 0 0 0.4rem 0.4rem var(--darkreader-bg--md-default-bg-color); + box-shadow: 0 0 .4rem .4rem var(--darkreader-bg--md-default-bg-color); background: var(--darkreader-bg--md-default-bg-color); } .md-nav__icon:hover { @@ -519,18 +519,18 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { background-color: currentcolor; } .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { - box-shadow: 0 0 0.4rem 0.4rem var(--darkreader-bg--md-default-bg-color); + box-shadow: 0 0 .4rem .4rem var(--darkreader-bg--md-default-bg-color); background: var(--darkreader-bg--md-default-bg-color); } .md-nav--integrated > .md-nav__list > .md-nav__item--active .md-nav--secondary { - border-left: 0.05rem solid var(--darkreader-border--md-primary-fg-color) ; + border-left: .05rem solid var(--darkreader-border--md-primary-fg-color); } [dir="rtl"] .md-nav--integrated > .md-nav__list > .md-nav__item--active .md-nav--secondary { - border-right: 0.05rem solid var(--darkreader-border--md-primary-fg-color) ; + border-right: .05rem solid var(--darkreader-border--md-primary-fg-color); } } :root { - --darkreader-bgimg--md-search-result-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-search-result-icon: url("data:image/svg+xml;charset=utf-8,"); } @media screen and (max-width: 59.9375em) { .md-search__overlay { @@ -551,7 +551,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { background-color: rgba(0, 0, 0, 0.26); } .md-search__form:hover { - background-color: rgba(24, 26, 27, 0.12); + background-color: rgba(20, 22, 22, 0.12); } } [data-md-toggle="search"]:checked ~ .md-header .md-search__form { @@ -618,7 +618,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { list-style-image: initial; } .md-search-result__item { - box-shadow: 0 -0.05rem var(--darkreader-bg--md-default-fg-color--lightest); + box-shadow: 0 -.05rem var(--darkreader-bg--md-default-fg-color--lightest); } .md-search-result__item:first-child { box-shadow: none; @@ -704,10 +704,10 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { } } :root { - --darkreader-bgimg--md-source-forks-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01IDMuMjVhLjc1Ljc1IDAgMSAxLTEuNSAwIC43NS43NSAwIDAgMSAxLjUgMHptMCAyLjEyMmEyLjI1IDIuMjUgMCAxIDAtMS41IDB2Ljg3OEEyLjI1IDIuMjUgMCAwIDAgNS43NSA4LjVoMS41djIuMTI4YTIuMjUxIDIuMjUxIDAgMSAwIDEuNSAwVjguNWgxLjVhMi4yNSAyLjI1IDAgMCAwIDIuMjUtMi4yNXYtLjg3OGEyLjI1IDIuMjUgMCAxIDAtMS41IDB2Ljg3OGEuNzUuNzUgMCAwIDEtLjc1Ljc1aC00LjVBLjc1Ljc1IDAgMCAxIDUgNi4yNXYtLjg3OHptMy43NSA3LjM3OGEuNzUuNzUgMCAxIDEtMS41IDAgLjc1Ljc1IDAgMCAxIDEuNSAwem0zLTguNzVhLjc1Ljc1IDAgMSAwIDAtMS41Ljc1Ljc1IDAgMCAwIDAgMS41eiIvPjwvc3ZnPiIgLz48L3N2Zz4="); - --darkreader-bgimg--md-source-repositories-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDIuNUEyLjUgMi41IDAgMCAxIDQuNSAwaDguNzVhLjc1Ljc1IDAgMCAxIC43NS43NXYxMi41YS43NS43NSAwIDAgMS0uNzUuNzVoLTIuNWEuNzUuNzUgMCAxIDEgMC0xLjVoMS43NXYtMmgtOGExIDEgMCAwIDAtLjcxNCAxLjcuNzUuNzUgMCAwIDEtMS4wNzIgMS4wNUEyLjQ5NSAyLjQ5NSAwIDAgMSAyIDExLjV2LTl6bTEwLjUtMVY5aC04Yy0uMzU2IDAtLjY5NC4wNzQtMSAuMjA4VjIuNWExIDEgMCAwIDEgMS0xaDh6TTUgMTIuMjV2My4yNWEuMjUuMjUgMCAwIDAgLjQuMmwxLjQ1LTEuMDg3YS4yNS4yNSAwIDAgMSAuMyAwTDguNiAxNS43YS4yNS4yNSAwIDAgMCAuNC0uMnYtMy4yNWEuMjUuMjUgMCAwIDAtLjI1LS4yNWgtMy41YS4yNS4yNSAwIDAgMC0uMjUuMjV6Ii8+PC9zdmc+IiAvPjwvc3ZnPg=="); - --darkreader-bgimg--md-source-stars-icon: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-source-version-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yLjUgNy43NzVWMi43NWEuMjUuMjUgMCAwIDEgLjI1LS4yNWg1LjAyNWEuMjUuMjUgMCAwIDEgLjE3Ny4wNzNsNi4yNSA2LjI1YS4yNS4yNSAwIDAgMSAwIC4zNTRsLTUuMDI1IDUuMDI1YS4yNS4yNSAwIDAgMS0uMzU0IDBsLTYuMjUtNi4yNWEuMjUuMjUgMCAwIDEtLjA3My0uMTc3em0tMS41IDBWMi43NUMxIDEuNzg0IDEuNzg0IDEgMi43NSAxaDUuMDI1Yy40NjQgMCAuOTEuMTg0IDEuMjM4LjUxM2w2LjI1IDYuMjVhMS43NSAxLjc1IDAgMCAxIDAgMi40NzRsLTUuMDI2IDUuMDI2YTEuNzUgMS43NSAwIDAgMS0yLjQ3NCAwbC02LjI1LTYuMjVBMS43NSAxLjc1IDAgMCAxIDEgNy43NzV6TTYgNWExIDEgMCAxIDAgMCAyIDEgMSAwIDAgMCAwLTJ6Ii8+PC9zdmc+IiAvPjwvc3ZnPg=="); + --darkreader-bgimg--md-source-forks-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01IDMuMjVhLjc1Ljc1IDAgMSAxLTEuNSAwIC43NS43NSAwIDAgMSAxLjUgMHptMCAyLjEyMmEyLjI1IDIuMjUgMCAxIDAtMS41IDB2Ljg3OEEyLjI1IDIuMjUgMCAwIDAgNS43NSA4LjVoMS41djIuMTI4YTIuMjUxIDIuMjUxIDAgMSAwIDEuNSAwVjguNWgxLjVhMi4yNSAyLjI1IDAgMCAwIDIuMjUtMi4yNXYtLjg3OGEyLjI1IDIuMjUgMCAxIDAtMS41IDB2Ljg3OGEuNzUuNzUgMCAwIDEtLjc1Ljc1aC00LjVBLjc1Ljc1IDAgMCAxIDUgNi4yNXYtLjg3OHptMy43NSA3LjM3OGEuNzUuNzUgMCAxIDEtMS41IDAgLjc1Ljc1IDAgMCAxIDEuNSAwem0zLTguNzVhLjc1Ljc1IDAgMSAwIDAtMS41Ljc1Ljc1IDAgMCAwIDAgMS41eiIvPjwvc3ZnPiIgLz48L3N2Zz4="); + --darkreader-bgimg--md-source-repositories-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDIuNUEyLjUgMi41IDAgMCAxIDQuNSAwaDguNzVhLjc1Ljc1IDAgMCAxIC43NS43NXYxMi41YS43NS43NSAwIDAgMS0uNzUuNzVoLTIuNWEuNzUuNzUgMCAxIDEgMC0xLjVoMS43NXYtMmgtOGExIDEgMCAwIDAtLjcxNCAxLjcuNzUuNzUgMCAwIDEtMS4wNzIgMS4wNUEyLjQ5NSAyLjQ5NSAwIDAgMSAyIDExLjV2LTl6bTEwLjUtMVY5aC04Yy0uMzU2IDAtLjY5NC4wNzQtMSAuMjA4VjIuNWExIDEgMCAwIDEgMS0xaDh6TTUgMTIuMjV2My4yNWEuMjUuMjUgMCAwIDAgLjQuMmwxLjQ1LTEuMDg3YS4yNS4yNSAwIDAgMSAuMyAwTDguNiAxNS43YS4yNS4yNSAwIDAgMCAuNC0uMnYtMy4yNWEuMjUuMjUgMCAwIDAtLjI1LS4yNWgtMy41YS4yNS4yNSAwIDAgMC0uMjUuMjV6Ii8+PC9zdmc+IiAvPjwvc3ZnPg=="); + --darkreader-bgimg--md-source-stars-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-source-version-icon: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yLjUgNy43NzVWMi43NWEuMjUuMjUgMCAwIDEgLjI1LS4yNWg1LjAyNWEuMjUuMjUgMCAwIDEgLjE3Ny4wNzNsNi4yNSA2LjI1YS4yNS4yNSAwIDAgMSAwIC4zNTRsLTUuMDI1IDUuMDI1YS4yNS4yNSAwIDAgMS0uMzU0IDBsLTYuMjUtNi4yNWEuMjUuMjUgMCAwIDEtLjA3My0uMTc3em0tMS41IDBWMi43NUMxIDEuNzg0IDEuNzg0IDEgMi43NSAxaDUuMDI1Yy40NjQgMCAuOTEuMTg0IDEuMjM4LjUxM2w2LjI1IDYuMjVhMS43NSAxLjc1IDAgMCAxIDAgMi40NzRsLTUuMDI2IDUuMDI2YTEuNzUgMS43NSAwIDAgMS0yLjQ3NCAwbC02LjI1LTYuMjVBMS43NSAxLjc1IDAgMCAxIDEgNy43NzV6TTYgNWExIDEgMCAxIDAgMCAyIDEgMSAwIDAgMCAwLTJ6Ii8+PC9zdmc+IiAvPjwvc3ZnPg=="); } .md-source { outline-color: var(--darkreader-border--md-accent-fg-color); @@ -734,7 +734,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { color: inherit; } :root { - --darkreader-bgimg--md-tag-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-tag-icon: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset .md-tag { background: var(--darkreader-bg--md-default-fg-color--lightest); @@ -767,7 +767,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { color: var(--darkreader-text--md-default-fg-color); } :is(.focus-visible > .md-tooltip, .md-tooltip:target) { - outline: var(--darkreader-border--md-accent-fg-color) auto ; + outline: var(--darkreader-border--md-accent-fg-color) auto; } .md-annotation { outline-color: initial; @@ -776,13 +776,13 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { outline-color: initial; } .md-annotation .md-annotation__index { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .md-annotation .md-annotation__index:-webkit-any(:focus, :hover) { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .md-annotation .md-annotation__index:is(:focus, :hover) { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .md-annotation__index::after { background-color: var(--darkreader-bg--md-default-fg-color--lighter); @@ -808,7 +808,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { color: var(--darkreader-text--md-accent-bg-color); } :root { - --darkreader-bgimg--md-version-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-version-icon: url("data:image/svg+xml;charset=utf-8,"); } .md-version__current { color: inherit; @@ -835,329 +835,329 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { background-color: var(--darkreader-bg--md-default-fg-color--lightest); } :root { - --darkreader-bgimg--md-admonition-icon--note: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--abstract: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--note: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--abstract: url("data:image/svg+xml;charset=utf-8,"); --darkreader-bgimg--md-admonition-icon--info: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--tip: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--success: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--question: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--tip: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--success: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--question: url("data:image/svg+xml;charset=utf-8,"); --darkreader-bgimg--md-admonition-icon--warning: url("data:image/svg+xml;charset=utf-8,"); --darkreader-bgimg--md-admonition-icon--failure: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--danger: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--bug: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-admonition-icon--example: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--danger: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--bug: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-admonition-icon--example: url("data:image/svg+xml;charset=utf-8,"); --darkreader-bgimg--md-admonition-icon--quote: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset .admonition, .md-typeset details { background-color: var(--darkreader-bg--md-admonition-bg-color); - border-color: rgb(0, 59, 158); + border-color: rgb(0, 49, 131); box-shadow: var(--darkreader-bg--md-shadow-z1); color: var(--darkreader-text--md-admonition-fg-color); } .md-typeset .admonition-title, .md-typeset summary { - background-color: rgba(0, 61, 163, 0.1); + background-color: rgba(0, 51, 135, 0.1); border-color: initial; } .md-typeset .admonition-title::before, .md-typeset summary::before { - background-color: rgb(73, 165, 255); + background-color: rgb(61, 137, 212); } .md-typeset .admonition-title code, .md-typeset summary code { - box-shadow: 0 0 0 0.05rem var(--darkreader-bg--md-default-fg-color--lightest); + box-shadow: 0 0 0 .05rem var(--darkreader-bg--md-default-fg-color--lightest); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.note) { - border-color: rgb(0, 59, 158); + border-color: rgb(0, 49, 131); } .md-typeset :is(.admonition, details):is(.note) { - border-color: rgb(0, 59, 158); + border-color: rgb(0, 49, 131); } .md-typeset :-webkit-any(.note) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(0, 61, 163, 0.1); + background-color: rgba(0, 51, 135, 0.1); } .md-typeset :is(.note) > :is(.admonition-title, summary) { - background-color: rgba(0, 61, 163, 0.1); + background-color: rgba(0, 51, 135, 0.1); } .md-typeset :-webkit-any(.note) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(73, 165, 255); + background-color: rgb(61, 137, 212); } .md-typeset :is(.note) > :is(.admonition-title, summary)::before { - background-color: rgb(73, 165, 255); + background-color: rgb(61, 137, 212); } .md-typeset :-webkit-any(.note) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(73, 165, 255); + color: rgb(61, 137, 212); } .md-typeset :is(.note) > :is(.admonition-title, summary)::after { - color: rgb(73, 165, 255); + color: rgb(61, 137, 212); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.abstract, .summary, .tldr) { - border-color: rgb(0, 123, 179); + border-color: rgb(0, 102, 149); } .md-typeset :is(.admonition, details):is(.abstract, .summary, .tldr) { - border-color: rgb(0, 123, 179); + border-color: rgb(0, 102, 149); } .md-typeset :-webkit-any(.abstract, .summary, .tldr) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(0, 141, 204, 0.1); + background-color: rgba(0, 117, 169, 0.1); } .md-typeset :is(.abstract, .summary, .tldr) > :is(.admonition-title, summary) { - background-color: rgba(0, 141, 204, 0.1); + background-color: rgba(0, 117, 169, 0.1); } .md-typeset :-webkit-any(.abstract, .summary, .tldr) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(26, 184, 255); + background-color: rgb(22, 153, 212); } .md-typeset :is(.abstract, .summary, .tldr) > :is(.admonition-title, summary)::before { - background-color: rgb(26, 184, 255); + background-color: rgb(22, 153, 212); } .md-typeset :-webkit-any(.abstract, .summary, .tldr) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(26, 184, 255); + color: rgb(22, 153, 212); } .md-typeset :is(.abstract, .summary, .tldr) > :is(.admonition-title, summary)::after { - color: rgb(26, 184, 255); + color: rgb(22, 153, 212); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.info, .todo) { - border-color: rgb(0, 166, 191); + border-color: rgb(0, 138, 159); } .md-typeset :is(.admonition, details):is(.info, .todo) { - border-color: rgb(0, 166, 191); + border-color: rgb(0, 138, 159); } .md-typeset :-webkit-any(.info, .todo) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(0, 147, 170, 0.1); + background-color: rgba(0, 122, 141, 0.1); } .md-typeset :is(.info, .todo) > :is(.admonition-title, summary) { - background-color: rgba(0, 147, 170, 0.1); + background-color: rgba(0, 122, 141, 0.1); } .md-typeset :-webkit-any(.info, .todo) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(56, 229, 255); + background-color: rgb(46, 190, 212); } .md-typeset :is(.info, .todo) > :is(.admonition-title, summary)::before { - background-color: rgb(56, 229, 255); + background-color: rgb(46, 190, 212); } .md-typeset :-webkit-any(.info, .todo) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(56, 229, 255); + color: rgb(46, 190, 212); } .md-typeset :is(.info, .todo) > :is(.admonition-title, summary)::after { - color: rgb(56, 229, 255); + color: rgb(46, 190, 212); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.tip, .hint, .important) { - border-color: rgb(0, 198, 171); + border-color: rgb(0, 164, 142); } .md-typeset :is(.admonition, details):is(.tip, .hint, .important) { - border-color: rgb(0, 198, 171); + border-color: rgb(0, 164, 142); } .md-typeset :-webkit-any(.tip, .hint, .important) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(0, 153, 132, 0.1); + background-color: rgba(0, 127, 110, 0.1); } .md-typeset :is(.tip, .hint, .important) > :is(.admonition-title, summary) { - background-color: rgba(0, 153, 132, 0.1); + background-color: rgba(0, 127, 110, 0.1); } .md-typeset :-webkit-any(.tip, .hint, .important) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(70, 255, 230); + background-color: rgb(58, 212, 191); } .md-typeset :is(.tip, .hint, .important) > :is(.admonition-title, summary)::before { - background-color: rgb(70, 255, 230); + background-color: rgb(58, 212, 191); } .md-typeset :-webkit-any(.tip, .hint, .important) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(70, 255, 230); + color: rgb(58, 212, 191); } .md-typeset :is(.tip, .hint, .important) > :is(.admonition-title, summary)::after { - color: rgb(70, 255, 230); + color: rgb(58, 212, 191); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.success, .check, .done) { - border-color: rgb(0, 195, 81); + border-color: rgb(0, 162, 67); } .md-typeset :is(.admonition, details):is(.success, .check, .done) { - border-color: rgb(0, 195, 81); + border-color: rgb(0, 162, 67); } .md-typeset :-webkit-any(.success, .check, .done) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(0, 160, 66, 0.1); + background-color: rgba(0, 133, 55, 0.1); } .md-typeset :is(.success, .check, .done) > :is(.admonition-title, summary) { - background-color: rgba(0, 160, 66, 0.1); + background-color: rgba(0, 133, 55, 0.1); } .md-typeset :-webkit-any(.success, .check, .done) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(64, 255, 143); + background-color: rgb(53, 212, 119); } .md-typeset :is(.success, .check, .done) > :is(.admonition-title, summary)::before { - background-color: rgb(64, 255, 143); + background-color: rgb(53, 212, 119); } .md-typeset :-webkit-any(.success, .check, .done) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(64, 255, 143); + color: rgb(53, 212, 119); } .md-typeset :is(.success, .check, .done) > :is(.admonition-title, summary)::after { - color: rgb(64, 255, 143); + color: rgb(53, 212, 119); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.question, .help, .faq) { - border-color: rgb(75, 165, 17); + border-color: rgb(62, 137, 14); } .md-typeset :is(.admonition, details):is(.question, .help, .faq) { - border-color: rgb(75, 165, 17); + border-color: rgb(62, 137, 14); } .md-typeset :-webkit-any(.question, .help, .faq) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(80, 177, 18, 0.1); + background-color: rgba(66, 147, 15, 0.1); } .md-typeset :is(.question, .help, .faq) > :is(.admonition-title, summary) { - background-color: rgba(80, 177, 18, 0.1); + background-color: rgba(66, 147, 15, 0.1); } .md-typeset :-webkit-any(.question, .help, .faq) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(124, 234, 54); + background-color: rgb(103, 194, 45); } .md-typeset :is(.question, .help, .faq) > :is(.admonition-title, summary)::before { - background-color: rgb(124, 234, 54); + background-color: rgb(103, 194, 45); } .md-typeset :-webkit-any(.question, .help, .faq) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(124, 234, 54); + color: rgb(103, 194, 45); } .md-typeset :is(.question, .help, .faq) > :is(.admonition-title, summary)::after { - color: rgb(124, 234, 54); + color: rgb(103, 194, 45); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.warning, .caution, .attention) { - border-color: rgb(179, 102, 0); + border-color: rgb(149, 85, 0); } .md-typeset :is(.admonition, details):is(.warning, .caution, .attention) { - border-color: rgb(179, 102, 0); + border-color: rgb(149, 85, 0); } .md-typeset :-webkit-any(.warning, .caution, .attention) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(204, 116, 0, 0.1); + background-color: rgba(169, 96, 0, 0.1); } .md-typeset :is(.warning, .caution, .attention) > :is(.admonition-title, summary) { - background-color: rgba(204, 116, 0, 0.1); + background-color: rgba(169, 96, 0, 0.1); } .md-typeset :-webkit-any(.warning, .caution, .attention) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(255, 156, 26); + background-color: rgb(212, 129, 22); } .md-typeset :is(.warning, .caution, .attention) > :is(.admonition-title, summary)::before { - background-color: rgb(255, 156, 26); + background-color: rgb(212, 129, 22); } .md-typeset :-webkit-any(.warning, .caution, .attention) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(255, 156, 26); + color: rgb(212, 129, 22); } .md-typeset :is(.warning, .caution, .attention) > :is(.admonition-title, summary)::after { - color: rgb(255, 156, 26); + color: rgb(212, 129, 22); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.failure, .fail, .missing) { - border-color: rgb(154, 0, 0); + border-color: rgb(128, 0, 0); } .md-typeset :is(.admonition, details):is(.failure, .fail, .missing) { - border-color: rgb(154, 0, 0); + border-color: rgb(128, 0, 0); } .md-typeset :-webkit-any(.failure, .fail, .missing) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(155, 0, 0, 0.1); + background-color: rgba(129, 0, 0, 0.1); } .md-typeset :is(.failure, .fail, .missing) > :is(.admonition-title, summary) { - background-color: rgba(155, 0, 0, 0.1); + background-color: rgba(129, 0, 0, 0.1); } .md-typeset :-webkit-any(.failure, .fail, .missing) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(255, 83, 83); + background-color: rgb(212, 69, 69); } .md-typeset :is(.failure, .fail, .missing) > :is(.admonition-title, summary)::before { - background-color: rgb(255, 83, 83); + background-color: rgb(212, 69, 69); } .md-typeset :-webkit-any(.failure, .fail, .missing) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(255, 83, 83); + color: rgb(212, 69, 69); } .md-typeset :is(.failure, .fail, .missing) > :is(.admonition-title, summary)::after { - color: rgb(255, 83, 83); + color: rgb(212, 69, 69); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.danger, .error) { - border-color: rgb(172, 0, 33); + border-color: rgb(143, 0, 27); } .md-typeset :is(.admonition, details):is(.danger, .error) { - border-color: rgb(172, 0, 33); + border-color: rgb(143, 0, 27); } .md-typeset :-webkit-any(.danger, .error) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(190, 0, 37, 0.1); + background-color: rgba(158, 0, 31, 0.1); } .md-typeset :is(.danger, .error) > :is(.admonition-title, summary) { - background-color: rgba(190, 0, 37, 0.1); + background-color: rgba(158, 0, 31, 0.1); } .md-typeset :-webkit-any(.danger, .error) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(255, 42, 83); + background-color: rgb(212, 35, 69); } .md-typeset :is(.danger, .error) > :is(.admonition-title, summary)::before { - background-color: rgb(255, 42, 83); + background-color: rgb(212, 35, 69); } .md-typeset :-webkit-any(.danger, .error) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(255, 42, 83); + color: rgb(212, 35, 69); } .md-typeset :is(.danger, .error) > :is(.admonition-title, summary)::after { - color: rgb(255, 42, 83); + color: rgb(212, 35, 69); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.bug) { - border-color: rgb(182, 0, 64); + border-color: rgb(151, 0, 53); } .md-typeset :is(.admonition, details):is(.bug) { - border-color: rgb(182, 0, 64); + border-color: rgb(151, 0, 53); } .md-typeset :-webkit-any(.bug) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(196, 0, 70, 0.1); + background-color: rgba(163, 0, 58, 0.1); } .md-typeset :is(.bug) > :is(.admonition-title, summary) { - background-color: rgba(196, 0, 70, 0.1); + background-color: rgba(163, 0, 58, 0.1); } .md-typeset :-webkit-any(.bug) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(255, 33, 112); + background-color: rgb(212, 27, 93); } .md-typeset :is(.bug) > :is(.admonition-title, summary)::before { - background-color: rgb(255, 33, 112); + background-color: rgb(212, 27, 93); } .md-typeset :-webkit-any(.bug) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(255, 33, 112); + color: rgb(212, 27, 93); } .md-typeset :is(.bug) > :is(.admonition-title, summary)::after { - color: rgb(255, 33, 112); + color: rgb(212, 27, 93); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.example) { - border-color: rgb(41, 0, 155); + border-color: rgb(34, 0, 129); } .md-typeset :is(.admonition, details):is(.example) { - border-color: rgb(41, 0, 155); + border-color: rgb(34, 0, 129); } .md-typeset :-webkit-any(.example) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(42, 0, 158, 0.1); + background-color: rgba(35, 0, 131, 0.1); } .md-typeset :is(.example) > :is(.admonition-title, summary) { - background-color: rgba(42, 0, 158, 0.1); + background-color: rgba(35, 0, 131, 0.1); } .md-typeset :-webkit-any(.example) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(126, 79, 255); + background-color: rgb(105, 66, 212); } .md-typeset :is(.example) > :is(.admonition-title, summary)::before { - background-color: rgb(126, 79, 255); + background-color: rgb(105, 66, 212); } .md-typeset :-webkit-any(.example) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(126, 79, 255); + color: rgb(105, 66, 212); } .md-typeset :is(.example) > :is(.admonition-title, summary)::after { - color: rgb(126, 79, 255); + color: rgb(105, 66, 212); } .md-typeset :-webkit-any(.admonition, details):-webkit-any(.quote, .cite) { - border-color: rgb(75, 82, 85); + border-color: rgb(62, 68, 71); } .md-typeset :is(.admonition, details):is(.quote, .cite) { - border-color: rgb(75, 82, 85); + border-color: rgb(62, 68, 71); } .md-typeset :-webkit-any(.quote, .cite) > :-webkit-any(.admonition-title, summary) { - background-color: rgba(79, 85, 89, 0.1); + background-color: rgba(66, 71, 74, 0.1); } .md-typeset :is(.quote, .cite) > :is(.admonition-title, summary) { - background-color: rgba(79, 85, 89, 0.1); + background-color: rgba(66, 71, 74, 0.1); } .md-typeset :-webkit-any(.quote, .cite) > :-webkit-any(.admonition-title, summary)::before { - background-color: rgb(171, 163, 152); + background-color: rgb(142, 135, 126); } .md-typeset :is(.quote, .cite) > :is(.admonition-title, summary)::before { - background-color: rgb(171, 163, 152); + background-color: rgb(142, 135, 126); } .md-typeset :-webkit-any(.quote, .cite) > :-webkit-any(.admonition-title, summary)::after { - color: rgb(171, 163, 152); + color: rgb(142, 135, 126); } .md-typeset :is(.quote, .cite) > :is(.admonition-title, summary)::after { - color: rgb(171, 163, 152); + color: rgb(142, 135, 126); } :root { - --darkreader-bgimg--md-footnotes-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-footnotes-icon: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset .footnote { color: var(--darkreader-text--md-default-fg-color--light); @@ -1219,7 +1219,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { box-shadow: none; } :root { - --darkreader-bgimg--md-details-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-details-icon: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset details:not([open]) { box-shadow: none; @@ -1326,18 +1326,18 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { } .highlight span.filename { background-color: var(--darkreader-bg--md-code-bg-color); - border-bottom: 0.05rem solid var(--darkreader-border--md-default-fg-color--lightest); + border-bottom: .05rem solid var(--darkreader-border--md-default-fg-color--lightest); } .highlight [data-linenos]::before { background-color: var(--darkreader-bg--md-code-bg-color); - box-shadow: -0.05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; + box-shadow: -.05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; color: var(--darkreader-text--md-default-fg-color--light); } .highlighttable .linenos { background-color: var(--darkreader-bg--md-code-bg-color); } .highlighttable .linenodiv { - box-shadow: -0.05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; + box-shadow: -.05rem 0 var(--darkreader-bg--md-default-fg-color--lightest) inset; } .highlighttable .linenodiv pre { color: var(--darkreader-text--md-default-fg-color--light); @@ -1349,14 +1349,14 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { color: var(--darkreader-text--md-default-fg-color--light); } :root { - --darkreader-bgimg--md-tabbed-icon--prev: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-tabbed-icon--next: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-tabbed-icon--prev: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-tabbed-icon--next: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset .tabbed-set > input:target { --md-scroll-offset: 0.625em; } .md-typeset .tabbed-labels { - box-shadow: 0 -0.05rem var(--darkreader-bg--md-default-fg-color--lightest) inset; + box-shadow: 0 -.05rem var(--darkreader-bg--md-default-fg-color--lightest) inset; } @media screen { .js .md-typeset .tabbed-labels::before { @@ -1451,7 +1451,7 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { .no-js .md-typeset .tabbed-set > input:nth-child(7):checked ~ .tabbed-labels > :nth-child(7), .no-js .md-typeset .tabbed-set > input:nth-child(8):checked ~ .tabbed-labels > :nth-child(8), .no-js .md-typeset .tabbed-set > input:nth-child(9):checked ~ .tabbed-labels > :nth-child(9) { - border-color: var(--darkreader-border--md-accent-fg-color) ; + border-color: var(--darkreader-border--md-accent-fg-color); } } .md-typeset .tabbed-set > input:first-child.focus-visible ~ .tabbed-labels > :first-child, @@ -1477,14 +1477,14 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { background-color: var(--darkreader-bg--md-accent-fg-color--transparent); } :root { - --darkreader-bgimg--md-tasklist-icon: url("data:image/svg+xml;charset=utf-8,"); - --darkreader-bgimg--md-tasklist-icon--checked: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-tasklist-icon: url("data:image/svg+xml;charset=utf-8,"); + --darkreader-bgimg--md-tasklist-icon--checked: url("data:image/svg+xml;charset=utf-8,"); } .md-typeset .task-list-indicator::before { background-color: var(--darkreader-bg--md-default-fg-color--lightest); } .md-typeset [type="checkbox"]:checked + .task-list-indicator::before { - background-color: rgb(43, 255, 152); + background-color: rgb(36, 212, 126); } :root > * { --md-mermaid-font-family: var(--md-text-font-family), @@ -1496,59 +1496,65 @@ html .md-footer-meta.md-typeset a:is(:focus, :hover) { --md-mermaid-label-fg-color: var(--md-code-fg-color); } a { - color: rgb(94, 165, 234); + color: rgb(78, 137, 194); } a:hover { - color: rgb(102, 177, 250); + color: rgb(85, 147, 207); } a:active { - color: rgb(255, 180, 29); + color: rgb(212, 149, 24); } * { -webkit-tap-highlight-color: transparent; } table.sortable thead { - background-color: rgb(34, 37, 38); - color: rgb(168, 160, 149); + background-color: rgb(28, 31, 32); + color: rgb(139, 133, 124); } hr { border-top-color: initial; border-right-color: initial; border-left-color: initial; - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } .dashed { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } .form-area { background-image: initial; - background-color: rgb(27, 29, 30); - border-color: rgb(62, 68, 70); + background-color: rgb(22, 24, 25); + border-color: rgb(51, 56, 58); } footer { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } body { background-image: initial; - background-color: rgb(27, 29, 30); - color: rgb(232, 230, 227); + background-color: rgb(22, 24, 25); + color: rgb(193, 191, 188); } header { background-image: initial; - background-color: rgb(13, 14, 14); - color: rgb(178, 172, 162); + background-color: rgb(11, 12, 12); + color: rgb(148, 143, 134); } #user-links { - color: rgb(176, 170, 159); + color: rgb(146, 141, 132); +} +#user-links > ul > li > span:hover { + border-top-color: rgb(165, 58, 7); + color: rgb(193, 191, 188); + background-image: initial; + background-color: rgba(20, 22, 22, 0.25); } #nav-shadow { - background-image: linear-gradient(rgb(49, 53, 55), + background-image: linear-gradient(rgb(41, 44, 46), rgba(0, 0, 0, 0)); background-color: initial; } #nav-container { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } nav ul { list-style-image: initial; @@ -1556,7 +1562,7 @@ nav ul { background-color: transparent; } nav ul li { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } nav ul li.home-nav-element a:hover { border-bottom-color: initial; @@ -1564,44 +1570,44 @@ nav ul li.home-nav-element a:hover { nav ul li a, nav ul li button { text-decoration-color: initial; - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); border-top-color: transparent; border-bottom-color: transparent; } nav ul li a:link, nav ul li button:link { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } nav ul li a:hover, nav ul li button:hover { - border-top-color: rgb(199, 70, 8); - color: rgb(232, 230, 227); + border-top-color: rgb(165, 58, 7); + color: rgb(193, 191, 188); background-image: initial; - background-color: rgba(24, 26, 27, 0.25); + background-color: rgba(20, 22, 22, 0.25); } nav ul li a.active, nav ul li button.active { - border-top-color: rgb(199, 70, 8); - color: rgb(249, 146, 97); + border-top-color: rgb(165, 58, 7); + color: rgb(207, 121, 81); background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } nav ul li ul { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); box-shadow: rgba(0, 0, 0, 0.4) 2px 2px 4px; } nav ul li ul li:hover { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } nav ul li ul li a { - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } nav ul li ul li a, nav ul li ul li button { - border-left-color: rgb(140, 130, 115); + border-left-color: rgb(116, 108, 95); } nav ul li button { background-image: none; @@ -1614,78 +1620,78 @@ nav ul li.home-nav-element a:hover { background-color: transparent; } nav .nav-divider { - border-right-color: rgba(48, 52, 54, 0.15); + border-right-color: rgba(40, 43, 45, 0.15); } hr { - color: rgba(232, 230, 227, 0.2); + color: rgba(193, 191, 188, 0.2); } #content .title { - color: rgb(199, 194, 187); + color: rgb(165, 161, 155); } footer { - border-top-color: rgb(62, 68, 70); + border-top-color: rgb(51, 56, 58); background-image: initial; - background-color: rgb(34, 37, 38); + background-color: rgb(28, 31, 32); } a { text-decoration-color: initial; } noscript #noscript { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); background-image: initial; - background-color: rgb(139, 0, 0); + background-color: rgb(115, 0, 0); } #announcement { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); background-image: initial; - background-color: rgb(139, 0, 0); + background-color: rgb(115, 0, 0); } #announcement a { - color: rgb(255, 174, 26); + color: rgb(212, 144, 22); } .time { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } #form-errors, .form-errors { background-image: initial; - background-color: rgba(204, 0, 0, 0.3); - border-color: rgb(179, 0, 0); + background-color: rgba(169, 0, 0, 0.3); + border-color: rgb(149, 0, 0); } #nav-placeholder { background-image: initial; - background-color: rgb(24, 26, 27); - border-right-color: rgb(62, 68, 70); - border-left-color: rgb(62, 68, 70); + background-color: rgb(20, 22, 22); + border-right-color: rgb(51, 56, 58); + border-left-color: rgb(51, 56, 58); } #contest-info a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #contest-info-main { - border-left-color: rgb(48, 52, 54); + border-left-color: rgb(40, 43, 45); background-image: initial; background-color: rgba(0, 0, 0, 0.77); - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .contest-info-toggle-mode-on { background-image: initial; - background-color: rgba(0, 164, 0, 0.57); + background-color: rgba(0, 136, 0, 0.57); } .contest-info-toggle-mode-on:hover { background-image: initial; - background-color: rgba(0, 164, 0, 0.97); + background-color: rgba(0, 136, 0, 0.97); } .contest-info-toggle-mode-off { background-image: initial; - background-color: rgba(204, 0, 0, 0.57); + background-color: rgba(169, 0, 0, 0.57); } .contest-info-toggle-mode-off:hover { background-image: initial; - background-color: rgba(204, 0, 0, 0.97); + background-color: rgba(169, 0, 0, 0.97); } #page-container { - border-right-color: rgb(62, 68, 70); - border-left-color: rgb(62, 68, 70); + border-right-color: rgb(51, 56, 58); + border-left-color: rgb(51, 56, 58); } .MathJax:focus { outline-color: initial; @@ -1698,109 +1704,112 @@ noscript #noscript { } @media (max-width: 799px) { #navicon { - color: rgb(129, 175, 255); + color: rgb(107, 145, 212); } #navicon.hover { - color: rgb(80, 184, 254); - text-shadow: rgb(24, 26, 27) 0px 0px 5px; + color: rgb(66, 153, 211); + text-shadow: rgb(20, 22, 22) 0px 0px 5px; } #nav-list { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); box-shadow: none; border-color: initial; } } #notification { - color: rgb(164, 192, 217); + color: rgb(136, 159, 180); } #notification:hover { - color: rgb(178, 171, 161); + color: rgb(148, 142, 134); } #chat-icon { - color: rgb(87, 225, 217); + color: rgb(72, 187, 180); } #chat-icon:hover { - color: rgb(200, 196, 189); + color: rgb(166, 163, 157); } #nav-lang-icon { - color: rgb(51, 125, 255); + color: rgb(42, 104, 212); } #nav-lang-icon:hover { - color: rgb(121, 170, 255); + color: rgb(100, 141, 212); } #nav-darkmode-icon:hover { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .dropdown { - border-color: rgb(60, 65, 68); + border-color: rgb(50, 54, 56); background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .dropdown a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .dropdown-item:hover { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .unread_boxes { - background-color: rgb(204, 0, 0); - color: rgb(232, 230, 227); + background-color: rgb(169, 0, 0); + color: rgb(193, 191, 188); } .sub-lang { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .notification-open #notification { - color: rgb(114, 255, 114) !important; + color: rgb(95, 212, 95) !important; } .title-row { - color: rgb(199, 194, 187); + color: rgb(165, 161, 155); } .gray { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .white { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .black { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .red { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .green { - color: rgb(114, 255, 114); + color: rgb(95, 212, 95); } .grayed { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .darkcyan { - color: rgb(107, 255, 255); + color: rgb(89, 212, 212); } .peru { - color: rgb(209, 144, 80); + color: rgb(173, 120, 66); } .blue { - color: rgb(51, 125, 255); + color: rgb(42, 104, 212); } .background-d6e8f7 { - background-color: rgb(38, 41, 43); + background-color: rgb(32, 34, 36); } .background-bisque { - background-color: rgb(86, 47, 0); + background-color: rgb(71, 39, 0); } .background-footer { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); +} +#loading-bar { + background-color: rgb(101, 38, 33); } @media (min-width: 800px) { #page-container { background-image: initial; - background-color: rgb(32, 34, 36); + background-color: rgb(27, 28, 30); } #content.wrapper { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } } .table { @@ -1809,523 +1818,531 @@ noscript #noscript { } .table.striped tr:nth-child(2n) { background-image: initial; - background-color: rgb(29, 31, 32); + background-color: rgb(24, 26, 27); } .table.striped tr:nth-child(2n+1) { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .table td:first-child { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } .table tr:last-child td { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } .table tr:last-child td:first-child { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } .table th { - color: rgb(232, 230, 227); - background-color: rgb(0, 0, 100); - border-color: rgb(62, 68, 70); + color: rgb(193, 191, 188); + background-color: rgb(0, 0, 83); + border-color: rgb(51, 56, 58); } .table td { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } #users-table th a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .AB { - background-color: rgb(53, 57, 59); - color: rgb(232, 230, 227); + background-color: rgb(44, 47, 49); + color: rgb(193, 191, 188); } .AC { - background-color: rgb(62, 163, 11); - color: rgb(114, 255, 114); + background-color: rgb(51, 135, 9); + color: rgb(95, 212, 95); } ._AC { - background-color: rgb(139, 153, 0); - color: rgb(114, 255, 114); + background-color: rgb(115, 127, 0); + color: rgb(95, 212, 95); } .WA { - background-color: rgb(53, 57, 59); - color: rgb(240, 48, 99); + background-color: rgb(44, 47, 49); + color: rgb(199, 40, 82); } .TLE, .MLE { - background-color: rgb(53, 57, 59); - color: rgb(232, 230, 227); + background-color: rgb(44, 47, 49); + color: rgb(193, 191, 188); } .OLE, .IR, .RTE, .OTH { - background-color: rgb(136, 94, 3); - color: rgb(232, 230, 227); + background-color: rgb(113, 78, 2); + color: rgb(193, 191, 188); } .CE { - background-color: rgb(53, 57, 59); - color: rgb(232, 230, 227); + background-color: rgb(44, 47, 49); + color: rgb(193, 191, 188); } .IE { - background-color: rgb(204, 0, 0); - color: rgb(232, 230, 227); + background-color: rgb(169, 0, 0); + color: rgb(193, 191, 188); } .QU, .G { background-image: initial; - background-color: rgb(24, 26, 27); - color: rgb(232, 230, 227); + background-color: rgb(20, 22, 22); + color: rgb(193, 191, 188); } .judge-online { - color: rgb(100, 196, 97); + color: rgb(83, 163, 81); } .judge-offline { - color: rgb(225, 55, 55); + color: rgb(187, 46, 46); } .middle-content .post { - border-color: rgb(76, 83, 86) rgb(84, 91, 94) rgb(84, 91, 94); + border-color: rgb(63, 69, 71) rgb(70, 76, 78) rgb(70, 76, 78); } .middle-content .post .title a { - color: rgb(255, 114, 114) !important; + color: rgb(212, 95, 95) !important; } .middle-content .post .title a:hover { - color: rgb(255, 70, 70) !important; + color: rgb(212, 58, 58) !important; } .left-sidebar-item.active { - color: rgb(114, 255, 114); - background-color: rgb(40, 111, 17); + color: rgb(95, 212, 95); + background-color: rgb(33, 92, 14); } .left-sidebar-item.active .sidebar-icon { - color: rgb(114, 255, 114); + color: rgb(95, 212, 95); } .blog-sidebox .contest { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } .blog-sidebox .contest:last-child { border-bottom-color: initial; } .blog-sidebox .contest .name a { - color: rgb(104, 149, 191) !important; + color: rgb(86, 124, 159) !important; } .blog-sidebox .contest .name a:hover { - color: rgb(102, 177, 250) !important; + color: rgb(85, 147, 207) !important; } .no-dot-blog-sidebox ul { list-style-image: initial; } .blog-comment-count-link { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .rssatom span { - color: rgb(232, 230, 227); - border-color: rgb(174, 78, 16); + color: rgb(193, 191, 188); + border-color: rgb(144, 65, 13); background-image: linear-gradient(135deg, - rgb(175, 79, 22) 0px, - rgb(169, 90, 3) 47%, - rgb(175, 79, 22) 100%); + rgb(145, 66, 18) 0px, + rgb(140, 75, 2) 47%, + rgb(145, 66, 18) 100%); background-color: initial; } .blog-box { - border-bottom-color: rgb(60, 65, 68); - border-top-color: rgb(60, 65, 68); - background-color: rgb(24, 26, 27); + border-bottom-color: rgb(50, 54, 56); + border-top-color: rgb(50, 54, 56); + background-color: rgb(20, 22, 22); box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 5px; } .blog-box:hover { - border-color: rgb(81, 88, 91); + border-color: rgb(67, 73, 76); } .problem-feed-name a { - color: rgb(102, 177, 250); + color: rgb(85, 147, 207); } .problem-feed-types { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .left-sidebar-item:hover { - background-color: rgb(40, 43, 45); + background-color: rgb(33, 36, 37); } .left-sidebar-item.active:hover { - background-color: rgb(40, 111, 17); + background-color: rgb(33, 92, 14); } .sidebar-icon { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .left-sidebar-header { - border-bottom-color: rgb(140, 130, 115); - color: rgb(232, 230, 227); + border-bottom-color: rgb(116, 108, 95); + color: rgb(193, 191, 188); } .show-more { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); background-image: linear-gradient(rgba(0, 0, 0, 0), - rgb(24, 26, 27)); + rgb(20, 22, 22)); background-color: initial; } .middle-right-content.wrapper { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); +} +@media (max-width: 799px) { + .left-sidebar { + background-image: inherit; + background-color: inherit; + } } @media (min-width: 800px) { + .left-sidebar-item { + border-color: rgb(50, 54, 56); + box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 5px; + background-color: rgb(20, 22, 22); + } .left-sidebar { - border-right-color: rgb(60, 65, 68); - box-shadow: rgba(0, 0, 0, 0.5) 0px -10px 2px 0px; - background-image: initial; - background-color: rgb(24, 26, 27); + border-right-color: initial; } .blog-box { - border-left-color: rgb(60, 65, 68); - border-right-color: rgb(60, 65, 68); + border-left-color: rgb(50, 54, 56); + border-right-color: rgb(50, 54, 56); } } #problem-table tr:hover { background-image: initial; - background-color: rgb(36, 39, 40); + background-color: rgb(30, 32, 33); } ul.problem-list { list-style-image: initial; } .solved-problem-color { - color: rgb(100, 196, 97); + color: rgb(83, 163, 81); } .unsolved-problem-color { - color: rgb(225, 55, 55); + color: rgb(187, 46, 46); } .attempted-problem-color { - color: rgb(255, 174, 26); + color: rgb(212, 144, 22); } .submissions-left { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .no-submissions-left { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .organization-tag { box-shadow: rgba(0, 0, 0, 0.12) 0px -0.1em 0px inset; - background-color: rgb(53, 57, 59); + background-color: rgb(44, 47, 49); } .organization-tag a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .pdf-icon .pdf-icon-logo { - color: rgb(242, 59, 63); + color: rgb(201, 49, 52); } .pdf-icon .pdf-icon-bar { background-image: initial; - background-color: rgb(170, 11, 15); + background-color: rgb(141, 9, 12); } .license a { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); text-decoration-color: initial; } #problem_submit #result-version-info { - border-bottom-color: rgb(78, 85, 88); - color: rgb(158, 150, 137); + border-bottom-color: rgb(65, 71, 73); + color: rgb(131, 125, 114); } #problem_submit #language-select2 .select2-results__option { - color: rgb(158, 150, 137) !important; + color: rgb(131, 125, 114) !important; background-image: initial !important; - background-color: rgb(24, 26, 27) !important; + background-color: rgb(20, 22, 22) !important; } #problem_submit #language-select2 .select2-results__option--highlighted { text-decoration-color: initial; } #problem_submit #language-select2 .select2-results__option[aria-selected="true"] { - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } #problem-table th a { color: inherit; } .problem-data-form .bad-file input, .problem-data-form .bad-file .select2-selection { - border-color: rgb(179, 0, 0); + border-color: rgb(149, 0, 0); } .problem-clarification { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } #clarification_header { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } #clarification_header:hover { - color: rgb(255, 174, 26); + color: rgb(212, 144, 22); } #comment-announcement { - background-color: rgb(49, 53, 55); - color: rgb(166, 158, 146); + background-color: rgb(41, 44, 46); + color: rgb(138, 131, 121); } #comment-announcement:hover { - background-color: rgb(96, 104, 108); + background-color: rgb(80, 86, 90); } .admin a, .admin { - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } svg.rate-box circle { fill: none; } svg.rate-box.rate-newbie circle { - stroke: rgb(168, 160, 149); + stroke: rgb(139, 133, 124); } svg.rate-box.rate-newbie path { - fill: rgb(168, 160, 149); + fill: rgb(139, 133, 124); } svg.rate-box.rate-amateur circle { - stroke: rgb(86, 255, 86); + stroke: rgb(71, 212, 71); } svg.rate-box.rate-amateur path { - fill: rgb(86, 255, 86); + fill: rgb(71, 212, 71); } svg.rate-box.rate-specialist circle { - stroke: rgb(87, 252, 242); + stroke: rgb(72, 209, 201); } svg.rate-box.rate-specialist path { - fill: rgb(87, 252, 242); + fill: rgb(72, 209, 201); } svg.rate-box.rate-expert circle { - stroke: rgb(97, 155, 255); + stroke: rgb(81, 129, 212); } svg.rate-box.rate-expert path { - fill: rgb(97, 155, 255); + fill: rgb(81, 129, 212); } svg.rate-box.rate-candidate-master circle { - stroke: rgb(255, 97, 255); + stroke: rgb(212, 81, 212); } svg.rate-box.rate-candidate-master path { - fill: rgb(255, 97, 255); + fill: rgb(212, 81, 212); } svg.rate-box.rate-master circle { - stroke: rgb(255, 239, 49); + stroke: rgb(212, 198, 41); } svg.rate-box.rate-master path { - fill: rgb(255, 239, 49); + fill: rgb(212, 198, 41); } svg.rate-box.rate-grandmaster circle, svg.rate-box.rate-target circle { - stroke: rgb(255, 37, 37); + stroke: rgb(212, 31, 31); } svg.rate-box.rate-grandmaster path, svg.rate-box.rate-target path { - fill: rgb(255, 37, 37); + fill: rgb(212, 31, 31); } svg.rate-box.rate-target circle:last-child { stroke: none; - fill: rgb(255, 37, 37); + fill: rgb(212, 31, 31); } .rate-none, .rate-none a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .rate-newbie, .rate-newbie a { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .rate-amateur, .rate-amateur a { - color: rgb(86, 255, 86); + color: rgb(71, 212, 71); } .rate-specialist, .rate-specialist a { - color: rgb(107, 255, 255); + color: rgb(89, 212, 212); } .rate-expert, .rate-expert a { - color: rgb(51, 125, 255); + color: rgb(42, 104, 212); } .rate-candidate-master, .rate-candidate-master a { - color: rgb(255, 85, 255); + color: rgb(212, 71, 212); } .rate-master, .rate-master a { - color: rgb(255, 152, 26); + color: rgb(212, 126, 22); } .rate-grandmaster, .rate-grandmaster a, .rate-target, .rate-target a { - color: rgb(255, 37, 37); + color: rgb(212, 31, 31); } .rate-group { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #users-table th a, #users-table th a:link, #users-table th a:visited { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #users-table th a:hover { - color: rgb(26, 255, 26); + color: rgb(22, 212, 22); } #users-table tr:hover { background-image: initial; - background-color: rgb(36, 39, 40); + background-color: rgb(30, 32, 33); } #users-table tr.highlight { background-image: initial; - background-color: rgb(85, 79, 0); + background-color: rgb(71, 66, 0); } #users-table tr:target { background-image: initial; - background-color: rgb(85, 79, 0); + background-color: rgb(71, 66, 0); } #users-table .organization-column a { - color: rgb(152, 143, 129) !important; + color: rgb(126, 119, 107) !important; } #users-table .disqualified { - background-color: rgb(103, 0, 0) !important; + background-color: rgb(85, 0, 0) !important; } #users-table .frozen { background-image: initial !important; - background-color: rgb(5, 77, 121) !important; + background-color: rgb(4, 64, 100) !important; } #users-table .full-score, #users-table .full-score a { - color: rgb(114, 255, 114); + color: rgb(95, 212, 95); } #users-table .partial-score, #users-table .partial-score a { - color: rgb(114, 255, 114); + color: rgb(95, 212, 95); } #users-table .failed-score, #users-table .failed-score a { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } #users-table .pretest-full-score, #users-table .pretest-full-score a { - color: rgb(84, 164, 217); + color: rgb(70, 136, 180); } #users-table .pretest-partial-score, #users-table .pretest-partial-score a { - color: rgb(84, 164, 217); + color: rgb(70, 136, 180); } #users-table .pretest-failed-score, #users-table .pretest-failed-score a { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } #users-table .user-points { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #users-table .solving-time { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } #users-table .point-denominator { - border-top-color: rgb(84, 91, 94); + border-top-color: rgb(70, 76, 78); } #users-table .fullname-column { border-right-color: initial !important; } #users-table .fullname-column span { - color: rgb(152, 143, 129) !important; + color: rgb(126, 119, 107) !important; } #search-form .select2-results__option--highlighted { - background-color: rgb(43, 46, 48) !important; + background-color: rgb(36, 38, 40) !important; } a.user-redirect { - color: rgb(84, 164, 217); + color: rgb(70, 136, 180); } a.user-redirect:hover { - text-shadow: rgb(0, 0, 204) 0px 0px 2px; + text-shadow: rgb(0, 0, 169) 0px 0px 2px; } .user-info-cell { - border-left-color: rgb(62, 68, 70); + border-left-color: rgb(51, 56, 58); } .contest-history-cell { - border-left-color: rgb(62, 68, 70); + border-left-color: rgb(51, 56, 58); } .hide-solved-problems > span::before { background-image: initial; background-color: rgba(0, 0, 0, 0.2); } .pp-table .pp-weighted { - color: rgb(157, 148, 136); + color: rgb(130, 123, 113); } .pp-table div.sub-pp { border-left-color: initial; } #pp-load-link-wrapper { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } #rating-tooltip { background-image: initial; background-color: rgba(0, 0, 0, 0.7); - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #rating-tooltip.rate-group { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .follow { background-image: initial; - background-color: rgb(0, 102, 0); - border-color: rgb(19, 122, 19); + background-color: rgb(0, 85, 0); + border-color: rgb(16, 101, 16); } .follow:hover { background-image: initial; - background-color: rgb(0, 80, 0); + background-color: rgb(0, 66, 0); } .unfollow { background-image: initial; - background-color: rgb(204, 0, 0); - border-color: rgb(121, 0, 21); + background-color: rgb(169, 0, 0); + border-color: rgb(100, 0, 17); } .unfollow:hover { background-image: initial; - background-color: rgb(111, 0, 0); + background-color: rgb(92, 0, 0); } #submission-activity #submission-activity-actions #year { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } #submission-activity #submission-activity-display { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } #submission-activity #submission-activity-display .info-text { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } #submission-activity #submission-activity-display table td.activity-blank { - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } #submission-activity #submission-activity-display table td.activity-0 { - background-color: rgb(43, 47, 49); + background-color: rgb(36, 39, 41); } #submission-activity #submission-activity-display table td.activity-1 { - background-color: rgb(22, 102, 52); + background-color: rgb(18, 85, 43); } #submission-activity #submission-activity-display table td.activity-2 { - background-color: rgb(47, 154, 95); + background-color: rgb(39, 128, 79); } #submission-activity #submission-activity-display table td.activity-3 { - background-color: rgb(38, 125, 61); + background-color: rgb(32, 104, 51); } #submission-activity #submission-activity-display table td.activity-4 { - background-color: rgb(26, 88, 46); + background-color: rgb(22, 73, 38); } .user-info-header { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .user-stat-header { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .content-description pre, .content-description code, .content-description kbd, .content-description samp, .content-description span.code { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .content-description code, .content-description span.code { - border-color: rgb(62, 68, 70); - background-color: rgb(28, 30, 31); - color: rgb(189, 183, 175); + border-color: rgb(51, 56, 58); + background-color: rgb(23, 25, 26); + color: rgb(157, 152, 145); } .content-description pre { - border-color: rgb(62, 68, 70); - background-color: rgb(28, 30, 31); - color: rgb(232, 230, 227); + border-color: rgb(51, 56, 58); + background-color: rgb(23, 25, 26); + color: rgb(193, 191, 188); } .content-description pre code, .content-description pre div.code { border-color: initial; background-image: initial; background-color: transparent; - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .content-description pre.no-border { border-color: initial; @@ -2333,134 +2350,134 @@ a.user-redirect:hover { } .content-description ins { background-image: initial; - background-color: rgb(84, 84, 0); - color: rgb(232, 230, 227); + background-color: rgb(70, 70, 0); + color: rgb(193, 191, 188); text-decoration-color: initial; } .content-description mark { background-image: initial; - background-color: rgb(153, 153, 0); - color: rgb(232, 230, 227); + background-color: rgb(127, 127, 0); + color: rgb(193, 191, 188); } .content-description img { border-color: initial; } .codehilitetable pre { - background-color: rgba(35, 38, 39, 0.5); + background-color: rgba(29, 32, 32, 0.5); } .codehilitetable .linenos pre { - color: rgba(232, 230, 227, 0.26); + color: rgba(193, 191, 188, 0.26); background-color: rgba(0, 0, 0, 0.07); border-right-color: initial; } .info-float .fa { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .tweet-this i { - color: rgb(90, 176, 238); + color: rgb(75, 146, 198); } .facebook-this it { - color: rgb(132, 183, 237); + color: rgb(110, 152, 197); } .gplus-this i { - color: rgb(224, 90, 72); + color: rgb(186, 75, 60); } .button, button, input[type="submit"] { - background-color: rgb(200, 80, 0); + background-color: rgb(166, 66, 0); border-color: transparent; box-shadow: rgba(0, 0, 0, 0.02) 0px 1px 3px 0px; text-decoration-color: initial; - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } .button.disabled, button.disabled, input[type="submit"].disabled { - background-image: linear-gradient(rgb(73, 79, 82) 0px, - rgb(96, 104, 108) 100%) !important; + background-image: linear-gradient(rgb(61, 66, 68) 0px, + rgb(80, 86, 90) 100%) !important; background-color: initial !important; - border-color: rgb(84, 91, 94) !important; + border-color: rgb(70, 76, 78) !important; } .button.btn-gray, button.btn-gray, input[type="submit"].btn-gray { background-image: initial; - background-color: rgb(96, 104, 108); + background-color: rgb(80, 86, 90); } .button.btn-hovergray:hover, button.btn-hovergray:hover, input[type="submit"].btn-hovergray:hover { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .button.btn-green, button.btn-green, input[type="submit"].btn-green { background-image: initial; - background-color: rgb(0, 102, 0); + background-color: rgb(0, 85, 0); } .button.btn-green:hover, button.btn-green:hover, input[type="submit"].btn-green:hover { background-image: initial; - background-color: rgb(35, 121, 60); + background-color: rgb(29, 100, 50); } .button.btn-darkred, button.btn-darkred, input[type="submit"].btn-darkred { background-image: initial; - background-color: rgb(111, 0, 0); + background-color: rgb(92, 0, 0); } .button.btn-darkred:hover, button.btn-darkred:hover, input[type="submit"].btn-darkred:hover { background-image: initial; - background-color: rgb(132, 34, 34); + background-color: rgb(110, 28, 28); } .button.btn-midnightblue, button.btn-midnightblue, input[type="submit"].btn-midnightblue { background-image: initial; - background-color: rgb(20, 20, 90); + background-color: rgb(17, 17, 75); } .button.btn-midnightblue:hover, button.btn-midnightblue:hover, input[type="submit"].btn-midnightblue:hover { background-image: initial; - background-color: rgb(0, 0, 111); + background-color: rgb(0, 0, 92); } .button:hover, button:hover, input[type="submit"]:hover { - background-color: rgb(173, 72, 3); + background-color: rgb(144, 60, 2); box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px; } .button:focus, button:focus, input[type="submit"]:focus { - background-color: rgb(173, 72, 3); + background-color: rgb(144, 60, 2); box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px; } .button:active, button:active, input[type="submit"]:hover { - background-color: rgb(160, 64, 0); + background-color: rgb(133, 53, 0); box-shadow: rgba(0, 0, 0, 0.06) 0px 2px 4px; } input[type="text"], input[type="password"], input[type="email"], input[type="number"] { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); background-image: none; - background-color: rgb(24, 26, 27); - border-color: rgb(62, 68, 70); + background-color: rgb(20, 22, 22); + border-color: rgb(51, 56, 58); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset; } textarea { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); background-image: none; - background-color: rgb(24, 26, 27); - border-color: rgb(62, 68, 70); + background-color: rgb(20, 22, 22); + border-color: rgb(51, 56, 58); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset; } textarea:hover { - border-color: rgba(16, 87, 144, 0.8); + border-color: rgba(13, 72, 120, 0.8); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset, - rgba(16, 91, 150, 0.6) 0px 0px 4px; + rgba(13, 76, 125, 0.6) 0px 0px 4px; } input[type="text"]:hover, input[type="password"]:hover { - border-color: rgba(16, 87, 144, 0.8); + border-color: rgba(13, 72, 120, 0.8); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset, - rgba(16, 91, 150, 0.6) 0px 0px 4px; + rgba(13, 76, 125, 0.6) 0px 0px 4px; } textarea:focus { - border-color: rgba(16, 87, 144, 0.8); + border-color: rgba(13, 72, 120, 0.8); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset, - rgba(16, 91, 150, 0.6) 0px 0px 8px; outline-color: initial; + rgba(13, 76, 125, 0.6) 0px 0px 8px; outline-color: initial; } input[type="text"]:focus, input[type="password"]:focus { - border-color: rgba(16, 87, 144, 0.8); + border-color: rgba(13, 72, 120, 0.8); box-shadow: rgba(0, 0, 0, 0.07) 0px 1px 1px inset, - rgba(16, 91, 150, 0.6) 0px 0px 8px; + rgba(13, 76, 125, 0.6) 0px 0px 8px; outline-color: initial; } .btn-clipboard { - color: rgb(157, 149, 136); - background-color: rgb(24, 26, 27); - border-color: rgb(55, 60, 62); + color: rgb(130, 124, 113); + background-color: rgb(20, 22, 22); + border-color: rgb(46, 50, 51); } .ul_tab_a_active, .tabs > ul > li.active > a:focus, @@ -2469,128 +2486,134 @@ input[type="text"]:focus, input[type="password"]:focus { .tabs > ul > li.active > span:hover, .tabs > ul > li.active > a, .tabs > ul > li.active > span { - color: rgb(205, 200, 194); - border-bottom-color: rgb(126, 117, 103); + color: rgb(170, 166, 161); + border-bottom-color: rgb(105, 97, 85); background-image: initial; background-color: transparent; } .tabs { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } .tabs .tab .tab-icon { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .tabs .tab.active a, .tabs .tab.active span { - border-top-color: rgb(48, 52, 54) !important; + border-top-color: rgb(40, 43, 45) !important; } .tabs .tab.active .tab-icon { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .tabs h2 { - color: rgb(199, 194, 187); + color: rgb(165, 161, 155); } .tabs > ul { list-style-image: none; } +.tabs > ul::-webkit-scrollbar { + background-color: transparent; +} +.tabs > ul::-webkit-scrollbar-thumb { + background-color: transparent; +} .tabs > ul > li > a, .tabs > ul > li > span { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); text-decoration-color: initial; } .tabs > ul > li > a:hover, .tabs > ul > li > span:hover { - border-bottom-color: rgb(0, 217, 0); + border-bottom-color: rgb(0, 180, 0); } ul.pagination a:hover { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); background-image: initial; background-color: rgba(0, 0, 0, 0.55); } ul.pagination > li > a, ul.pagination > li > span { text-decoration-color: initial; - color: rgb(232, 230, 227); - background-color: rgb(0, 0, 100); - border-color: rgb(114, 106, 93); + color: rgb(193, 191, 188); + background-color: rgb(0, 0, 83); + border-color: rgb(95, 88, 77); } ul.pagination > .disabled-page > a { - color: rgb(157, 148, 136); - background-color: rgb(0, 0, 100); - border-color: rgb(127, 118, 104); + color: rgb(130, 123, 113); + background-color: rgb(0, 0, 83); + border-color: rgb(105, 98, 86); } ul.pagination > .disabled-page > span { - color: rgb(157, 148, 136); - background-color: rgb(0, 0, 100); - border-color: rgb(114, 106, 93); + color: rgb(130, 123, 113); + background-color: rgb(0, 0, 83); + border-color: rgb(95, 88, 77); } ul.pagination > .active-page > a { - color: rgb(232, 230, 227); - background-color: rgb(0, 73, 129); + color: rgb(193, 191, 188); + background-color: rgb(0, 61, 107); border-color: transparent; } ul.pagination > .active-page > span { - color: rgb(232, 230, 227); - background-color: rgb(24, 26, 27); + color: rgb(193, 191, 188); + background-color: rgb(20, 22, 22); border-color: transparent; } .alert { border-color: transparent; } .alert-info { - color: rgb(117, 178, 208); - background-color: rgb(14, 48, 65); - border-color: rgb(22, 90, 104); + color: rgb(97, 148, 173); + background-color: rgb(12, 40, 54); + border-color: rgb(18, 75, 86); } .alert-warning { - color: rgb(198, 171, 123); - background-color: rgb(47, 40, 5); - border-color: rgb(108, 76, 11); + color: rgb(164, 142, 102); + background-color: rgb(39, 33, 4); + border-color: rgb(90, 63, 9); } .alert-danger { - color: rgb(194, 102, 100); - background-color: rgb(56, 22, 22); - border-color: rgb(89, 35, 43); + color: rgb(161, 85, 83); + background-color: rgb(46, 18, 18); + border-color: rgb(74, 29, 36); } .alert-dismissable .close, .alert-dismissible .close { color: inherit; } .close { - color: rgb(232, 230, 227); - text-shadow: rgb(24, 26, 27) 0px 1px 0px; + color: rgb(193, 191, 188); + text-shadow: rgb(20, 22, 22) 0px 1px 0px; } a.close { text-decoration-color: initial !important; } a.close:hover { - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } .close:focus, .close:hover { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); text-decoration-color: initial; } .badge { - color: rgb(232, 230, 227); - background-color: rgb(155, 19, 19); + color: rgb(193, 191, 188); + background-color: rgb(129, 16, 16); } .form-submit-group { - border-top-color: rgb(53, 57, 59); + border-top-color: rgb(44, 47, 49); } .sidebox h3 { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .sidebox h3 .fa { background-image: initial; - background-color: rgb(3, 66, 54); - color: rgb(232, 230, 227); + background-color: rgb(2, 55, 45); + color: rgb(193, 191, 188); } .sidebox-content { border-top-color: initial; background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .sidebox-content.sidebox-table { border-color: initial; @@ -2600,132 +2623,133 @@ a.close:hover { } .ws-closed { background-image: initial; - background-color: rgb(139, 0, 0); + background-color: rgb(115, 0, 0); } .ws-closed a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .messages li { border-color: transparent; } .messages li.debug { - color: rgb(194, 188, 180); - background-color: rgb(40, 43, 44); - border-color: rgb(59, 64, 66); + color: rgb(161, 156, 149); + background-color: rgb(33, 36, 37); + border-color: rgb(49, 53, 55); } .messages li.info { - color: rgb(142, 227, 241); - background-color: rgb(20, 59, 67); - border-color: rgb(30, 89, 97); + color: rgb(118, 188, 200); + background-color: rgb(17, 49, 56); + border-color: rgb(25, 74, 81); } .messages li.success { - color: rgb(153, 230, 171); - background-color: rgb(26, 62, 41); - border-color: rgb(37, 90, 50); + color: rgb(127, 191, 142); + background-color: rgb(22, 51, 34); + border-color: rgb(31, 75, 41); } .messages li.warning { - color: rgb(251, 215, 112); - background-color: rgb(61, 46, 0); - border-color: rgb(123, 92, 0); + color: rgb(208, 178, 93); + background-color: rgb(51, 38, 0); + border-color: rgb(102, 76, 0); } .messages li.error { - color: rgb(225, 134, 143); - background-color: rgb(67, 12, 17); - border-color: rgb(104, 18, 27); + color: rgb(187, 111, 119); + background-color: rgb(56, 10, 14); + border-color: rgb(86, 15, 22); } .spoiler-text { - border-color: rgb(140, 130, 115); + border-color: rgb(116, 108, 95); background-image: initial; - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } .spoiler-summary { text-decoration-color: initial; } .control-button { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); border-color: initial; - color: rgb(232, 230, 227) !important; + color: rgb(193, 191, 188) !important; } .control-button:hover { background-image: initial; - background-color: rgb(96, 104, 108); + background-color: rgb(80, 86, 90); +} +ul.errorlist { + list-style-image: initial; + color: rgb(212, 22, 22); } .registration-form .block-header { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .registration-form .fullwidth-error input { - border-color: rgb(179, 0, 0); + border-color: rgb(149, 0, 0); } .registration-form .form-field-error { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .registration-form #edit-form { border-color: unset; background-image: unset; background-color: unset; } -.registration-form ul.errorlist { - list-style-image: initial; -} #login-panel .google-icon i { - color: rgb(224, 90, 72); + color: rgb(186, 75, 60); } #login-panel .facebook-icon i { - color: rgb(132, 183, 237); + color: rgb(110, 152, 197); } #login-panel .github-icon i { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } a.upvote-link, a.downvote-link { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } a.voted { text-shadow: rgb(0, 0, 0) 0px 0px 4px, - rgb(0, 0, 204) 0px 0px 9px; + rgb(0, 0, 169) 0px 0px 9px; } .comment-area .featherlight-edit .featherlight-content { background-image: initial; - background-color: rgb(27, 29, 30); - border-color: rgb(62, 68, 70); + background-color: rgb(22, 24, 25); + border-color: rgb(51, 56, 58); } .comment-area .new-comments .comment-display { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); background-image: initial; - background-color: rgb(27, 29, 30); + background-color: rgb(22, 24, 25); } .comment-area .new-comments .comment .detail .header { - border-bottom-color: rgb(82, 88, 92); - color: rgb(157, 148, 136); + border-bottom-color: rgb(68, 73, 76); + color: rgb(130, 123, 113); } .comment-area .previous-revision, .comment-area .next-revision { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } .comment-area .new-comments .header i { - color: rgb(157, 148, 136) !important; + color: rgb(130, 123, 113) !important; } .comment-area .new-comments .comment:target > .comment-display { - border-color: rgb(34, 106, 153); + border-color: rgb(28, 88, 127); } .comment-author { - color: rgb(200, 195, 188); + color: rgb(166, 162, 156); } .comment-header { - color: rgb(231, 229, 226); + color: rgb(192, 190, 188); background-image: initial; background-color: rgba(0, 0, 0, 0.1); - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } .comment-edits:not(:empty) { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } .comment-operation .fa { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } .comment-box { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); background-image: initial; background-color: rgba(0, 0, 0, 0.01); } @@ -2733,150 +2757,150 @@ a.voted { list-style-image: none; } .comment:target > .comment-box { - border-left-color: rgb(48, 52, 54); + border-left-color: rgb(40, 43, 45); } .actionbar .actionbar-button { - border-color: rgb(60, 65, 68); + border-color: rgb(50, 54, 56); } .actionbar .actionbar-button:hover { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .actionbar .dislike-button { border-left-color: initial; } .actionbar .like-button.voted { - color: rgb(51, 125, 255); + color: rgb(42, 104, 212); } .actionbar .dislike-button.voted { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .actionbar .bookmarked { - color: rgb(248, 248, 80); + color: rgb(206, 206, 66); } #submissions-table { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .submission-row { - border-left-color: rgb(62, 68, 70); - border-right-color: rgb(62, 68, 70); + border-left-color: rgb(51, 56, 58); + border-right-color: rgb(51, 56, 58); } .submission-row:hover { background-image: initial; - background-color: rgb(31, 34, 35); + background-color: rgb(26, 28, 29); } .submission-row:first-of-type { - border-top-color: rgb(62, 68, 70); + border-top-color: rgb(51, 56, 58); } .submission-row > div { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } .submission-row .sub-result { - border-bottom-color: rgb(48, 52, 54); - border-right-color: rgb(62, 68, 70); + border-bottom-color: rgb(40, 43, 45); + border-right-color: rgb(51, 56, 58); } .submission-row .sub-result .score { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .submission-row .sub-testcase { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .submission-row .sub-usage { - border-left-color: rgb(62, 68, 70); + border-left-color: rgb(51, 56, 58); } #statistics-table tr:not(:first-child) td { - border-top-color: rgb(48, 52, 54) !important; + border-top-color: rgb(40, 43, 45) !important; } #statistics-table tr:not(:last-child) td:not(:last-child) { - border-right-color: rgb(48, 52, 54); + border-right-color: rgb(40, 43, 45); } .submission-contest { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .source-ln { - color: rgb(152, 143, 129); - border-right-color: rgb(84, 91, 94); + color: rgb(126, 119, 107); + border-right-color: rgb(70, 76, 78); } .source-ln a { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .source-ln a:hover { text-decoration-color: initial; } .source-wrap { - border-color: rgb(72, 78, 81); + border-color: rgb(60, 65, 67); } .statistics-table .count { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } #test-cases .case-info { - border-color: rgb(34, 106, 153); - color: rgb(211, 207, 201); + border-color: rgb(28, 88, 127); + color: rgb(175, 172, 167); } #test-cases .case-output { - box-shadow: rgba(27, 29, 30, 0.15) 0px 1px 2px 0px; - border-color: rgba(128, 119, 105, 0.15); + box-shadow: rgba(22, 24, 25, 0.15) 0px 1px 2px 0px; + border-color: rgba(106, 99, 87, 0.15); } #test-cases .testcases-table { border-color: initial; } .overall-result-AC { background-image: linear-gradient(45deg, - rgb(68, 132, 0), - rgb(0, 132, 102)); + rgb(56, 110, 0), + rgb(0, 110, 85)); background-color: initial; } .overall-result-WA { background-image: linear-gradient(45deg, - rgb(153, 153, 0), - rgb(204, 0, 0)); + rgb(127, 127, 0), + rgb(169, 0, 0)); background-color: initial; } .overall-result-TLE { background-image: linear-gradient(45deg, - rgb(42, 45, 47), - rgb(83, 91, 112)); + rgb(35, 37, 39), + rgb(69, 76, 93)); background-color: initial; } .overall-result-RTE, .overall-result-MLE { background-image: linear-gradient(45deg, - rgb(67, 49, 3), - rgb(198, 145, 0)); + rgb(56, 41, 2), + rgb(164, 120, 0)); background-color: initial; } .case-AC { - color: rgb(114, 255, 114); + color: rgb(95, 212, 95); } .case-_AC { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .case-WA { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } .case-TLE, .case-SC { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .case-MLE, .case-OLE, .case-RTE, .case-IR { - color: rgb(255, 174, 26); + color: rgb(212, 144, 22); } .source-wrap a:active .line .highlighter { background-image: initial; - background-color: rgba(153, 127, 0, 0.48); + background-color: rgba(127, 105, 0, 0.48); } .submission-info .submission-date { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } #contest-calendar th { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } #contest-calendar th.sun { - border-left-color: rgb(62, 68, 70); + border-left-color: rgb(51, 56, 58); } #contest-calendar th.sun, #contest-calendar th.mon, @@ -2885,145 +2909,142 @@ a.voted { #contest-calendar th.thu, #contest-calendar th.fri, #contest-calendar th.sat { - border-right-color: rgb(62, 68, 70); + border-right-color: rgb(51, 56, 58); background-image: initial; - background-color: rgb(27, 29, 30); + background-color: rgb(22, 24, 25); } #contest-calendar td { - color: rgb(232, 230, 227); - border-right-color: rgb(62, 68, 70); - border-bottom-color: rgb(62, 68, 70); + color: rgb(193, 191, 188); + border-right-color: rgb(51, 56, 58); + border-bottom-color: rgb(51, 56, 58); } #contest-calendar td .num { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); } #contest-calendar td ul { text-decoration-color: initial; } #contest-calendar td ul li i.fa { - color: rgb(255, 174, 26); + color: rgb(212, 144, 22); } #contest-calendar td ul li a { text-decoration-color: initial; - color: rgb(211, 207, 201); + color: rgb(175, 172, 167); } #contest-calendar td ul li a:hover { text-decoration-color: initial; } #contest-calendar td:hover { background-image: initial; - background-color: rgba(0, 0, 204, 0.3); - color: rgb(232, 230, 227); + background-color: rgba(0, 0, 169, 0.3); + color: rgb(193, 191, 188); } #contest-calendar .noday { background-image: initial; - background-color: rgb(32, 35, 36); + background-color: rgb(27, 29, 30); } #contest-calendar .today { background-image: initial; - background-color: rgba(108, 108, 0, 0.5); + background-color: rgba(90, 90, 0, 0.5); } #contest-calendar tr td:first-child { - border-left-color: rgb(72, 78, 81); + border-left-color: rgb(60, 65, 67); } #banner a.date { text-decoration-color: initial; } #banner a.date:link, #banner a.date:visited { - color: rgb(104, 149, 191); + color: rgb(86, 124, 159); } #banner a.date:hover { - color: rgb(102, 177, 250); + color: rgb(85, 147, 207); } #banner .time { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .time-left { - color: rgb(157, 148, 136); + color: rgb(130, 123, 113); } .contest-list .contest-tag-hidden { background-color: rgb(0, 0, 0); - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .first-solve { background-image: initial; - background-color: rgb(0, 199, 129); + background-color: rgb(0, 165, 107); } .contest-tag { box-shadow: rgba(0, 0, 0, 0.12) 0px -0.1em 0px inset; } .contest-tag-edit { - background-color: rgb(0, 102, 0); + background-color: rgb(0, 85, 0); } .contest-tag-private { - background-color: rgb(77, 83, 86); - color: rgb(232, 230, 227); + background-color: rgb(64, 69, 71); + color: rgb(193, 191, 188); } .contest-tag-org { - background-color: rgb(53, 57, 59); + background-color: rgb(44, 47, 49); } .contest-tag-org a { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .contest-tag-rated { - background-color: rgb(183, 61, 16); - color: rgb(232, 230, 227); + background-color: rgb(152, 51, 13); + color: rgb(193, 191, 188); } .contest-list-sort { - color: rgb(113, 195, 255); + color: rgb(94, 162, 212); } .contest-participation-operation .fa { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } #add-clarification { - color: rgb(140, 255, 26); + color: rgb(116, 212, 22); } #add-clarification:hover { - color: rgb(26, 255, 255); + color: rgb(22, 212, 212); } #judge-versions .version-blank { background-image: initial; - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } #judge-versions .version-latest { background-image: initial; - background-color: rgba(88, 125, 0, 0.9); + background-color: rgba(73, 104, 0, 0.9); } #judge-versions .version-outdated { background-image: initial; - background-color: rgba(204, 0, 0, 0.8); - color: rgb(232, 230, 227); + background-color: rgba(169, 0, 0, 0.8); + color: rgb(193, 191, 188); } .chat { background-image: initial; - background-color: rgb(24, 26, 27); -} -#emoji-button { - color: rgb(204, 200, 193); -} -#emoji-button:hover { - color: rgb(152, 143, 129); + background-color: rgb(20, 22, 22); } #chat-online { - border-right-color: rgb(62, 68, 70); + border-right-color: rgb(51, 56, 58); border-bottom-color: initial; } #chat-input { - border-color: initial; - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); + border-color: rgb(132, 97, 16); +} +.selected-status-row { + background-color: rgb(41, 44, 46); +} +.status_last_message { + color: rgb(148, 142, 134); } @media (min-width: 800px) { #chat-container { - border-top-color: rgb(62, 68, 70); - border-right-color: rgb(62, 68, 70); - border-left-color: rgb(62, 68, 70); + border-top-color: rgb(51, 56, 58); + border-right-color: rgb(51, 56, 58); + border-left-color: rgb(51, 56, 58); border-bottom-color: initial; } } -.info-circle { - stroke: rgb(232, 230, 227); -} #chat-info { box-shadow: rgba(0, 0, 0, 0.2) 0px 2px 3px; } @@ -3034,122 +3055,129 @@ a.voted { } #refresh-button:hover { background-image: initial; - background-color: rgb(40, 111, 17); + background-color: rgb(33, 92, 14); } .status-circle { - stroke: rgb(232, 230, 227); + stroke: rgb(193, 191, 188); } .status-row:hover { background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .message-text-other { background-image: initial; - background-color: rgb(34, 36, 38); - color: rgb(232, 230, 227); + background-color: rgb(28, 30, 32); + color: rgb(193, 191, 188); } .message-text-myself { background-image: initial; - background-color: rgb(0, 106, 204); - color: rgb(232, 230, 227); + background-color: rgb(0, 88, 169); + color: rgb(193, 191, 188); +} +.chat-input-icon { + color: rgb(170, 166, 161); +} +.chat-input-icon:hover { + background-image: initial; + background-color: rgb(41, 44, 46); } .chat .active-span { - color: rgb(169, 162, 151); + color: rgb(140, 134, 125); } .chat .unread-count { - color: rgb(232, 230, 227); - background-color: rgb(0, 111, 111); + color: rgb(193, 191, 188); + background-color: rgb(0, 92, 92); } .chat #setting-content { - background-color: rgb(32, 35, 36); + background-color: rgb(27, 29, 30); box-shadow: rgba(0, 0, 0, 0.2) 0px 8px 16px 0px; } .chat #setting-content li { text-decoration-color: initial; - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .chat #setting-content li:hover { - background-color: rgb(43, 47, 49); + background-color: rgb(36, 39, 41); } .leave-organization, .leave-organization:hover { - color: rgb(255, 26, 26); + color: rgb(212, 22, 22); } #control-list li { - border-bottom-color: rgb(140, 130, 115); + border-bottom-color: rgb(116, 108, 95); } #pending-count-box { background-image: initial; - background-color: rgb(204, 0, 0); - color: rgb(232, 230, 227); + background-color: rgb(169, 0, 0); + color: rgb(193, 191, 188); } .organization-row { - border-bottom-color: rgb(62, 68, 70); + border-bottom-color: rgb(51, 56, 58); border-top-color: initial; - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .organization-row:hover { - background-color: rgb(31, 33, 35); + background-color: rgb(26, 27, 29); } .organization-container { - border-color: rgb(62, 68, 70); + border-color: rgb(51, 56, 58); } .ticket-container #content > h2:first-child small { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .ticket-container #content > h2:first-child .fa-check-circle-o { - color: rgb(86, 255, 86); + color: rgb(71, 212, 71); } .ticket-container #content > h2:first-child .fa-exclamation-circle { - color: rgb(255, 107, 107); + color: rgb(212, 89, 89); } .ticket-container .info-box { - border-color: rgb(77, 83, 86); + border-color: rgb(64, 69, 71); } .ticket-container .info-title { - border-bottom-color: rgb(77, 83, 86); + border-bottom-color: rgb(64, 69, 71); background-image: initial; - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } .ticket-container .info-empty { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .ticket-container .close-ticket { - background-image: linear-gradient(rgb(60, 138, 0) 0%, - rgb(31, 109, 14) 100%); + background-image: linear-gradient(rgb(50, 115, 0) 0%, + rgb(26, 90, 12) 100%); background-color: initial; - border-color: rgb(61, 193, 24); + border-color: rgb(51, 160, 20); } .ticket-container .close-ticket:hover { background-image: initial; - background-color: rgb(29, 90, 11); + background-color: rgb(24, 75, 9); } .ticket-container .open-ticket { - background-image: linear-gradient(rgb(195, 3, 0), - rgb(141, 49, 18)); + background-image: linear-gradient(rgb(162, 2, 0), + rgb(117, 41, 15)); background-color: initial; - border-color: rgb(186, 67, 24); + border-color: rgb(154, 56, 20); } .ticket-container .open-ticket:hover { background-image: initial; - background-color: rgb(106, 38, 14); + background-color: rgb(88, 32, 12); } .ticket-container .message .detail { - border-color: rgb(77, 83, 86); + border-color: rgb(64, 69, 71); } .ticket-container .message .header { background-image: initial; - background-color: rgb(34, 36, 38); - color: rgb(157, 148, 136); - border-bottom-color: rgb(77, 83, 86); + background-color: rgb(28, 30, 32); + color: rgb(130, 123, 113); + border-bottom-color: rgb(64, 69, 71); } .wmd-button-bar { - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .wmd-input { background-image: initial; - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); } .wmd-preview { background-image: none; @@ -3159,13 +3187,13 @@ a.voted { list-style-image: initial; } .wmd-bold-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iOCIgaGVpZ2h0PSI4Ij48ZGVmcz48ZmlsdGVyIGlkPSJkYXJrcmVhZGVyLWltYWdlLWZpbHRlciI+PGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMjQ5IC0wLjYxNCAtMC42NzIgMC4wMDAgMS4wMzUgLTAuNjQ2IDAuMjg4IC0wLjY2NCAwLjAwMCAxLjAyMCAtMC42MzYgLTAuNjA5IDAuMjUwIDAuMDAwIDAuOTk0IDAuMDAwIDAuMDAwIDAuMDAwIDEuMDAwIDAuMDAwIiAvPjwvZmlsdGVyPjwvZGVmcz48aW1hZ2Ugd2lkdGg9IjgiIGhlaWdodD0iOCIgZmlsdGVyPSJ1cmwoI2RhcmtyZWFkZXItaW1hZ2UtZmlsdGVyKSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpT0hCNElpQm9aV2xuYUhROUlqaHdlQ0lnZG1sbGQwSnZlRDBpTUNBd0lEZ2dPQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajROQ2lBZ1BIQmhkR2dnWkQwaVRUQWdNSFl4WXk0MU5TQXdJREVnTGpRMUlERWdNWFkwWXpBZ0xqVTFMUzQwTlNBeExURWdNWFl4YURVdU5XTXhMak00SURBZ01pNDFMVEV1TVRJZ01pNDFMVEl1TlNBd0xURXRMalU1TFRFdU9EVXRNUzQwTkMweUxqSTFMakkzTFM0ek5DNDBOQzB1TnpndU5EUXRNUzR5TlNBd0xURXVNUzB1T0RrdE1pMHlMVEpvTFRWNmJUTWdNV2d4WXk0MU5TQXdJREVnTGpRMUlERWdNWE10TGpRMUlERXRNU0F4YUMweGRpMHllbTB3SUROb01TNDFZeTQ0TXlBd0lERXVOUzQyTnlBeExqVWdNUzQxY3kwdU5qY2dNUzQxTFRFdU5TQXhMalZvTFRFdU5YWXRNM29pSUM4K0RRbzhMM04yWno0PSIgLz48L3N2Zz4="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iOCIgaGVpZ2h0PSI4Ij48ZGVmcz48ZmlsdGVyIGlkPSJkYXJrcmVhZGVyLWltYWdlLWZpbHRlciI+PGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMjA3IC0wLjUwOSAtMC41NTcgMC4wMDAgMC44NTkgLTAuNTM2IDAuMjM5IC0wLjU1MSAwLjAwMCAwLjg0NyAtMC41MjggLTAuNTA2IDAuMjA4IDAuMDAwIDAuODI1IDAuMDAwIDAuMDAwIDAuMDAwIDEuMDAwIDAuMDAwIiAvPjwvZmlsdGVyPjwvZGVmcz48aW1hZ2Ugd2lkdGg9IjgiIGhlaWdodD0iOCIgZmlsdGVyPSJ1cmwoI2RhcmtyZWFkZXItaW1hZ2UtZmlsdGVyKSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpT0hCNElpQm9aV2xuYUhROUlqaHdlQ0lnZG1sbGQwSnZlRDBpTUNBd0lEZ2dPQ0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JajROQ2lBZ1BIQmhkR2dnWkQwaVRUQWdNSFl4WXk0MU5TQXdJREVnTGpRMUlERWdNWFkwWXpBZ0xqVTFMUzQwTlNBeExURWdNWFl4YURVdU5XTXhMak00SURBZ01pNDFMVEV1TVRJZ01pNDFMVEl1TlNBd0xURXRMalU1TFRFdU9EVXRNUzQwTkMweUxqSTFMakkzTFM0ek5DNDBOQzB1TnpndU5EUXRNUzR5TlNBd0xURXVNUzB1T0RrdE1pMHlMVEpvTFRWNmJUTWdNV2d4WXk0MU5TQXdJREVnTGpRMUlERWdNWE10TGpRMUlERXRNU0F4YUMweGRpMHllbTB3SUROb01TNDFZeTQ0TXlBd0lERXVOUzQyTnlBeExqVWdNUzQxY3kwdU5qY2dNUzQxTFRFdU5TQXhMalZvTFRFdU5YWXRNM29pSUM4K0RRbzhMM04yWno0PSIgLz48L3N2Zz4="); } .wmd-italic-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNTI1IiBoZWlnaHQ9IjUyNSI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSI1MjUiIGhlaWdodD0iNTI1IiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIyWlhKemFXOXVQU0l4TGpFaUlHbGtQU0pEWVhCaFh6RWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdlRzFzYm5NNmVHeHBibXM5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zaUlIZzlJakJ3ZUNJZ2VUMGlNSEI0SWcwS0lDQWdkMmxrZEdnOUlqVXlOUzR4TkRKd2VDSWdhR1ZwWjJoMFBTSTFNalV1TVRReWNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBMU1qVXVNVFF5SURVeU5TNHhORElpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRFV5TlM0eE5ESWdOVEkxTGpFME1qc2lEUW9nSUNCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5DanhuUGcwS0lDQThaejROQ2lBZ0lDQThjR0YwYUNCa1BTSk5NemMxTGpVMExEQXVNalEwWXkweE15NHpNellzTVM0Mk9Ea3RNall1T0RNc01pNDROeTAwTUM0ME9UWXNNeTQxTlRaakxURTFMamMwTVN3d0xqYzVOaTB5Tnk0NU9EY3NNUzR4T0RndE16WXVOekkzTERFdU1UZzREUW9nSUNBZ0lDQmpMVEV3TGpBMk55d3dMVEl5TGpBNE55MHdMalV4TkMwek5pNHdOekV0TVM0MU56bGpMVEV5TGpJeU9DMHdMamt4T0MweU5TNHlPREl0TWk0d05TMHpPUzR4TmpJdE15NHpOemhqTFRNdU16WTJMVEF1TXpJMExUWXVPVFU0TERJdU1ERTBMVGN1T0RBekxEVXVNamc0RFFvZ0lDQWdJQ0JqTFRFdU1EVXpMRFF1TURnNExURXVOVGN6TERjdU5ERTRMVEV1TlRjekxEa3VPVGMyWXpBc05pNDROek1zTkM0NE1EUXNNVEV1TURrMUxERTBMalF5TlN3eE1pNDJPR014TWk0Mk9ERXNNUzQxTnprc01qQXVOall4TERVdU1ESTFMREl6TGprME1Td3hNQzR6TURZTkNpQWdJQ0FnSUdNekxqSTRMRFV1TWpneUxEUXVNRE01TERFeUxqWTNOU3d5TGpJNU5Td3lNaTR4T1RGc0xUWTBMakkyTml3ME1ETXVNemswWXkweExqYzFOaXd4TUM0d05ETXROUzQwTnpnc01UY3VOVGMyTFRFeExqRTFOeXd5TWk0MU9Ea05DaUFnSUNBZ0lHTXROUzQyT0RZc05TNHdNalF0TVRRdU1qRXNPQzQxT1RrdE1qVXVOVGMxTERFd0xqWTVOMk10TkM0NE1UWXNNUzR3TmpVdE55NDVPRGNzTWk0Mk5qSXRPUzQxTURRc05DNDNOVFZqTFRFdU5UUXlMREl1TVRFNExUSXVNamsxTERVdU1qZ3lMVEl1TWprMUxEa3VOVEU0RFFvZ0lDQWdJQ0JqTUN3eUxqVTJNeXd3TGpJME5TdzFMak15TkN3d0xqY3lPQ3c0TGpJNFl6QXVOVFExTERNdU16TTFMRE11T1RZMkxEVXVOamszTERjdU16STJMRFV1TXpVMFl6RXlMamMwT0MweExqTXhMREkxTGpJMU55MHlMalF5TkN3ek55NDFNamd0TXk0ek1qa05DaUFnSUNBZ0lHTXhOQzR4T1RndE1TNHdOalVzTWpVdU5qY3pMVEV1TlRjNUxETTBMalF5TlMweExqVTNPV014TUM0d05UVXNNQ3d5TWk0NU5UY3NNQzQxTVRRc016Z3VOamszTERFdU5UYzVZekV6TGpjMk5Dd3dMamt5TkN3eU55NDJPREVzTWk0d05TdzBNUzQzT0RFc015NHpPRFFOQ2lBZ0lDQWdJR016TGpNMk5pd3dMak14T0N3MkxqYzROeTB5TGpBMk9DdzNMak16TWkwMUxqUXdNMk13TGpRNE15MHlMamsxTml3d0xqY3lPUzAxTGpjeExEQXVOekk1TFRndU1qaGpNQzAzTGpNNU5DMDBMakUyTWkweE1pNHhORGd0TVRJdU5EWXhMVEUwTGpJM01nMEtJQ0FnSUNBZ1l5MHhNUzQ0TURZdE1pNDJNemd0TVRrdU9EazJMVFV1T1RReUxUSTBMakkyTmkwNUxqa3dNV010TkM0ek56WXRNeTQ1TmkwMUxqWTROaTB4TVM0eU1qVXRNeTQ1TXpVdE1qRXVOemswVERNek1pNDBNVGdzTmpJdU1EVU5DaUFnSUNBZ0lHTXhMamN6T0MweE1DNDFOak1zTlM0eE1qa3RNVGd1TWpJMUxERXdMakUyTlMweU1pNDVPR00xTGpBeE9TMDBMamMxTlN3eE15NDJOaTA0TGpFNE1pd3lOUzQ1TURZdE1UQXVNekEyWXpZdU1USXRNUzR3TlRNc01UQXVNVGN5TFRJdU5qTTRMREV5TGpFekxUUXVOelUxRFFvZ0lDQWdJQ0JqTVM0NU56RXRNaTR4TURVc01pNDVOUzAxTGpJM05Td3lMamsxTFRrdU5URXhZekF0TWk0Mk9UTXRNQzR5TmpRdE5TNDNNUzB3TGpnd01pMDVMakExTVVNek9ESXVNalF4TERJdU1URXhMRE0zT0M0NE9UUXRNQzR4T0RRc016YzFMalUwTERBdU1qUTBlaUl2UGcwS0lDQThMMmMrRFFvOEwyYytEUW84Wno0TkNqd3ZaejROQ2p4blBnMEtQQzluUGcwS1BHYytEUW84TDJjK0RRbzhaejROQ2p3dlp6NE5DanhuUGcwS1BDOW5QZzBLUEdjK0RRbzhMMmMrRFFvOFp6NE5Dand2Wno0TkNqeG5QZzBLUEM5blBnMEtQR2MrRFFvOEwyYytEUW84Wno0TkNqd3ZaejROQ2p4blBnMEtQQzluUGcwS1BHYytEUW84TDJjK0RRbzhaejROQ2p3dlp6NE5DanhuUGcwS1BDOW5QZzBLUEdjK0RRbzhMMmMrRFFvOEwzTjJaejROQ2c9PSIgLz48L3N2Zz4="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNTI1IiBoZWlnaHQ9IjUyNSI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSI1MjUiIGhlaWdodD0iNTI1IiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUIyWlhKemFXOXVQU0l4TGpFaUlHbGtQU0pEWVhCaFh6RWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdlRzFzYm5NNmVHeHBibXM5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zaUlIZzlJakJ3ZUNJZ2VUMGlNSEI0SWcwS0lDQWdkMmxrZEdnOUlqVXlOUzR4TkRKd2VDSWdhR1ZwWjJoMFBTSTFNalV1TVRReWNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBMU1qVXVNVFF5SURVeU5TNHhORElpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRFV5TlM0eE5ESWdOVEkxTGpFME1qc2lEUW9nSUNCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5DanhuUGcwS0lDQThaejROQ2lBZ0lDQThjR0YwYUNCa1BTSk5NemMxTGpVMExEQXVNalEwWXkweE15NHpNellzTVM0Mk9Ea3RNall1T0RNc01pNDROeTAwTUM0ME9UWXNNeTQxTlRaakxURTFMamMwTVN3d0xqYzVOaTB5Tnk0NU9EY3NNUzR4T0RndE16WXVOekkzTERFdU1UZzREUW9nSUNBZ0lDQmpMVEV3TGpBMk55d3dMVEl5TGpBNE55MHdMalV4TkMwek5pNHdOekV0TVM0MU56bGpMVEV5TGpJeU9DMHdMamt4T0MweU5TNHlPREl0TWk0d05TMHpPUzR4TmpJdE15NHpOemhqTFRNdU16WTJMVEF1TXpJMExUWXVPVFU0TERJdU1ERTBMVGN1T0RBekxEVXVNamc0RFFvZ0lDQWdJQ0JqTFRFdU1EVXpMRFF1TURnNExURXVOVGN6TERjdU5ERTRMVEV1TlRjekxEa3VPVGMyWXpBc05pNDROek1zTkM0NE1EUXNNVEV1TURrMUxERTBMalF5TlN3eE1pNDJPR014TWk0Mk9ERXNNUzQxTnprc01qQXVOall4TERVdU1ESTFMREl6TGprME1Td3hNQzR6TURZTkNpQWdJQ0FnSUdNekxqSTRMRFV1TWpneUxEUXVNRE01TERFeUxqWTNOU3d5TGpJNU5Td3lNaTR4T1RGc0xUWTBMakkyTml3ME1ETXVNemswWXkweExqYzFOaXd4TUM0d05ETXROUzQwTnpnc01UY3VOVGMyTFRFeExqRTFOeXd5TWk0MU9Ea05DaUFnSUNBZ0lHTXROUzQyT0RZc05TNHdNalF0TVRRdU1qRXNPQzQxT1RrdE1qVXVOVGMxTERFd0xqWTVOMk10TkM0NE1UWXNNUzR3TmpVdE55NDVPRGNzTWk0Mk5qSXRPUzQxTURRc05DNDNOVFZqTFRFdU5UUXlMREl1TVRFNExUSXVNamsxTERVdU1qZ3lMVEl1TWprMUxEa3VOVEU0RFFvZ0lDQWdJQ0JqTUN3eUxqVTJNeXd3TGpJME5TdzFMak15TkN3d0xqY3lPQ3c0TGpJNFl6QXVOVFExTERNdU16TTFMRE11T1RZMkxEVXVOamszTERjdU16STJMRFV1TXpVMFl6RXlMamMwT0MweExqTXhMREkxTGpJMU55MHlMalF5TkN3ek55NDFNamd0TXk0ek1qa05DaUFnSUNBZ0lHTXhOQzR4T1RndE1TNHdOalVzTWpVdU5qY3pMVEV1TlRjNUxETTBMalF5TlMweExqVTNPV014TUM0d05UVXNNQ3d5TWk0NU5UY3NNQzQxTVRRc016Z3VOamszTERFdU5UYzVZekV6TGpjMk5Dd3dMamt5TkN3eU55NDJPREVzTWk0d05TdzBNUzQzT0RFc015NHpPRFFOQ2lBZ0lDQWdJR016TGpNMk5pd3dMak14T0N3MkxqYzROeTB5TGpBMk9DdzNMak16TWkwMUxqUXdNMk13TGpRNE15MHlMamsxTml3d0xqY3lPUzAxTGpjeExEQXVOekk1TFRndU1qaGpNQzAzTGpNNU5DMDBMakUyTWkweE1pNHhORGd0TVRJdU5EWXhMVEUwTGpJM01nMEtJQ0FnSUNBZ1l5MHhNUzQ0TURZdE1pNDJNemd0TVRrdU9EazJMVFV1T1RReUxUSTBMakkyTmkwNUxqa3dNV010TkM0ek56WXRNeTQ1TmkwMUxqWTROaTB4TVM0eU1qVXRNeTQ1TXpVdE1qRXVOemswVERNek1pNDBNVGdzTmpJdU1EVU5DaUFnSUNBZ0lHTXhMamN6T0MweE1DNDFOak1zTlM0eE1qa3RNVGd1TWpJMUxERXdMakUyTlMweU1pNDVPR00xTGpBeE9TMDBMamMxTlN3eE15NDJOaTA0TGpFNE1pd3lOUzQ1TURZdE1UQXVNekEyWXpZdU1USXRNUzR3TlRNc01UQXVNVGN5TFRJdU5qTTRMREV5TGpFekxUUXVOelUxRFFvZ0lDQWdJQ0JqTVM0NU56RXRNaTR4TURVc01pNDVOUzAxTGpJM05Td3lMamsxTFRrdU5URXhZekF0TWk0Mk9UTXRNQzR5TmpRdE5TNDNNUzB3TGpnd01pMDVMakExTVVNek9ESXVNalF4TERJdU1URXhMRE0zT0M0NE9UUXRNQzR4T0RRc016YzFMalUwTERBdU1qUTBlaUl2UGcwS0lDQThMMmMrRFFvOEwyYytEUW84Wno0TkNqd3ZaejROQ2p4blBnMEtQQzluUGcwS1BHYytEUW84TDJjK0RRbzhaejROQ2p3dlp6NE5DanhuUGcwS1BDOW5QZzBLUEdjK0RRbzhMMmMrRFFvOFp6NE5Dand2Wno0TkNqeG5QZzBLUEM5blBnMEtQR2MrRFFvOEwyYytEUW84Wno0TkNqd3ZaejROQ2p4blBnMEtQQzluUGcwS1BHYytEUW84TDJjK0RRbzhaejROQ2p3dlp6NE5DanhuUGcwS1BDOW5QZzBLUEdjK0RRbzhMMmMrRFFvOEwzTjJaejROQ2c9PSIgLz48L3N2Zz4="); } .wmd-latex-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yNDkgLTAuNjE0IC0wLjY3MiAwLjAwMCAxLjAzNSAtMC42NDYgMC4yODggLTAuNjY0IDAuMDAwIDEuMDIwIC0wLjYzNiAtMC42MDkgMC4yNTAgMC4wMDAgMC45OTQgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QmxibUZpYkdVdFltRmphMmR5YjNWdVpEMGlibVYzSURBZ01DQTJOQ0EyTkNJZ2FHVnBaMmgwUFNJMk5IQjRJaUJwWkQwaVRHRjVaWEpmTVNJZ2RtVnljMmx2YmowaU1TNHhJaUIyYVdWM1FtOTRQU0l3SURBZ05qUWdOalFpSUhkcFpIUm9QU0kyTkhCNElpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNDhjR0YwYUNCa1BTSk5ORFV1TnpNc05qUklNelF1TnpVeVl5MHdMamN4TlN3d0xURXVNamsxTFRBdU1UY3pMVEV1TnpNNExUQXVOVEp6TFRBdU56azBMVEF1TnpVNExURXVNRFUyTFRFdU1qTTBiQzA1TGpRNE5DMHhOaTQxTmpRZ0lHTXRNQzR4TnpRc01DNDBOemd0TUM0ek5qa3NNQzQ0T0RjdE1DNDFPRFFzTVM0eU16UnNMVGd1T0RNMUxERTFMak16WXkwd0xqTXdOQ3d3TGpRek5DMHdMalkyTVN3d0xqZ3pOQzB4TGpBM01pd3hMakl3TVVNeE1TNDFOeklzTmpNdU9ERTJMREV4TGpBME1TdzJOQ3d4TUM0ek9URXNOalJJTUM0eE1qY2dJRXd4TlM0ek5pd3pPUzQyTkRGTU1DNDNNVElzTVRZdU5qYzFTREV4TGpZNVl6QXVOekUwTERBc01TNHlOQ3d3TGpBNU15d3hMalUzTml3d0xqSTNObU13TGpNek5Td3dMakU0TlN3d0xqWXpOQ3d3TGpRNU15d3dMamc1TXl3d0xqa3lObXc1TGpReUxERTFMamswT0NBZ1l6QXVNVEE0TFRBdU1qZ3NNQzR5TXpJdE1DNDFOVElzTUM0ek56UXRNQzQ0TVRKak1DNHhOQzB3TGpJMk1pd3dMakk1Tnkwd0xqVXpNU3d3TGpRM01TMHdMamd4TTJ3NExqSTFMVEUwTGpFMk1XTXdMak13TlMwd0xqUTNOeXd3TGpZeU1pMHdMamd5TXl3d0xqazFPQzB4TGpBMElDQmpNQzR6TXpZdE1DNHlNVGNzTUM0M05USXRNQzR6TWpVc01TNHlOVEV0TUM0ek1qVm9NVEF1TlRJMFRETXdMalUyTWl3ek9TNHhPRFpNTkRVdU56TXNOalI2SWk4K1BIQmhkR2dnWkQwaVRUWXhMamcwTERJekxqZzJZekF1TmpZM0xEQXNNUzR4T1RNc01DNHhPRE1zTVM0MU9Dd3dMalUxWXpBdU16ZzNMREF1TXpZMkxEQXVOVGdzTUM0NE5Td3dMalU0TERFdU5EVjJNeTQyU0RRekxqVXlNWFl0TW1Nd0xUQXVNemczTERBdU1EYzVMVEF1T0N3d0xqSXpPUzB4TGpJMElDQmpNQzR4Tmkwd0xqUXpPU3d3TGpRMExUQXVPRFFzTUM0NE5DMHhMakpzT0M0MExUZ3VORFpqTUM0M01qRXRNQzQzTWl3eExqTTBOeTB4TGpRd05pd3hMamc0TVMweUxqQTJZekF1TlRNekxUQXVOalV6TERBdU9UY3pMVEV1TWprM0xERXVNekU1TFRFdU9UTWdJR013TGpNME55MHdMall6TkN3d0xqWXdOaTB4TGpJMk55d3dMamM0TFRFdU9XTXdMakUzTXkwd0xqWXpNeXd3TGpJMkxURXVNekEwTERBdU1qWXRNaTR3TVdNd0xURXVNVFl0TUM0eU56Y3RNaTR3TlMwd0xqZ3pMVEl1TmpjZ0lHTXRNQzQxTlRNdE1DNDJNaTB4TGpNNU5pMHdMamt6TFRJdU5USTVMVEF1T1ROakxUQXVPVElzTUMweExqWTVOeXd3TGpJME15MHlMak16TERBdU56TmpMVEF1TmpNMExEQXVORGczTFRFdU1EY3NNUzR3T1MweExqTXhNU3d4TGpneElDQmpMVEF1TWpjNUxEQXVOek16TFRBdU5qUTJMREV1TWpJdE1TNHhMREV1TkRaakxUQXVORFV6TERBdU1qUXRNUzR4TERBdU1qa3pMVEV1T1RRc01DNHhObXd0TXk0eU9DMHdMalU0WXpBdU1qRXpMVEV1TkRVekxEQXVOakl6TFRJdU56SXNNUzR5TXkwekxqZ2dJR013TGpZd05pMHhMakE0TERFdU16VTVMVEV1T1Rnc01pNHlOaTB5TGpkak1DNDVMVEF1TnpJc01TNDVNeTB4TGpJMU55d3pMakE1TFRFdU5qRkROVEV1TmpZc01DNHhOemNzTlRJdU9UQTJMREFzTlRRdU1qUXNNR014TGpRek9Td3dMREl1TnpNMkxEQXVNakVzTXk0NE9URXNNQzQyTXlBZ1l6RXVNVFV5TERBdU5ESXNNaTR4TXpjc01TNHdNRE1zTWk0NU5Ea3NNUzQzTldNd0xqZ3hNeXd3TGpjME55d3hMalF6T0N3eExqWXpOeXd4TGpnM0xESXVOamRETmpNdU16Z3pMRFl1TURnekxEWXpMallzTnk0eU1pdzJNeTQyTERndU5EWWdJR013TERFdU1EWTJMVEF1TVRRNUxESXVNRFUwTFRBdU5EUTVMREl1T1RaakxUQXVNekF4TERBdU9UQTNMVEF1TnpFc01TNDNOekV0TVM0eU15d3lMalU1WXkwd0xqVXlMREF1T0RJdE1TNHhNak1zTVM0Mk1UTXRNUzQ0TVN3eUxqTTRJQ0JqTFRBdU5qZzNMREF1TnpZNExURXVOREUzTERFdU5UUTBMVEl1TVRrc01pNHpNMnd0TlM0Mk9Ua3NOUzQ0TkdNd0xqY3pNaTB3TGpJeU55d3hMalExT1Mwd0xqTTVPU3d5TGpFNExUQXVOVEpqTUM0M01pMHdMakV5TERFdU16ZzNMVEF1TVRnc01pMHdMakU0U0RZeExqZzBlaUl2UGp3dmMzWm5QZz09IiAvPjwvc3ZnPg=="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yMDcgLTAuNTA5IC0wLjU1NyAwLjAwMCAwLjg1OSAtMC41MzYgMC4yMzkgLTAuNTUxIDAuMDAwIDAuODQ3IC0wLjUyOCAtMC41MDYgMC4yMDggMC4wMDAgMC44MjUgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QmxibUZpYkdVdFltRmphMmR5YjNWdVpEMGlibVYzSURBZ01DQTJOQ0EyTkNJZ2FHVnBaMmgwUFNJMk5IQjRJaUJwWkQwaVRHRjVaWEpmTVNJZ2RtVnljMmx2YmowaU1TNHhJaUIyYVdWM1FtOTRQU0l3SURBZ05qUWdOalFpSUhkcFpIUm9QU0kyTkhCNElpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNDhjR0YwYUNCa1BTSk5ORFV1TnpNc05qUklNelF1TnpVeVl5MHdMamN4TlN3d0xURXVNamsxTFRBdU1UY3pMVEV1TnpNNExUQXVOVEp6TFRBdU56azBMVEF1TnpVNExURXVNRFUyTFRFdU1qTTBiQzA1TGpRNE5DMHhOaTQxTmpRZ0lHTXRNQzR4TnpRc01DNDBOemd0TUM0ek5qa3NNQzQ0T0RjdE1DNDFPRFFzTVM0eU16UnNMVGd1T0RNMUxERTFMak16WXkwd0xqTXdOQ3d3TGpRek5DMHdMalkyTVN3d0xqZ3pOQzB4TGpBM01pd3hMakl3TVVNeE1TNDFOeklzTmpNdU9ERTJMREV4TGpBME1TdzJOQ3d4TUM0ek9URXNOalJJTUM0eE1qY2dJRXd4TlM0ek5pd3pPUzQyTkRGTU1DNDNNVElzTVRZdU5qYzFTREV4TGpZNVl6QXVOekUwTERBc01TNHlOQ3d3TGpBNU15d3hMalUzTml3d0xqSTNObU13TGpNek5Td3dMakU0TlN3d0xqWXpOQ3d3TGpRNU15d3dMamc1TXl3d0xqa3lObXc1TGpReUxERTFMamswT0NBZ1l6QXVNVEE0TFRBdU1qZ3NNQzR5TXpJdE1DNDFOVElzTUM0ek56UXRNQzQ0TVRKak1DNHhOQzB3TGpJMk1pd3dMakk1Tnkwd0xqVXpNU3d3TGpRM01TMHdMamd4TTJ3NExqSTFMVEUwTGpFMk1XTXdMak13TlMwd0xqUTNOeXd3TGpZeU1pMHdMamd5TXl3d0xqazFPQzB4TGpBMElDQmpNQzR6TXpZdE1DNHlNVGNzTUM0M05USXRNQzR6TWpVc01TNHlOVEV0TUM0ek1qVm9NVEF1TlRJMFRETXdMalUyTWl3ek9TNHhPRFpNTkRVdU56TXNOalI2SWk4K1BIQmhkR2dnWkQwaVRUWXhMamcwTERJekxqZzJZekF1TmpZM0xEQXNNUzR4T1RNc01DNHhPRE1zTVM0MU9Dd3dMalUxWXpBdU16ZzNMREF1TXpZMkxEQXVOVGdzTUM0NE5Td3dMalU0TERFdU5EVjJNeTQyU0RRekxqVXlNWFl0TW1Nd0xUQXVNemczTERBdU1EYzVMVEF1T0N3d0xqSXpPUzB4TGpJMElDQmpNQzR4Tmkwd0xqUXpPU3d3TGpRMExUQXVPRFFzTUM0NE5DMHhMakpzT0M0MExUZ3VORFpqTUM0M01qRXRNQzQzTWl3eExqTTBOeTB4TGpRd05pd3hMamc0TVMweUxqQTJZekF1TlRNekxUQXVOalV6TERBdU9UY3pMVEV1TWprM0xERXVNekU1TFRFdU9UTWdJR013TGpNME55MHdMall6TkN3d0xqWXdOaTB4TGpJMk55d3dMamM0TFRFdU9XTXdMakUzTXkwd0xqWXpNeXd3TGpJMkxURXVNekEwTERBdU1qWXRNaTR3TVdNd0xURXVNVFl0TUM0eU56Y3RNaTR3TlMwd0xqZ3pMVEl1TmpjZ0lHTXRNQzQxTlRNdE1DNDJNaTB4TGpNNU5pMHdMamt6TFRJdU5USTVMVEF1T1ROakxUQXVPVElzTUMweExqWTVOeXd3TGpJME15MHlMak16TERBdU56TmpMVEF1TmpNMExEQXVORGczTFRFdU1EY3NNUzR3T1MweExqTXhNU3d4TGpneElDQmpMVEF1TWpjNUxEQXVOek16TFRBdU5qUTJMREV1TWpJdE1TNHhMREV1TkRaakxUQXVORFV6TERBdU1qUXRNUzR4TERBdU1qa3pMVEV1T1RRc01DNHhObXd0TXk0eU9DMHdMalU0WXpBdU1qRXpMVEV1TkRVekxEQXVOakl6TFRJdU56SXNNUzR5TXkwekxqZ2dJR013TGpZd05pMHhMakE0TERFdU16VTVMVEV1T1Rnc01pNHlOaTB5TGpkak1DNDVMVEF1TnpJc01TNDVNeTB4TGpJMU55d3pMakE1TFRFdU5qRkROVEV1TmpZc01DNHhOemNzTlRJdU9UQTJMREFzTlRRdU1qUXNNR014TGpRek9Td3dMREl1TnpNMkxEQXVNakVzTXk0NE9URXNNQzQyTXlBZ1l6RXVNVFV5TERBdU5ESXNNaTR4TXpjc01TNHdNRE1zTWk0NU5Ea3NNUzQzTldNd0xqZ3hNeXd3TGpjME55d3hMalF6T0N3eExqWXpOeXd4TGpnM0xESXVOamRETmpNdU16Z3pMRFl1TURnekxEWXpMallzTnk0eU1pdzJNeTQyTERndU5EWWdJR013TERFdU1EWTJMVEF1TVRRNUxESXVNRFUwTFRBdU5EUTVMREl1T1RaakxUQXVNekF4TERBdU9UQTNMVEF1TnpFc01TNDNOekV0TVM0eU15d3lMalU1WXkwd0xqVXlMREF1T0RJdE1TNHhNak1zTVM0Mk1UTXRNUzQ0TVN3eUxqTTRJQ0JqTFRBdU5qZzNMREF1TnpZNExURXVOREUzTERFdU5UUTBMVEl1TVRrc01pNHpNMnd0TlM0Mk9Ua3NOUzQ0TkdNd0xqY3pNaTB3TGpJeU55d3hMalExT1Mwd0xqTTVPU3d5TGpFNExUQXVOVEpqTUM0M01pMHdMakV5TERFdU16ZzNMVEF1TVRnc01pMHdMakU0U0RZeExqZzBlaUl2UGp3dmMzWm5QZz09IiAvPjwvc3ZnPg=="); } .wmd-latex-button-display { background-image: url("http://localhost:8000/static/pagedown/resources/latex-display.svg"); @@ -3174,10 +3202,10 @@ a.voted { background-image: url("http://localhost:8000/static/pagedown/resources/link.svg"); } .wmd-user-reference-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yNDkgLTAuNjE0IC0wLjY3MiAwLjAwMCAxLjAzNSAtMC42NDYgMC4yODggLTAuNjY0IDAuMDAwIDEuMDIwIC0wLjYzNiAtMC42MDkgMC4yNTAgMC4wMDAgMC45OTQgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnYUdWcFoyaDBQU0l5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUIzYVdSMGFEMGlNalFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZZMk05SW1oMGRIQTZMeTlqY21WaGRHbDJaV052YlcxdmJuTXViM0puTDI1ekl5SWdlRzFzYm5NNlpHTTlJbWgwZEhBNkx5OXdkWEpzTG05eVp5OWtZeTlsYkdWdFpXNTBjeTh4TGpFdklpQjRiV3h1Y3pweVpHWTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1Rrdk1ESXZNakl0Y21SbUxYTjViblJoZUMxdWN5TWlQanhuSUhSeVlXNXpabTl5YlQwaWRISmhibk5zWVhSbEtEQWdMVEV3TWpndU5Da2lQanh3WVhSb0lHUTlJbTB4TWlBd1l5MHdMalF3TlNBd0xUQXVPREExSURBdU1EWXdNekkyTFRFdU1UZzRJREF1TVRVMk1qVXRNQzR5TWpRZ01DNHdOVFkzT0Mwd0xqUTBJREF1TVRNeE16VXRNQzQyTlRZZ01DNHlNVGczTlMwd0xqQTRNeUF3TGpBek5EQXhMVEF1TVRZM09TQXdMakExTlRNMExUQXVNalE1T0NBd0xqQTVNemMxTFRBdU1ETTBJREF1TURFMU9ETXRNQzR3TmlBd0xqQTBOVGswTFRBdU1Ea3pOeUF3TGpBMk1qVXRNQzR5TURNeUlEQXVNVEF3TlRndE1DNDBNREl4SURBdU1qRTNNRFF0TUM0MU9UTTNJREF1TXpRek56VXRNQzR3TWpjZ01DNHdNVGMwTFRBdU1EWTNNU0F3TGpBeE16TTVMVEF1TURrek9DQXdMakF6TVRJMUxUQXVNRFUyTXlBd0xqQXpPRFkwTFRBdU1UQXhJREF1TURnME1Ua3RNQzR4TlRZeUlEQXVNVEkwT1RVdE1DNHhOVFk1SURBdU1URXlOaTB3TGpNeU1UWWdNQzR5TVRZdE1DNDBOamc0SURBdU16UXpPQzB3TGpFek5ESWdNQzR4TWpBM0xUQXVNalE1TkNBd0xqSTNNalF0TUM0ek56VWdNQzQwTURZeUxUQXVOREkxTVNBd0xqUXpOVGt0TUM0M09UTTJJREF1T0RrM01TMHhMakE1TXpnZ01TNDBNemMyTFRBdU5URTFOQ0F3TGprd016UXRNQzQ1TURBeUlERXVPVEl3TlMweExqQTJNalFnTWk0NU5qZzNMVEF1TURjNE15MHdMakF4TmpVdE1DNHhOVEF4TFRBdU1ESXlOQzB3TGpJeE9EZ2dNQzB3TGpVeU5URWdNQzR4TnpFdE1DNDJOVFExSURFdU1UWTROUzB3TGpNeE1qVWdNaTR5TVRnM0lEQXVNakF3TnlBd0xqWXhOak1nTUM0MU16UTJJREV1TVRBeE5TQXdMamczTlNBeExqTTNOU0F3TGpRMU56TWdNUzQzTnpjNElERXVOREkxTnlBekxqSTFPVGdnTWk0Mk9EYzFJRFF1TVRnM09IWXhMakF6TVd3dE1TQXhMVElnTVdNdE1TNDJNVGN6SURBdU9EQXhMVE11TWpJNE5DQXhMall3TlMwMExqZzBNemdnTWk0ME1EWXRNQzQ0T1RVeE15QXdMalUwTFRFdU1qUXhOU0F4TGpZdE1TNHhOVFl5SURJdU5UazBJREF1TURReE5qWTBJREF1TmpJMkxUQXVNVGcwTkRnZ01TNDBNamNnTUM0ME16YzFJREV1T0RRMElEQXVOVGt3T1NBd0xqTXdOQ0F4TGpJNU5Ua2dNQzR4TURZZ01TNDVNemMxSURBdU1UVTJJREV1T0RjMk5pMHdMakF3TVNBekxqYzBPRFFnTUNBMUxqWXlOU0F3SURJdU5qWTVJREF1TURBeElEVXVNek14SURBZ09DQXdJREl1TXpZM0lEQWdOQzQzTWpjZ01DNHdNRFFnTnk0d09UUWdNQ0F3TGpjMk9DMHdMakExTkNBd0xqazRNUzB3TGpnMk5TQXdMamt3TmkweExqVWdNQzR3TVRRdE1DNDVNeklnTUM0d05qa3RNUzQ1TnpZdE1DNDJOVFl0TWk0Mk9EZ3RNQzQxT1RJdE1DNDJNREl0TVM0ME16UXRNQzQ0TkMweUxqRTFOaTB4TGpJMUxURXVNRFl4TFRBdU5USTFMVEl1TVRJNExURXVNRE0zTFRNdU1UZzRMVEV1TlRZeWJDMHlMVEV0TVMweGRpMHhMakF6TVdNeExqSTJNaTB3TGpreU9DQXlMakl6TFRJdU5ERWdNaTQyT0RndE5DNHhPRGM0SURBdU16UXRNQzR5TnpNMklEQXVOamMwTFRBdU56VTRPQ0F3TGpnM05DMHhMak0zTlNBd0xqTTBNaTB4TGpBMU1ESWdNQzR5TVRNdE1pNHdORGMzTFRBdU16RXlMVEl1TWpFNE55MHdMakEyT1Mwd0xqQXlNalF0TUM0eE5DMHdMakF4TmpVdE1DNHlNVGtnTUMwd0xqRTJNaTB4TGpBME9ESXRNQzQxTkRjdE1pNHdOalV6TFRFdU1EWXlMVEl1T1RZNE55MHdMak10TUM0MU5EQTFMVEF1TmpZNUxURXVNREF4TnkweExqQTVOQzB4TGpRek56WXRNQzR4TWpZdE1DNHhNek00TFRBdU1qUXhMVEF1TWpnMU5TMHdMak0zTlMwd0xqUXdOakl0TUM0d01EWXRNQzR3TURVMUxUQXVNREkxSURBdU1EQTFOUzB3TGpBek1TQXdMVEF1TXpreUxUQXVNelE1T1Mwd0xqZ3lOeTB3TGpZeE9EazBMVEV1TWpneExUQXVPRFF6TnpVdE1DNHhNVFV0TUM0d05UWXlNaTB3TGpJeU55MHdMakV3T0RVMExUQXVNelEwTFRBdU1UVTJNalV0TUM0d09EUXRNQzR3TXpRd01TMHdMakUyTlMwd0xqQTJOREkyTFRBdU1qVXRNQzR3T1RNM05TMHdMakkxTlMwd0xqQTRPRFE0TFRBdU5URTJMVEF1TVRjek5UWXRNQzQzT0RJdE1DNHlNVGczTlMwd0xqQXlMVEF1TURBek5EQTFMVEF1TURReUlEQXVNREF6TVRRNExUQXVNRFl5SURBdE1DNHlORGt0TUM0d016a3hORFF0TUM0ME9UVXRNQzR3TmpVeU5TMHdMamMxTFRBdU1EWXlOWG9pSUdacGJHdzlJaU16TkRRNU5XVWlJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RBZ01UQXlPQzQwS1NJdlBqeHdZWFJvSUdROUltMHdJREV3TlRFdU5HTXdMakF5TmpReE9TQXdMak1nTUM0eE1qWTFNU0F3TGpZZ01DNDBNemMxSURBdU9DQXdMalU1TURrZ01DNHpJREV1TWprMU9TQXdMakVnTVM0NU16YzFJREF1TW1nMUxqWXlOU0E0SURjdU1EazBZekF1TlRjMkxUQXVNU0F3TGpnME1pMHdMalVnTUM0NU1EWXRNV2d0TWpSNklpQm1hV3hzUFNJak1tTXpaVFV3SWk4K1BDOW5Qand2YzNablBnPT0iIC8+PC9zdmc+"); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yMDcgLTAuNTA5IC0wLjU1NyAwLjAwMCAwLjg1OSAtMC41MzYgMC4yMzkgLTAuNTUxIDAuMDAwIDAuODQ3IC0wLjUyOCAtMC41MDYgMC4yMDggMC4wMDAgMC44MjUgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnYUdWcFoyaDBQU0l5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUIzYVdSMGFEMGlNalFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZZMk05SW1oMGRIQTZMeTlqY21WaGRHbDJaV052YlcxdmJuTXViM0puTDI1ekl5SWdlRzFzYm5NNlpHTTlJbWgwZEhBNkx5OXdkWEpzTG05eVp5OWtZeTlsYkdWdFpXNTBjeTh4TGpFdklpQjRiV3h1Y3pweVpHWTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1Rrdk1ESXZNakl0Y21SbUxYTjViblJoZUMxdWN5TWlQanhuSUhSeVlXNXpabTl5YlQwaWRISmhibk5zWVhSbEtEQWdMVEV3TWpndU5Da2lQanh3WVhSb0lHUTlJbTB4TWlBd1l5MHdMalF3TlNBd0xUQXVPREExSURBdU1EWXdNekkyTFRFdU1UZzRJREF1TVRVMk1qVXRNQzR5TWpRZ01DNHdOVFkzT0Mwd0xqUTBJREF1TVRNeE16VXRNQzQyTlRZZ01DNHlNVGczTlMwd0xqQTRNeUF3TGpBek5EQXhMVEF1TVRZM09TQXdMakExTlRNMExUQXVNalE1T0NBd0xqQTVNemMxTFRBdU1ETTBJREF1TURFMU9ETXRNQzR3TmlBd0xqQTBOVGswTFRBdU1Ea3pOeUF3TGpBMk1qVXRNQzR5TURNeUlEQXVNVEF3TlRndE1DNDBNREl4SURBdU1qRTNNRFF0TUM0MU9UTTNJREF1TXpRek56VXRNQzR3TWpjZ01DNHdNVGMwTFRBdU1EWTNNU0F3TGpBeE16TTVMVEF1TURrek9DQXdMakF6TVRJMUxUQXVNRFUyTXlBd0xqQXpPRFkwTFRBdU1UQXhJREF1TURnME1Ua3RNQzR4TlRZeUlEQXVNVEkwT1RVdE1DNHhOVFk1SURBdU1URXlOaTB3TGpNeU1UWWdNQzR5TVRZdE1DNDBOamc0SURBdU16UXpPQzB3TGpFek5ESWdNQzR4TWpBM0xUQXVNalE1TkNBd0xqSTNNalF0TUM0ek56VWdNQzQwTURZeUxUQXVOREkxTVNBd0xqUXpOVGt0TUM0M09UTTJJREF1T0RrM01TMHhMakE1TXpnZ01TNDBNemMyTFRBdU5URTFOQ0F3TGprd016UXRNQzQ1TURBeUlERXVPVEl3TlMweExqQTJNalFnTWk0NU5qZzNMVEF1TURjNE15MHdMakF4TmpVdE1DNHhOVEF4TFRBdU1ESXlOQzB3TGpJeE9EZ2dNQzB3TGpVeU5URWdNQzR4TnpFdE1DNDJOVFExSURFdU1UWTROUzB3TGpNeE1qVWdNaTR5TVRnM0lEQXVNakF3TnlBd0xqWXhOak1nTUM0MU16UTJJREV1TVRBeE5TQXdMamczTlNBeExqTTNOU0F3TGpRMU56TWdNUzQzTnpjNElERXVOREkxTnlBekxqSTFPVGdnTWk0Mk9EYzFJRFF1TVRnM09IWXhMakF6TVd3dE1TQXhMVElnTVdNdE1TNDJNVGN6SURBdU9EQXhMVE11TWpJNE5DQXhMall3TlMwMExqZzBNemdnTWk0ME1EWXRNQzQ0T1RVeE15QXdMalUwTFRFdU1qUXhOU0F4TGpZdE1TNHhOVFl5SURJdU5UazBJREF1TURReE5qWTBJREF1TmpJMkxUQXVNVGcwTkRnZ01TNDBNamNnTUM0ME16YzFJREV1T0RRMElEQXVOVGt3T1NBd0xqTXdOQ0F4TGpJNU5Ua2dNQzR4TURZZ01TNDVNemMxSURBdU1UVTJJREV1T0RjMk5pMHdMakF3TVNBekxqYzBPRFFnTUNBMUxqWXlOU0F3SURJdU5qWTVJREF1TURBeElEVXVNek14SURBZ09DQXdJREl1TXpZM0lEQWdOQzQzTWpjZ01DNHdNRFFnTnk0d09UUWdNQ0F3TGpjMk9DMHdMakExTkNBd0xqazRNUzB3TGpnMk5TQXdMamt3TmkweExqVWdNQzR3TVRRdE1DNDVNeklnTUM0d05qa3RNUzQ1TnpZdE1DNDJOVFl0TWk0Mk9EZ3RNQzQxT1RJdE1DNDJNREl0TVM0ME16UXRNQzQ0TkMweUxqRTFOaTB4TGpJMUxURXVNRFl4TFRBdU5USTFMVEl1TVRJNExURXVNRE0zTFRNdU1UZzRMVEV1TlRZeWJDMHlMVEV0TVMweGRpMHhMakF6TVdNeExqSTJNaTB3TGpreU9DQXlMakl6TFRJdU5ERWdNaTQyT0RndE5DNHhPRGM0SURBdU16UXRNQzR5TnpNMklEQXVOamMwTFRBdU56VTRPQ0F3TGpnM05DMHhMak0zTlNBd0xqTTBNaTB4TGpBMU1ESWdNQzR5TVRNdE1pNHdORGMzTFRBdU16RXlMVEl1TWpFNE55MHdMakEyT1Mwd0xqQXlNalF0TUM0eE5DMHdMakF4TmpVdE1DNHlNVGtnTUMwd0xqRTJNaTB4TGpBME9ESXRNQzQxTkRjdE1pNHdOalV6TFRFdU1EWXlMVEl1T1RZNE55MHdMak10TUM0MU5EQTFMVEF1TmpZNUxURXVNREF4TnkweExqQTVOQzB4TGpRek56WXRNQzR4TWpZdE1DNHhNek00TFRBdU1qUXhMVEF1TWpnMU5TMHdMak0zTlMwd0xqUXdOakl0TUM0d01EWXRNQzR3TURVMUxUQXVNREkxSURBdU1EQTFOUzB3TGpBek1TQXdMVEF1TXpreUxUQXVNelE1T1Mwd0xqZ3lOeTB3TGpZeE9EazBMVEV1TWpneExUQXVPRFF6TnpVdE1DNHhNVFV0TUM0d05UWXlNaTB3TGpJeU55MHdMakV3T0RVMExUQXVNelEwTFRBdU1UVTJNalV0TUM0d09EUXRNQzR3TXpRd01TMHdMakUyTlMwd0xqQTJOREkyTFRBdU1qVXRNQzR3T1RNM05TMHdMakkxTlMwd0xqQTRPRFE0TFRBdU5URTJMVEF1TVRjek5UWXRNQzQzT0RJdE1DNHlNVGczTlMwd0xqQXlMVEF1TURBek5EQTFMVEF1TURReUlEQXVNREF6TVRRNExUQXVNRFl5SURBdE1DNHlORGt0TUM0d016a3hORFF0TUM0ME9UVXRNQzR3TmpVeU5TMHdMamMxTFRBdU1EWXlOWG9pSUdacGJHdzlJaU16TkRRNU5XVWlJSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0RBZ01UQXlPQzQwS1NJdlBqeHdZWFJvSUdROUltMHdJREV3TlRFdU5HTXdMakF5TmpReE9TQXdMak1nTUM0eE1qWTFNU0F3TGpZZ01DNDBNemMxSURBdU9DQXdMalU1TURrZ01DNHpJREV1TWprMU9TQXdMakVnTVM0NU16YzFJREF1TW1nMUxqWXlOU0E0SURjdU1EazBZekF1TlRjMkxUQXVNU0F3TGpnME1pMHdMalVnTUM0NU1EWXRNV2d0TWpSNklpQm1hV3hzUFNJak1tTXpaVFV3SWk4K1BDOW5Qand2YzNablBnPT0iIC8+PC9zdmc+"); } .wmd-quote-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yNDkgLTAuNjE0IC0wLjY3MiAwLjAwMCAxLjAzNSAtMC42NDYgMC4yODggLTAuNjY0IDAuMDAwIDEuMDIwIC0wLjYzNiAtMC42MDkgMC4yNTAgMC4wMDAgMC45OTQgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1Bqd2hSRTlEVkZsUVJTQnpkbWNnSUZCVlFreEpReUFuTFM4dlZ6TkRMeTlFVkVRZ1UxWkhJREV1TVM4dlJVNG5JQ0FuYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2UjNKaGNHaHBZM012VTFaSEx6RXVNUzlFVkVRdmMzWm5NVEV1WkhSa0p6NDhjM1puSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURRNElEUTRJaUJvWldsbmFIUTlJalE0Y0hnaUlHbGtQU0pNWVhsbGNsOHpJaUIyWlhKemFXOXVQU0l4TGpFaUlIWnBaWGRDYjNnOUlqQWdNQ0EwT0NBME9DSWdkMmxrZEdnOUlqUTRjSGdpSUhodGJEcHpjR0ZqWlQwaWNISmxjMlZ5ZG1VaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpUGp4blBqeHdZWFJvSUdROUlrMHdMREk0TGpNM05XZ3hNaTQyTjJNdE1DNHdOaklzTXk0ek1TMHhMak16T0N3MkxqTXhNeTB6TGpRd015dzRMalpqTFRBdU9UUTFMREF1T0RreUxURXVPVGd5TERFdU5EQTRMVEl1T0RjNUxERXVOekEySUNBZ1l5MHhMakVzTUM0ek1qZ3RNaTR5Tml3d0xqTTVOaTB5TGpnNE15d3dMalF3T0Vnd2RqSXVNamcyYURndU56VjJMVEF1TURBell6Y3VNakExTFRBdU1ETXlMREV6TGpBME15MDFMamd4Tml3eE15NHhOemN0TVRJdU9UazNTREl5ZGkweU1rZ3dWakk0TGpNM05Yb2lJR1pwYkd3OUlpTXlOREZHTWpBaUx6NDhjR0YwYUNCa1BTSk5NallzTmk0ek56VjJNakpvTVRJdU56UmpNQ3d5TGprNU1TMHhMRFV1TnpReUxUSXVOamMwTERjdU9UVTJZeTB3TGpnek9Td3hMakE0T1MweExqZ3lPQ3d4TGpjNU1pMHlMamMyTVN3eUxqSXpNeUFnSUdNdE1DNHdNRGdzTUM0d01EUXRNQzR3TVRZc01DNHdNRGd0TUM0d01qTXNNQzR3TVRKakxUQXVNVE01TERBdU1EWTFMVEF1TWpjMExEQXVNVEl5TFRBdU5EQTVMREF1TVRjMll5MHhMalV4TkN3d0xqVTFOeTB6TGpreE5Td3dMalU0Tnkwekxqa3hOU3d3TGpVNE4wZ3lObll5TGpJNE5tZzRMamMxSUNBZ1l6Y3VNekUzTERBc01UTXVNalV0TlM0NU16TXNNVE11TWpVdE1UTXVNalYyTFRJeVNESTJlaUlnWm1sc2JEMGlJekkwTVVZeU1DSXZQand2Wno0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yMDcgLTAuNTA5IC0wLjU1NyAwLjAwMCAwLjg1OSAtMC41MzYgMC4yMzkgLTAuNTUxIDAuMDAwIDAuODQ3IC0wLjUyOCAtMC41MDYgMC4yMDggMC4wMDAgMC44MjUgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1Bqd2hSRTlEVkZsUVJTQnpkbWNnSUZCVlFreEpReUFuTFM4dlZ6TkRMeTlFVkVRZ1UxWkhJREV1TVM4dlJVNG5JQ0FuYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2UjNKaGNHaHBZM012VTFaSEx6RXVNUzlFVkVRdmMzWm5NVEV1WkhSa0p6NDhjM1puSUdWdVlXSnNaUzFpWVdOclozSnZkVzVrUFNKdVpYY2dNQ0F3SURRNElEUTRJaUJvWldsbmFIUTlJalE0Y0hnaUlHbGtQU0pNWVhsbGNsOHpJaUIyWlhKemFXOXVQU0l4TGpFaUlIWnBaWGRDYjNnOUlqQWdNQ0EwT0NBME9DSWdkMmxrZEdnOUlqUTRjSGdpSUhodGJEcHpjR0ZqWlQwaWNISmxjMlZ5ZG1VaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpUGp4blBqeHdZWFJvSUdROUlrMHdMREk0TGpNM05XZ3hNaTQyTjJNdE1DNHdOaklzTXk0ek1TMHhMak16T0N3MkxqTXhNeTB6TGpRd015dzRMalpqTFRBdU9UUTFMREF1T0RreUxURXVPVGd5TERFdU5EQTRMVEl1T0RjNUxERXVOekEySUNBZ1l5MHhMakVzTUM0ek1qZ3RNaTR5Tml3d0xqTTVOaTB5TGpnNE15d3dMalF3T0Vnd2RqSXVNamcyYURndU56VjJMVEF1TURBell6Y3VNakExTFRBdU1ETXlMREV6TGpBME15MDFMamd4Tml3eE15NHhOemN0TVRJdU9UazNTREl5ZGkweU1rZ3dWakk0TGpNM05Yb2lJR1pwYkd3OUlpTXlOREZHTWpBaUx6NDhjR0YwYUNCa1BTSk5NallzTmk0ek56VjJNakpvTVRJdU56UmpNQ3d5TGprNU1TMHhMRFV1TnpReUxUSXVOamMwTERjdU9UVTJZeTB3TGpnek9Td3hMakE0T1MweExqZ3lPQ3d4TGpjNU1pMHlMamMyTVN3eUxqSXpNeUFnSUdNdE1DNHdNRGdzTUM0d01EUXRNQzR3TVRZc01DNHdNRGd0TUM0d01qTXNNQzR3TVRKakxUQXVNVE01TERBdU1EWTFMVEF1TWpjMExEQXVNVEl5TFRBdU5EQTVMREF1TVRjMll5MHhMalV4TkN3d0xqVTFOeTB6TGpreE5Td3dMalU0Tnkwekxqa3hOU3d3TGpVNE4wZ3lObll5TGpJNE5tZzRMamMxSUNBZ1l6Y3VNekUzTERBc01UTXVNalV0TlM0NU16TXNNVE11TWpVdE1UTXVNalYyTFRJeVNESTJlaUlnWm1sc2JEMGlJekkwTVVZeU1DSXZQand2Wno0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); } .wmd-code-button { background-image: url("http://localhost:8000/static/pagedown/resources/code.svg"); @@ -3186,16 +3214,16 @@ a.voted { background-image: url("http://localhost:8000/static/pagedown/resources/image.svg"); } .wmd-olist-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yNDkgLTAuNjE0IC0wLjY3MiAwLjAwMCAxLjAzNSAtMC42NDYgMC4yODggLTAuNjY0IDAuMDAwIDEuMDIwIC0wLjYzNiAtMC42MDkgMC4yNTAgMC4wMDAgMC45OTQgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnWm1sc2JEMGlibTl1WlNJZ2FHVnBaMmgwUFNJeU5DSWdkbWxsZDBKdmVEMGlNQ0F3SURJMElESTBJaUIzYVdSMGFEMGlNalFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRZdU1EQXdNU0F5TGpjMVF6WXVNREF3TVNBeUxqTTVOVGMzSURVdU56VXlNamNnTWk0d09EazROQ0ExTGpRd05UYzJJREl1TURFMk16TkROUzR3TmpBeE1TQXhMamswTXlBMExqY3hNRE1nTWk0eE1qQTROaUEwTGpVMk5UZ2dNaTQwTkRNd00wdzBMalUyTkRJMklESXVORFEyTXpkRE5DNDFOakl5TmlBeUxqUTFNRFkzSURRdU5UVTRORElnTWk0ME5UZzRNU0EwTGpVMU1qYzFJREl1TkRjd05ESkROQzQxTkRFMElESXVORGt6TmpZZ05DNDFNakk0TWlBeUxqVXpNRFUxSURRdU5EazNNRFFnTWk0MU56Z3dPRU0wTGpRME5USTNJREl1Tmpjek5UWWdOQzR6TmpVNE5DQXlMamd3T1RRMUlEUXVNalU1TkNBeUxqazJNalE0UXpRdU1EUXhOellnTXk0eU56VXpOeUF6TGpjek5UTTRJRE11TmpJME9EZ2dNeTR6TlRJM05TQXpMamcyTXpreFF6TXVNREF4TkRRZ05DNHdPRE16TmlBeUxqZzVORFUySURRdU5UUTJNRFVnTXk0eE1UUXdNU0EwTGpnNU56TTFRek11TXpNek5EWWdOUzR5TkRnMk5pQXpMamM1TmpFMUlEVXVNelUxTlRRZ05DNHhORGMwTmlBMUxqRXpOakE1UXpRdU1qY3lNRFVnTlM0d05UZ3lOaUEwTGpNNE9UVTJJRFF1T1RjME56TWdOQzQxTURBeElEUXVPRGczTmpWV055NHlOVU0wTGpVd01ERWdOeTQyTmpReU1TQTBMamd6TlRnNUlEZ2dOUzR5TlRBeElEaEROUzQyTmpRek1TQTRJRFl1TURBd01TQTNMalkyTkRJeElEWXVNREF3TVNBM0xqSTFWakl1TnpWYUlpQm1hV3hzUFNJak1qRXlNVEl4SWk4K1BIQmhkR2dnWkQwaVRURTVMalE1T1RVZ01UaElNVEF1T1RrNU5Vd3hNQzQ0T0RJNUlERTRMakF3TmpkRE1UQXVNemcxTmlBeE9DNHdOalExSURrdU9UazVOVEVnTVRndU5EZzNNaUE1TGprNU9UVXhJREU1UXprdU9UazVOVEVnTVRrdU5UVXlNeUF4TUM0ME5EY3lJREl3SURFd0xqazVPVFVnTWpCSU1Ua3VORGs1TlV3eE9TNDJNVFl4SURFNUxqazVNek5ETWpBdU1URXpOU0F4T1M0NU16VTFJREl3TGpRNU9UVWdNVGt1TlRFeU9DQXlNQzQwT1RrMUlERTVRekl3TGpRNU9UVWdNVGd1TkRRM055QXlNQzR3TlRFNElERTRJREU1TGpRNU9UVWdNVGhhSWlCbWFXeHNQU0lqTWpFeU1USXhJaTgrUEhCaGRHZ2daRDBpVFRFNUxqUTVPVFVnTVRFdU5VZ3hNQzQ1T1RrMVRERXdMamc0TWprZ01URXVOVEEyTjBNeE1DNHpPRFUySURFeExqVTJORFVnT1M0NU9UazFNU0F4TVM0NU9EY3lJRGt1T1RrNU5URWdNVEl1TlVNNUxqazVPVFV4SURFekxqQTFNak1nTVRBdU5EUTNNaUF4TXk0MUlERXdMams1T1RVZ01UTXVOVWd4T1M0ME9UazFUREU1TGpZeE5qRWdNVE11TkRrek0wTXlNQzR4TVRNMUlERXpMalF6TlRVZ01qQXVORGs1TlNBeE15NHdNVEk0SURJd0xqUTVPVFVnTVRJdU5VTXlNQzQwT1RrMUlERXhMamswTnpjZ01qQXVNRFV4T0NBeE1TNDFJREU1TGpRNU9UVWdNVEV1TlZvaUlHWnBiR3c5SWlNeU1USXhNakVpTHo0OGNHRjBhQ0JrUFNKTk1Ua3VORGs1TlNBMVNERXdMams1T1RWTU1UQXVPRGd5T1NBMUxqQXdOamN6UXpFd0xqTTROVFlnTlM0d05qUTBPU0E1TGprNU9UVXhJRFV1TkRnM01UWWdPUzQ1T1RrMU1TQTJRemt1T1RrNU5URWdOaTQxTlRJeU9DQXhNQzQwTkRjeUlEY2dNVEF1T1RrNU5TQTNTREU1TGpRNU9UVk1NVGt1TmpFMk1TQTJMams1TXpJM1F6SXdMakV4TXpVZ05pNDVNelUxTVNBeU1DNDBPVGsxSURZdU5URXlPRFFnTWpBdU5EazVOU0EyUXpJd0xqUTVPVFVnTlM0ME5EYzNNaUF5TUM0d05URTRJRFVnTVRrdU5EazVOU0ExV2lJZ1ptbHNiRDBpSXpJeE1qRXlNU0l2UGp4d1lYUm9JR1E5SWswMUxqRTFNRGt6SURFd0xqVXhPVGxETkM0NE5EazFOeUF4TUM0ME5qWTNJRFF1TkRjME5EUWdNVEF1TlRnMk15QTBMakk0TURNeElERXdMamM0TURSRE15NDVPRGMwTVNBeE1TNHdOek16SURNdU5URXlOVE1nTVRFdU1EY3pNeUF6TGpJeE9UWTFJREV3TGpjNE1EUkRNaTQ1TWpZM055QXhNQzQwT0RjMElESXVPVEkyTnpnZ01UQXVNREV5TmlBekxqSXhPVFk1SURrdU56RTVOamxETXk0M056VTFOaUE1TGpFMk16ZzFJRFF1TmpVd05EUWdPQzQ1TURnMElEVXVOREV4TlRjZ09TNHdOREkzUXpVdU9EQTVJRGt1TVRFeU9ETWdOaTR5TVRjeklEa3VNamszTVNBMkxqVXlOekl5SURrdU5qUTRNelJETmk0NE5ESTJJREV3TGpBd05UZ2dOeUF4TUM0ME56STNJRGNnTVRGRE55QXhNUzQyTVRrMUlEWXVOekk0T1RVZ01USXVNRGdnTmk0ek9UUXdOaUF4TWk0ME1qQTFRell1TVRFMk15QXhNaTQzTURJNUlEVXVOell6TVRVZ01USXVPVE14SURVdU5EZzRNallnTVRNdU1UQTROa3cxTGpRd09EYzBJREV6TGpFMk1ERkROUzR5TVRNME9DQXhNeTR5T0RjZ05TNHdOVFF5T0NBeE15NHpPVGNnTkM0NU1qWTROaUF4TXk0MVNEWXVNalZETmk0Mk5qUXlNU0F4TXk0MUlEY2dNVE11T0RNMU9DQTNJREUwTGpJMVF6Y2dNVFF1TmpZME1pQTJMalkyTkRJZ01UVWdOaTR5TkRrNU9TQXhOVWd6TGpjMVF6TXVNek0xTnprZ01UVWdNeUF4TkM0Mk5qUXlJRE1nTVRRdU1qVkRNeUF4TWk0NU16WTBJRE11T1Rnek9EVWdNVEl1TWprM01TQTBMalUzTlRBMUlERXhMamt4TTB3MExqWXpOVEl5SURFeExqZzNNemxETkM0NU5USTFPU0F4TVM0Mk5qYzNJRFV1TVRZNE5ETWdNVEV1TlRJM05TQTFMak15TkRZNUlERXhMak0yT0RaRE5TNDBOVGcxTlNBeE1TNHlNekkxSURVdU5TQXhNUzR4TXpBMklEVXVOU0F4TVVNMUxqVWdNVEF1TnpjM05DQTFMalF6T0RZMUlERXdMalk0TVRnZ05TNDBNREkwTnlBeE1DNDJOREE0UXpVdU16WXdPRE1nTVRBdU5Ua3pOaUExTGpJNE5EYzFJREV3TGpVME16VWdOUzR4TlRBNU15QXhNQzQxTVRrNVdpSWdabWxzYkQwaUl6SXhNakV5TVNJdlBqeHdZWFJvSUdROUlrMHlMamsyT1RZM0lESXhMakk0TURORE1pNDVOamsyTnlBeU1TNHlPREF6SURNdU1EWXlOVEVnTWpFdU16WTBNU0F5TGprM05ESTJJREl4TGpJNE5EbE1NaTQ1TnprMk1pQXlNUzR5T1RBeFRESXVPVGt5T1NBeU1TNHpNREk0UXpNdU1EQXlPRGNnTWpFdU16RXlNU0F6TGpBeE5UQTVJREl4TGpNeU16TWdNeTR3TWprMU5pQXlNUzR6TXpVNVF6TXVNRFU0TkRnZ01qRXVNell4TWlBekxqQTVOalV6SURJeExqTTVNamNnTXk0eE5ETTNOU0F5TVM0ME1qZ3hRek11TWpNNE1TQXlNUzQwT1RnNUlETXVNelk1T1RZZ01qRXVOVGcySURNdU5UTTVOVGtnTWpFdU5qY3dPRU16TGpnNE1UTXhJREl4TGpnME1UY2dOQzR6TnpBME15QXlNaUExSURJeVF6VXVOak01TWpFZ01qSWdOaTR4T1RVNU5pQXlNUzQ0TVRnMklEWXVOakF4TXpJZ01qRXVORFl3TlVNM0xqQXdPVEl5SURJeExqRXdNREVnTnk0eU1URTJNeUF5TUM0Mk1ETXlJRGN1TVRrMU5UTWdNakF1TVRBeFF6Y3VNVGd5TVRrZ01Ua3VOamcwTmlBM0xqQXlPVEF6SURFNUxqTXdOVE1nTmk0M05qazROaUF4T1VNM0xqQXlPVEF6SURFNExqWTVORGNnTnk0eE9ESXhPU0F4T0M0ek1UVTBJRGN1TVRrMU5UTWdNVGN1T0RrNVF6Y3VNakV4TmpNZ01UY3VNemsyT0NBM0xqQXdPVEl5SURFMkxqZzVPVGtnTmk0Mk1ERXpNaUF4Tmk0MU16azFRell1TVRrMU9UWWdNVFl1TVRneE5DQTFMall6T1RJeElERTJJRFVnTVRaRE5DNHpOekEwTXlBeE5pQXpMamc0TVRNeElERTJMakUxT0RNZ015NDFNemsxT1NBeE5pNHpNamt5UXpNdU16WTVPVFlnTVRZdU5ERTBJRE11TWpNNE1TQXhOaTQxTURFeElETXVNVFF6TnpVZ01UWXVOVGN4T1VNekxqQTVOalV6SURFMkxqWXdOek1nTXk0d05UZzBPQ0F4Tmk0Mk16ZzRJRE11TURJNU5UWWdNVFl1TmpZME1VTXpMakF4TlRBNUlERTJMalkzTmpjZ015NHdNREk0TnlBeE5pNDJPRGM1SURJdU9Ua3lPU0F4Tmk0Mk9UY3lUREl1T1RjNU5qSWdNVFl1TnpBNU9Vd3lMamszTkRJeklERTJMamN4TlRGTU1pNDVOekU0T1NBeE5pNDNNVGMxVERJdU9UY3dPVEVnTVRZdU56RTROVXd5TGprMk9UWTNJREUyTGpjeE9UZERNaTQyTnpZM09DQXhOeTR3TVRJMklESXVOamMyTnpnZ01UY3VORGczTkNBeUxqazJPVFkzSURFM0xqYzRNRE5ETXk0eU5UZzJJREU0TGpBMk9UTWdNeTQzTWpRMk1pQXhPQzR3TnpNeUlEUXVNREU0TXpRZ01UY3VOemt5TVVNMExqQXlNVGNnTVRjdU56ZzVNaUEwTGpBek1ERTRJREUzTGpjNE1pQTBMakEwTXpjMUlERTNMamMzTVRsRE5DNHdOelEwSURFM0xqYzBPRGtnTkM0eE16QXdOQ0F4Tnk0M01URWdOQzR5TVRBME1TQXhOeTQyTnpBNFF6UXVNelk0TmprZ01UY3VOVGt4TnlBMExqWXlPVFUzSURFM0xqVWdOU0F4Tnk0MVF6VXVNell3TnprZ01UY3VOU0ExTGpVek5qQXhJREUzTGpVNU9Ua2dOUzQyTURneE1pQXhOeTQyTmpNMlF6VXVOamMzTmpnZ01UY3VOekkxTVNBMUxqWTVPREl6SURFM0xqYzVNRGNnTlM0Mk9UWXpJREUzTGpnMU1VTTFMalk1TkRJeklERTNMamt4TlRVZ05TNDJOalF3TXlBeE9DNHdNREkzSURVdU5UY3lOemdnTVRndU1EZ3hPRU0xTGpRNE5EVWdNVGd1TVRVNE5DQTFMak13T1RZeUlERTRMakkxSURVZ01UZ3VNalZETkM0MU9EVTNPU0F4T0M0eU5TQTBMakkxSURFNExqVTROVGdnTkM0eU5TQXhPVU0wTGpJMUlERTVMalF4TkRJZ05DNDFPRFUzT1NBeE9TNDNOU0ExSURFNUxqYzFRelV1TXpBNU5qSWdNVGt1TnpVZ05TNDBPRFExSURFNUxqZzBNVFlnTlM0MU56STNPQ0F4T1M0NU1UZ3lRelV1TmpZME1ETWdNVGt1T1RrM015QTFMalk1TkRJeklESXdMakE0TkRVZ05TNDJPVFl6SURJd0xqRTBPVU0xTGpZNU9ESXpJREl3TGpJd09UTWdOUzQyTnpjMk9DQXlNQzR5TnpRNUlEVXVOakE0TVRJZ01qQXVNek0yTkVNMUxqVXpOakF4SURJd0xqUXdNREVnTlM0ek5qQTNPU0F5TUM0MUlEVWdNakF1TlVNMExqWXlPVFUzSURJd0xqVWdOQzR6TmpnMk9TQXlNQzQwTURneklEUXVNakV3TkRFZ01qQXVNekk1TWtNMExqRXpNREEwSURJd0xqSTRPU0EwTGpBM05EUWdNakF1TWpVeE1TQTBMakEwTXpjMUlESXdMakl5T0RGRE5DNHdNekF4T0NBeU1DNHlNVGdnTkM0d01qRTNJREl3TGpJeE1EZ2dOQzR3TVRnek5DQXlNQzR5TURjNVF6TXVOekkwTmpJZ01Ua3VPVEkyT0NBekxqSTFPRFlnTVRrdU9UTXdOeUF5TGprMk9UWTNJREl3TGpJeE9UZERNaTQyTnpZM09DQXlNQzQxTVRJMklESXVOamMyTnpnZ01qQXVPVGczTkNBeUxqazJPVFkzSURJeExqSTRNRE5hVFRJdU9UY3hPRGtnTVRZdU56RTNOVXd5TGprM01Ea3hJREUyTGpjeE9EVkRNaTQ1TnpjMklERTJMamN4TWprZ015NHhOekU0TWlBeE5pNDFOVEUxSURJdU9UY3hPRGtnTVRZdU56RTNOVm9pSUdacGJHdzlJaU15TVRJeE1qRWlMejQ4TDNOMlp6ND0iIC8+PC9zdmc+"); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yMDcgLTAuNTA5IC0wLjU1NyAwLjAwMCAwLjg1OSAtMC41MzYgMC4yMzkgLTAuNTUxIDAuMDAwIDAuODQ3IC0wLjUyOCAtMC41MDYgMC4yMDggMC4wMDAgMC44MjUgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnWm1sc2JEMGlibTl1WlNJZ2FHVnBaMmgwUFNJeU5DSWdkbWxsZDBKdmVEMGlNQ0F3SURJMElESTBJaUIzYVdSMGFEMGlNalFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRZdU1EQXdNU0F5TGpjMVF6WXVNREF3TVNBeUxqTTVOVGMzSURVdU56VXlNamNnTWk0d09EazROQ0ExTGpRd05UYzJJREl1TURFMk16TkROUzR3TmpBeE1TQXhMamswTXlBMExqY3hNRE1nTWk0eE1qQTROaUEwTGpVMk5UZ2dNaTQwTkRNd00wdzBMalUyTkRJMklESXVORFEyTXpkRE5DNDFOakl5TmlBeUxqUTFNRFkzSURRdU5UVTRORElnTWk0ME5UZzRNU0EwTGpVMU1qYzFJREl1TkRjd05ESkROQzQxTkRFMElESXVORGt6TmpZZ05DNDFNakk0TWlBeUxqVXpNRFUxSURRdU5EazNNRFFnTWk0MU56Z3dPRU0wTGpRME5USTNJREl1Tmpjek5UWWdOQzR6TmpVNE5DQXlMamd3T1RRMUlEUXVNalU1TkNBeUxqazJNalE0UXpRdU1EUXhOellnTXk0eU56VXpOeUF6TGpjek5UTTRJRE11TmpJME9EZ2dNeTR6TlRJM05TQXpMamcyTXpreFF6TXVNREF4TkRRZ05DNHdPRE16TmlBeUxqZzVORFUySURRdU5UUTJNRFVnTXk0eE1UUXdNU0EwTGpnNU56TTFRek11TXpNek5EWWdOUzR5TkRnMk5pQXpMamM1TmpFMUlEVXVNelUxTlRRZ05DNHhORGMwTmlBMUxqRXpOakE1UXpRdU1qY3lNRFVnTlM0d05UZ3lOaUEwTGpNNE9UVTJJRFF1T1RjME56TWdOQzQxTURBeElEUXVPRGczTmpWV055NHlOVU0wTGpVd01ERWdOeTQyTmpReU1TQTBMamd6TlRnNUlEZ2dOUzR5TlRBeElEaEROUzQyTmpRek1TQTRJRFl1TURBd01TQTNMalkyTkRJeElEWXVNREF3TVNBM0xqSTFWakl1TnpWYUlpQm1hV3hzUFNJak1qRXlNVEl4SWk4K1BIQmhkR2dnWkQwaVRURTVMalE1T1RVZ01UaElNVEF1T1RrNU5Vd3hNQzQ0T0RJNUlERTRMakF3TmpkRE1UQXVNemcxTmlBeE9DNHdOalExSURrdU9UazVOVEVnTVRndU5EZzNNaUE1TGprNU9UVXhJREU1UXprdU9UazVOVEVnTVRrdU5UVXlNeUF4TUM0ME5EY3lJREl3SURFd0xqazVPVFVnTWpCSU1Ua3VORGs1TlV3eE9TNDJNVFl4SURFNUxqazVNek5ETWpBdU1URXpOU0F4T1M0NU16VTFJREl3TGpRNU9UVWdNVGt1TlRFeU9DQXlNQzQwT1RrMUlERTVRekl3TGpRNU9UVWdNVGd1TkRRM055QXlNQzR3TlRFNElERTRJREU1TGpRNU9UVWdNVGhhSWlCbWFXeHNQU0lqTWpFeU1USXhJaTgrUEhCaGRHZ2daRDBpVFRFNUxqUTVPVFVnTVRFdU5VZ3hNQzQ1T1RrMVRERXdMamc0TWprZ01URXVOVEEyTjBNeE1DNHpPRFUySURFeExqVTJORFVnT1M0NU9UazFNU0F4TVM0NU9EY3lJRGt1T1RrNU5URWdNVEl1TlVNNUxqazVPVFV4SURFekxqQTFNak1nTVRBdU5EUTNNaUF4TXk0MUlERXdMams1T1RVZ01UTXVOVWd4T1M0ME9UazFUREU1TGpZeE5qRWdNVE11TkRrek0wTXlNQzR4TVRNMUlERXpMalF6TlRVZ01qQXVORGs1TlNBeE15NHdNVEk0SURJd0xqUTVPVFVnTVRJdU5VTXlNQzQwT1RrMUlERXhMamswTnpjZ01qQXVNRFV4T0NBeE1TNDFJREU1TGpRNU9UVWdNVEV1TlZvaUlHWnBiR3c5SWlNeU1USXhNakVpTHo0OGNHRjBhQ0JrUFNKTk1Ua3VORGs1TlNBMVNERXdMams1T1RWTU1UQXVPRGd5T1NBMUxqQXdOamN6UXpFd0xqTTROVFlnTlM0d05qUTBPU0E1TGprNU9UVXhJRFV1TkRnM01UWWdPUzQ1T1RrMU1TQTJRemt1T1RrNU5URWdOaTQxTlRJeU9DQXhNQzQwTkRjeUlEY2dNVEF1T1RrNU5TQTNTREU1TGpRNU9UVk1NVGt1TmpFMk1TQTJMams1TXpJM1F6SXdMakV4TXpVZ05pNDVNelUxTVNBeU1DNDBPVGsxSURZdU5URXlPRFFnTWpBdU5EazVOU0EyUXpJd0xqUTVPVFVnTlM0ME5EYzNNaUF5TUM0d05URTRJRFVnTVRrdU5EazVOU0ExV2lJZ1ptbHNiRDBpSXpJeE1qRXlNU0l2UGp4d1lYUm9JR1E5SWswMUxqRTFNRGt6SURFd0xqVXhPVGxETkM0NE5EazFOeUF4TUM0ME5qWTNJRFF1TkRjME5EUWdNVEF1TlRnMk15QTBMakk0TURNeElERXdMamM0TURSRE15NDVPRGMwTVNBeE1TNHdOek16SURNdU5URXlOVE1nTVRFdU1EY3pNeUF6TGpJeE9UWTFJREV3TGpjNE1EUkRNaTQ1TWpZM055QXhNQzQwT0RjMElESXVPVEkyTnpnZ01UQXVNREV5TmlBekxqSXhPVFk1SURrdU56RTVOamxETXk0M056VTFOaUE1TGpFMk16ZzFJRFF1TmpVd05EUWdPQzQ1TURnMElEVXVOREV4TlRjZ09TNHdOREkzUXpVdU9EQTVJRGt1TVRFeU9ETWdOaTR5TVRjeklEa3VNamszTVNBMkxqVXlOekl5SURrdU5qUTRNelJETmk0NE5ESTJJREV3TGpBd05UZ2dOeUF4TUM0ME56STNJRGNnTVRGRE55QXhNUzQyTVRrMUlEWXVOekk0T1RVZ01USXVNRGdnTmk0ek9UUXdOaUF4TWk0ME1qQTFRell1TVRFMk15QXhNaTQzTURJNUlEVXVOell6TVRVZ01USXVPVE14SURVdU5EZzRNallnTVRNdU1UQTROa3cxTGpRd09EYzBJREV6TGpFMk1ERkROUzR5TVRNME9DQXhNeTR5T0RjZ05TNHdOVFF5T0NBeE15NHpPVGNnTkM0NU1qWTROaUF4TXk0MVNEWXVNalZETmk0Mk5qUXlNU0F4TXk0MUlEY2dNVE11T0RNMU9DQTNJREUwTGpJMVF6Y2dNVFF1TmpZME1pQTJMalkyTkRJZ01UVWdOaTR5TkRrNU9TQXhOVWd6TGpjMVF6TXVNek0xTnprZ01UVWdNeUF4TkM0Mk5qUXlJRE1nTVRRdU1qVkRNeUF4TWk0NU16WTBJRE11T1Rnek9EVWdNVEl1TWprM01TQTBMalUzTlRBMUlERXhMamt4TTB3MExqWXpOVEl5SURFeExqZzNNemxETkM0NU5USTFPU0F4TVM0Mk5qYzNJRFV1TVRZNE5ETWdNVEV1TlRJM05TQTFMak15TkRZNUlERXhMak0yT0RaRE5TNDBOVGcxTlNBeE1TNHlNekkxSURVdU5TQXhNUzR4TXpBMklEVXVOU0F4TVVNMUxqVWdNVEF1TnpjM05DQTFMalF6T0RZMUlERXdMalk0TVRnZ05TNDBNREkwTnlBeE1DNDJOREE0UXpVdU16WXdPRE1nTVRBdU5Ua3pOaUExTGpJNE5EYzFJREV3TGpVME16VWdOUzR4TlRBNU15QXhNQzQxTVRrNVdpSWdabWxzYkQwaUl6SXhNakV5TVNJdlBqeHdZWFJvSUdROUlrMHlMamsyT1RZM0lESXhMakk0TURORE1pNDVOamsyTnlBeU1TNHlPREF6SURNdU1EWXlOVEVnTWpFdU16WTBNU0F5TGprM05ESTJJREl4TGpJNE5EbE1NaTQ1TnprMk1pQXlNUzR5T1RBeFRESXVPVGt5T1NBeU1TNHpNREk0UXpNdU1EQXlPRGNnTWpFdU16RXlNU0F6TGpBeE5UQTVJREl4TGpNeU16TWdNeTR3TWprMU5pQXlNUzR6TXpVNVF6TXVNRFU0TkRnZ01qRXVNell4TWlBekxqQTVOalV6SURJeExqTTVNamNnTXk0eE5ETTNOU0F5TVM0ME1qZ3hRek11TWpNNE1TQXlNUzQwT1RnNUlETXVNelk1T1RZZ01qRXVOVGcySURNdU5UTTVOVGtnTWpFdU5qY3dPRU16TGpnNE1UTXhJREl4TGpnME1UY2dOQzR6TnpBME15QXlNaUExSURJeVF6VXVOak01TWpFZ01qSWdOaTR4T1RVNU5pQXlNUzQ0TVRnMklEWXVOakF4TXpJZ01qRXVORFl3TlVNM0xqQXdPVEl5SURJeExqRXdNREVnTnk0eU1URTJNeUF5TUM0Mk1ETXlJRGN1TVRrMU5UTWdNakF1TVRBeFF6Y3VNVGd5TVRrZ01Ua3VOamcwTmlBM0xqQXlPVEF6SURFNUxqTXdOVE1nTmk0M05qazROaUF4T1VNM0xqQXlPVEF6SURFNExqWTVORGNnTnk0eE9ESXhPU0F4T0M0ek1UVTBJRGN1TVRrMU5UTWdNVGN1T0RrNVF6Y3VNakV4TmpNZ01UY3VNemsyT0NBM0xqQXdPVEl5SURFMkxqZzVPVGtnTmk0Mk1ERXpNaUF4Tmk0MU16azFRell1TVRrMU9UWWdNVFl1TVRneE5DQTFMall6T1RJeElERTJJRFVnTVRaRE5DNHpOekEwTXlBeE5pQXpMamc0TVRNeElERTJMakUxT0RNZ015NDFNemsxT1NBeE5pNHpNamt5UXpNdU16WTVPVFlnTVRZdU5ERTBJRE11TWpNNE1TQXhOaTQxTURFeElETXVNVFF6TnpVZ01UWXVOVGN4T1VNekxqQTVOalV6SURFMkxqWXdOek1nTXk0d05UZzBPQ0F4Tmk0Mk16ZzRJRE11TURJNU5UWWdNVFl1TmpZME1VTXpMakF4TlRBNUlERTJMalkzTmpjZ015NHdNREk0TnlBeE5pNDJPRGM1SURJdU9Ua3lPU0F4Tmk0Mk9UY3lUREl1T1RjNU5qSWdNVFl1TnpBNU9Vd3lMamszTkRJeklERTJMamN4TlRGTU1pNDVOekU0T1NBeE5pNDNNVGMxVERJdU9UY3dPVEVnTVRZdU56RTROVXd5TGprMk9UWTNJREUyTGpjeE9UZERNaTQyTnpZM09DQXhOeTR3TVRJMklESXVOamMyTnpnZ01UY3VORGczTkNBeUxqazJPVFkzSURFM0xqYzRNRE5ETXk0eU5UZzJJREU0TGpBMk9UTWdNeTQzTWpRMk1pQXhPQzR3TnpNeUlEUXVNREU0TXpRZ01UY3VOemt5TVVNMExqQXlNVGNnTVRjdU56ZzVNaUEwTGpBek1ERTRJREUzTGpjNE1pQTBMakEwTXpjMUlERTNMamMzTVRsRE5DNHdOelEwSURFM0xqYzBPRGtnTkM0eE16QXdOQ0F4Tnk0M01URWdOQzR5TVRBME1TQXhOeTQyTnpBNFF6UXVNelk0TmprZ01UY3VOVGt4TnlBMExqWXlPVFUzSURFM0xqVWdOU0F4Tnk0MVF6VXVNell3TnprZ01UY3VOU0ExTGpVek5qQXhJREUzTGpVNU9Ua2dOUzQyTURneE1pQXhOeTQyTmpNMlF6VXVOamMzTmpnZ01UY3VOekkxTVNBMUxqWTVPREl6SURFM0xqYzVNRGNnTlM0Mk9UWXpJREUzTGpnMU1VTTFMalk1TkRJeklERTNMamt4TlRVZ05TNDJOalF3TXlBeE9DNHdNREkzSURVdU5UY3lOemdnTVRndU1EZ3hPRU0xTGpRNE5EVWdNVGd1TVRVNE5DQTFMak13T1RZeUlERTRMakkxSURVZ01UZ3VNalZETkM0MU9EVTNPU0F4T0M0eU5TQTBMakkxSURFNExqVTROVGdnTkM0eU5TQXhPVU0wTGpJMUlERTVMalF4TkRJZ05DNDFPRFUzT1NBeE9TNDNOU0ExSURFNUxqYzFRelV1TXpBNU5qSWdNVGt1TnpVZ05TNDBPRFExSURFNUxqZzBNVFlnTlM0MU56STNPQ0F4T1M0NU1UZ3lRelV1TmpZME1ETWdNVGt1T1RrM015QTFMalk1TkRJeklESXdMakE0TkRVZ05TNDJPVFl6SURJd0xqRTBPVU0xTGpZNU9ESXpJREl3TGpJd09UTWdOUzQyTnpjMk9DQXlNQzR5TnpRNUlEVXVOakE0TVRJZ01qQXVNek0yTkVNMUxqVXpOakF4SURJd0xqUXdNREVnTlM0ek5qQTNPU0F5TUM0MUlEVWdNakF1TlVNMExqWXlPVFUzSURJd0xqVWdOQzR6TmpnMk9TQXlNQzQwTURneklEUXVNakV3TkRFZ01qQXVNekk1TWtNMExqRXpNREEwSURJd0xqSTRPU0EwTGpBM05EUWdNakF1TWpVeE1TQTBMakEwTXpjMUlESXdMakl5T0RGRE5DNHdNekF4T0NBeU1DNHlNVGdnTkM0d01qRTNJREl3TGpJeE1EZ2dOQzR3TVRnek5DQXlNQzR5TURjNVF6TXVOekkwTmpJZ01Ua3VPVEkyT0NBekxqSTFPRFlnTVRrdU9UTXdOeUF5TGprMk9UWTNJREl3TGpJeE9UZERNaTQyTnpZM09DQXlNQzQxTVRJMklESXVOamMyTnpnZ01qQXVPVGczTkNBeUxqazJPVFkzSURJeExqSTRNRE5hVFRJdU9UY3hPRGtnTVRZdU56RTNOVXd5TGprM01Ea3hJREUyTGpjeE9EVkRNaTQ1TnpjMklERTJMamN4TWprZ015NHhOekU0TWlBeE5pNDFOVEUxSURJdU9UY3hPRGtnTVRZdU56RTNOVm9pSUdacGJHdzlJaU15TVRJeE1qRWlMejQ4TDNOMlp6ND0iIC8+PC9zdmc+"); } .wmd-ulist-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yNDkgLTAuNjE0IC0wLjY3MiAwLjAwMCAxLjAzNSAtMC42NDYgMC4yODggLTAuNjY0IDAuMDAwIDEuMDIwIC0wLjYzNiAtMC42MDkgMC4yNTAgMC4wMDAgMC45OTQgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnWm1sc2JEMGlibTl1WlNJZ2FHVnBaMmgwUFNJeU1DSWdkbWxsZDBKdmVEMGlNQ0F3SURJd0lESXdJaUIzYVdSMGFEMGlNakFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRNdU1qVWdOME16TGprME1ETTJJRGNnTkM0MUlEWXVORFF3TXpZZ05DNDFJRFV1TnpWRE5DNDFJRFV1TURVNU5qUWdNeTQ1TkRBek5pQTBMalVnTXk0eU5TQTBMalZETWk0MU5UazJOQ0EwTGpVZ01pQTFMakExT1RZMElESWdOUzQzTlVNeUlEWXVORFF3TXpZZ01pNDFOVGsyTkNBM0lETXVNalVnTjFwTk55QTFMamMxUXpjZ05TNHpNelUzT1NBM0xqTXpOVGM1SURVZ055NDNOU0ExU0RFM0xqSTFRekUzTGpZMk5ESWdOU0F4T0NBMUxqTXpOVGM1SURFNElEVXVOelZETVRnZ05pNHhOalF5TVNBeE55NDJOalF5SURZdU5TQXhOeTR5TlNBMkxqVklOeTQzTlVNM0xqTXpOVGM1SURZdU5TQTNJRFl1TVRZME1qRWdOeUExTGpjMVdrMDNMamMxSURFd1F6Y3VNek0xTnprZ01UQWdOeUF4TUM0ek16VTRJRGNnTVRBdU56VkROeUF4TVM0eE5qUXlJRGN1TXpNMU56a2dNVEV1TlNBM0xqYzFJREV4TGpWSU1UY3VNalZETVRjdU5qWTBNaUF4TVM0MUlERTRJREV4TGpFMk5ESWdNVGdnTVRBdU56VkRNVGdnTVRBdU16TTFPQ0F4Tnk0Mk5qUXlJREV3SURFM0xqSTFJREV3U0RjdU56VmFUVGN1TnpVZ01UVkROeTR6TXpVM09TQXhOU0EzSURFMUxqTXpOVGdnTnlBeE5TNDNOVU0zSURFMkxqRTJORElnTnk0ek16VTNPU0F4Tmk0MUlEY3VOelVnTVRZdU5VZ3hOeTR5TlVNeE55NDJOalF5SURFMkxqVWdNVGdnTVRZdU1UWTBNaUF4T0NBeE5TNDNOVU14T0NBeE5TNHpNelU0SURFM0xqWTJORElnTVRVZ01UY3VNalVnTVRWSU55NDNOVnBOTkM0MUlERXdMamMxUXpRdU5TQXhNUzQwTkRBMElETXVPVFF3TXpZZ01USWdNeTR5TlNBeE1rTXlMalUxT1RZMElERXlJRElnTVRFdU5EUXdOQ0F5SURFd0xqYzFReklnTVRBdU1EVTVOaUF5TGpVMU9UWTBJRGt1TlNBekxqSTFJRGt1TlVNekxqazBNRE0ySURrdU5TQTBMalVnTVRBdU1EVTVOaUEwTGpVZ01UQXVOelZhVFRNdU1qVWdNVGRETXk0NU5EQXpOaUF4TnlBMExqVWdNVFl1TkRRd05DQTBMalVnTVRVdU56VkROQzQxSURFMUxqQTFPVFlnTXk0NU5EQXpOaUF4TkM0MUlETXVNalVnTVRRdU5VTXlMalUxT1RZMElERTBMalVnTWlBeE5TNHdOVGsySURJZ01UVXVOelZETWlBeE5pNDBOREEwSURJdU5UVTVOalFnTVRjZ015NHlOU0F4TjFvaUlHWnBiR3c5SWlNeU1USXhNakVpTHo0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjxkZWZzPjxmaWx0ZXIgaWQ9ImRhcmtyZWFkZXItaW1hZ2UtZmlsdGVyIj48ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4yMDcgLTAuNTA5IC0wLjU1NyAwLjAwMCAwLjg1OSAtMC41MzYgMC4yMzkgLTAuNTUxIDAuMDAwIDAuODQ3IC0wLjUyOCAtMC41MDYgMC4yMDggMC4wMDAgMC44MjUgMC4wMDAgMC4wMDAgMC4wMDAgMS4wMDAgMC4wMDAiIC8+PC9maWx0ZXI+PC9kZWZzPjxpbWFnZSB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbHRlcj0idXJsKCNkYXJrcmVhZGVyLWltYWdlLWZpbHRlcikiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlBL1BqeHpkbWNnWm1sc2JEMGlibTl1WlNJZ2FHVnBaMmgwUFNJeU1DSWdkbWxsZDBKdmVEMGlNQ0F3SURJd0lESXdJaUIzYVdSMGFEMGlNakFpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUkrUEhCaGRHZ2daRDBpVFRNdU1qVWdOME16TGprME1ETTJJRGNnTkM0MUlEWXVORFF3TXpZZ05DNDFJRFV1TnpWRE5DNDFJRFV1TURVNU5qUWdNeTQ1TkRBek5pQTBMalVnTXk0eU5TQTBMalZETWk0MU5UazJOQ0EwTGpVZ01pQTFMakExT1RZMElESWdOUzQzTlVNeUlEWXVORFF3TXpZZ01pNDFOVGsyTkNBM0lETXVNalVnTjFwTk55QTFMamMxUXpjZ05TNHpNelUzT1NBM0xqTXpOVGM1SURVZ055NDNOU0ExU0RFM0xqSTFRekUzTGpZMk5ESWdOU0F4T0NBMUxqTXpOVGM1SURFNElEVXVOelZETVRnZ05pNHhOalF5TVNBeE55NDJOalF5SURZdU5TQXhOeTR5TlNBMkxqVklOeTQzTlVNM0xqTXpOVGM1SURZdU5TQTNJRFl1TVRZME1qRWdOeUExTGpjMVdrMDNMamMxSURFd1F6Y3VNek0xTnprZ01UQWdOeUF4TUM0ek16VTRJRGNnTVRBdU56VkROeUF4TVM0eE5qUXlJRGN1TXpNMU56a2dNVEV1TlNBM0xqYzFJREV4TGpWSU1UY3VNalZETVRjdU5qWTBNaUF4TVM0MUlERTRJREV4TGpFMk5ESWdNVGdnTVRBdU56VkRNVGdnTVRBdU16TTFPQ0F4Tnk0Mk5qUXlJREV3SURFM0xqSTFJREV3U0RjdU56VmFUVGN1TnpVZ01UVkROeTR6TXpVM09TQXhOU0EzSURFMUxqTXpOVGdnTnlBeE5TNDNOVU0zSURFMkxqRTJORElnTnk0ek16VTNPU0F4Tmk0MUlEY3VOelVnTVRZdU5VZ3hOeTR5TlVNeE55NDJOalF5SURFMkxqVWdNVGdnTVRZdU1UWTBNaUF4T0NBeE5TNDNOVU14T0NBeE5TNHpNelU0SURFM0xqWTJORElnTVRVZ01UY3VNalVnTVRWSU55NDNOVnBOTkM0MUlERXdMamMxUXpRdU5TQXhNUzQwTkRBMElETXVPVFF3TXpZZ01USWdNeTR5TlNBeE1rTXlMalUxT1RZMElERXlJRElnTVRFdU5EUXdOQ0F5SURFd0xqYzFReklnTVRBdU1EVTVOaUF5TGpVMU9UWTBJRGt1TlNBekxqSTFJRGt1TlVNekxqazBNRE0ySURrdU5TQTBMalVnTVRBdU1EVTVOaUEwTGpVZ01UQXVOelZhVFRNdU1qVWdNVGRETXk0NU5EQXpOaUF4TnlBMExqVWdNVFl1TkRRd05DQTBMalVnTVRVdU56VkROQzQxSURFMUxqQTFPVFlnTXk0NU5EQXpOaUF4TkM0MUlETXVNalVnTVRRdU5VTXlMalUxT1RZMElERTBMalVnTWlBeE5TNHdOVGsySURJZ01UVXVOelZETWlBeE5pNDBOREEwSURJdU5UVTVOalFnTVRjZ015NHlOU0F4TjFvaUlHWnBiR3c5SWlNeU1USXhNakVpTHo0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); } .wmd-heading-button { background-image: url("http://localhost:8000/static/pagedown/resources/heading.svg"); } .wmd-hr-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9Qanh6ZG1jZ2RtbGxkMEp2ZUQwaU1DQXdJREl3SURJd0lpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeHdZWFJvSUdROUlrMHhJREZvTW5ZeVNERldNWHB0TUNBMGFESjJNa2d4VmpWNmJUQWdOR2d4T0hZeVNERldPWHB0TUNBMGFESjJNa2d4ZGkweWVtMHdJRFJvTW5ZeVNERjJMVEo2VFRVZ01XZ3lkakpJTlZZeGVtMHdJREUyYURKMk1rZzFkaTB5ZWswNUlERm9Nbll5U0RsV01YcHRNQ0EwYURKMk1rZzVWalY2YlRBZ09HZ3lkakpJT1hZdE1ucHRNQ0EwYURKMk1rZzVkaTB5ZW0wMExURTJhREoyTW1ndE1sWXhlbTB3SURFMmFESjJNbWd0TW5ZdE1ucHROQzB4Tm1neWRqSm9MVEpXTVhwdE1DQTBhREoyTW1ndE1sWTFlbTB3SURob01uWXlhQzB5ZGkweWVtMHdJRFJvTW5ZeWFDMHlkaTB5ZWlJdlBqd3ZjM1puUGc9PSIgLz48L3N2Zz4="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9Qanh6ZG1jZ2RtbGxkMEp2ZUQwaU1DQXdJREl3SURJd0lpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaVBqeHdZWFJvSUdROUlrMHhJREZvTW5ZeVNERldNWHB0TUNBMGFESjJNa2d4VmpWNmJUQWdOR2d4T0hZeVNERldPWHB0TUNBMGFESjJNa2d4ZGkweWVtMHdJRFJvTW5ZeVNERjJMVEo2VFRVZ01XZ3lkakpJTlZZeGVtMHdJREUyYURKMk1rZzFkaTB5ZWswNUlERm9Nbll5U0RsV01YcHRNQ0EwYURKMk1rZzVWalY2YlRBZ09HZ3lkakpJT1hZdE1ucHRNQ0EwYURKMk1rZzVkaTB5ZW0wMExURTJhREoyTW1ndE1sWXhlbTB3SURFMmFESjJNbWd0TW5ZdE1ucHROQzB4Tm1neWRqSm9MVEpXTVhwdE1DQTBhREoyTW1ndE1sWTFlbTB3SURob01uWXlhQzB5ZGkweWVtMHdJRFJvTW5ZeWFDMHlkaTB5ZWlJdlBqd3ZjM1puUGc9PSIgLz48L3N2Zz4="); } .wmd-undo-button { background-image: url("http://localhost:8000/static/pagedown/resources/undo.svg"); @@ -3204,242 +3232,242 @@ a.voted { background-image: url("http://localhost:8000/static/pagedown/resources/redo.svg"); } .wmd-admonition-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9QandoUkU5RFZGbFFSU0J6ZG1jZ0lGQlZRa3hKUXlBbkxTOHZWek5ETHk5RVZFUWdVMVpISURFdU1TOHZSVTRuSUNBbmFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlIzSmhjR2hwWTNNdlUxWkhMekV1TVM5RVZFUXZjM1puTVRFdVpIUmtKejQ4YzNabklHVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a1BTSnVaWGNnTUNBd0lEVXhNaUExTVRJaUlHbGtQU0pNWVhsbGNsOHhJaUIyWlhKemFXOXVQU0l4TGpFaUlIWnBaWGRDYjNnOUlqQWdNQ0ExTVRJZ05URXlJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJajQ4Wno0OFp6NDhjR0YwYUNCa1BTSk5NelkxTERFMk55NDRTREl5T0M0eVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxERTJNeTR4TERNM01DNDRMREUyTnk0NExETTJOU3d4TmpjdU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERJeU9DNDRTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxESXlOQzR4TERNM01DNDRMREl5T0M0NExETTJOU3d5TWpndU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERJNE9TNDRTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxESTROUzR4TERNM01DNDRMREk0T1M0NExETTJOU3d5T0RrdU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERNMU1DNDVTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxETTBOaTR5TERNM01DNDRMRE0xTUM0NUxETTJOU3d6TlRBdU9Yb2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERReE1TNDVTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxEUXdOeTR5TERNM01DNDRMRFF4TVM0NUxETTJOU3cwTVRFdU9Yb2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhMMmMrUEhCaGRHZ2daRDBpVFRNNU1pdzBNeTQxU0RFM09TNHliRE00TGpZc05URXVOR2d4TkRRdU4yTXlOeTR5TERBc05Ea3VOU3d5TWk0ekxEUTVMalVzTkRrdU5YWXlOamt1TTJNd0xESTNMakl0TWpJdU15dzBPUzQxTFRRNUxqVXNORGt1TlVneE5UUXVOQ0FnSUdNdE1qY3VNaXd3TFRRNUxqVXRNakl1TXkwME9TNDFMVFE1TGpWV01UVXdMamxNTmpVdU15dzVPQzQwWXkwd0xqTXNNaTQzTFRBdU9DdzFMak10TUM0NExEaDJNelF5TGpOak1Dd3pOQzQyTERJNExqTXNOak1zTmpNc05qTklNemt5WXpNMExqWXNNQ3cyTXkweU9DNHpMRFl6TFRZelZqRXdOaTQwSUNBZ1F6UTFOQzQ1TERjeExqZ3NOREkyTGpZc05ETXVOU3d6T1RJc05ETXVOWG9pSUdacGJHdzlJaU16TUROQk0wWWlMejQ4Wno0OGNHRjBhQ0JrUFNKTk1USTFMalVzTVRRNUxqaHNOamd1TXl3eU5XTXpMallzTVM0ekxEWXVOUzB3TGpjc05pNHpMVFF1Tm13dE15NHlMVGN5TGpkakxUQXVNUzB4TGpVdE1DNDFMVEl1T1MweExqTXROQzR6YkRBdU1TMHdMakVnSUNBZ1l5MHdMakV0TUM0eUxUQXVNeTB3TGpRdE1DNDBMVEF1Tm13dE5EZ3VPQzAyTmk0MmJDMHhOaXd4TVM0M2JEUTBMakVzTmpBdU1tTXhMamdzTWk0MExERXVNaXcxTGpndE1TNHlMRGN1Tm13dE15NDRMREl1T0dNdE1pNDBMREV1T0MwMUxqZ3NNUzR5TFRjdU5pMHhMakpNTVRFNExEUTJMamtnSUNBZ2JDMHhOUzQ0TERFeExqWnNORFF1TkN3Mk1DNDNZekV1Tml3eUxqSXNNUzR4TERVdU1pMHhMakVzTmk0NGJDMDBMamNzTXk0MVl5MHlMaklzTVM0MkxUVXVNaXd4TGpFdE5pNDRMVEV1TVV3NE9TNDJMRFkzTGpaTU56SXVOaXc0TUd3ME55NHlMRFkwTGpRZ0lDQWdRekV5TVN3eE5EWXVPQ3d4TWpNc01UUTRMamtzTVRJMUxqVXNNVFE1TGpoNklFMHhNemdzTVRReExqbHNORGN1Tmkwek5DNDVZekl1T1MweUxqRXNOeTQyTERFdU15dzNMamdzTlM0NGJERXVNU3d6T1M0M1l5MHdMamNzTUM0eUxURXVOQ3d3TGpNdE1pd3dMamRzTFRFMExqSXNNVEF1TkNBZ0lDQmpMVEF1TVN3d0xqRXRNQzR6TERBdE1DNHpMREF1TVd3dE16WXVPQzB4TWk0MlF6RXpOeXd4TkRrdU5pd3hNelV1TVN3eE5EUXNNVE00TERFME1TNDVlaUlnWm1sc2JEMGlJek13TTBFelJpSXZQanh3WVhSb0lHUTlJazAyT0M0NUxEYzFMak5zTFRVdU55MDNMamRqTFRFd0xqVXRNVFF1TXkwM0xqTXRNelF1TlN3M0xUUTFiREl5TFRFMkxqRmpNVFF1TXkweE1DNDFMRE0wTGpVdE55NHpMRFExTERkc05TNDNMRGN1TjB3Mk9DNDVMRGMxTGpONklpQm1hV3hzUFNJak16QXpRVE5HSWk4K1BDOW5Qand2Wno0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9QandoUkU5RFZGbFFSU0J6ZG1jZ0lGQlZRa3hKUXlBbkxTOHZWek5ETHk5RVZFUWdVMVpISURFdU1TOHZSVTRuSUNBbmFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlIzSmhjR2hwWTNNdlUxWkhMekV1TVM5RVZFUXZjM1puTVRFdVpIUmtKejQ4YzNabklHVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a1BTSnVaWGNnTUNBd0lEVXhNaUExTVRJaUlHbGtQU0pNWVhsbGNsOHhJaUIyWlhKemFXOXVQU0l4TGpFaUlIWnBaWGRDYjNnOUlqQWdNQ0ExTVRJZ05URXlJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJajQ4Wno0OFp6NDhjR0YwYUNCa1BTSk5NelkxTERFMk55NDRTREl5T0M0eVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxERTJNeTR4TERNM01DNDRMREUyTnk0NExETTJOU3d4TmpjdU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERJeU9DNDRTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxESXlOQzR4TERNM01DNDRMREl5T0M0NExETTJOU3d5TWpndU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERJNE9TNDRTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxESTROUzR4TERNM01DNDRMREk0T1M0NExETTJOU3d5T0RrdU9Ib2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERNMU1DNDVTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxETTBOaTR5TERNM01DNDRMRE0xTUM0NUxETTJOU3d6TlRBdU9Yb2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhjR0YwYUNCa1BTSk5NelkxTERReE1TNDVTREUxTXk0NVl5MDFMamNzTUMweE1DNDBMVFF1TnkweE1DNDBMVEV3TGpSMkxUQXVPR013TFRVdU55dzBMamN0TVRBdU5Dd3hNQzQwTFRFd0xqUklNelkxWXpVdU55d3dMREV3TGpRc05DNDNMREV3TGpRc01UQXVOQ0FnSUNCMk1DNDRRek0zTlM0MUxEUXdOeTR5TERNM01DNDRMRFF4TVM0NUxETTJOU3cwTVRFdU9Yb2lJR1pwYkd3OUlpTXpNRE5CTTBZaUx6NDhMMmMrUEhCaGRHZ2daRDBpVFRNNU1pdzBNeTQxU0RFM09TNHliRE00TGpZc05URXVOR2d4TkRRdU4yTXlOeTR5TERBc05Ea3VOU3d5TWk0ekxEUTVMalVzTkRrdU5YWXlOamt1TTJNd0xESTNMakl0TWpJdU15dzBPUzQxTFRRNUxqVXNORGt1TlVneE5UUXVOQ0FnSUdNdE1qY3VNaXd3TFRRNUxqVXRNakl1TXkwME9TNDFMVFE1TGpWV01UVXdMamxNTmpVdU15dzVPQzQwWXkwd0xqTXNNaTQzTFRBdU9DdzFMak10TUM0NExEaDJNelF5TGpOak1Dd3pOQzQyTERJNExqTXNOak1zTmpNc05qTklNemt5WXpNMExqWXNNQ3cyTXkweU9DNHpMRFl6TFRZelZqRXdOaTQwSUNBZ1F6UTFOQzQ1TERjeExqZ3NOREkyTGpZc05ETXVOU3d6T1RJc05ETXVOWG9pSUdacGJHdzlJaU16TUROQk0wWWlMejQ4Wno0OGNHRjBhQ0JrUFNKTk1USTFMalVzTVRRNUxqaHNOamd1TXl3eU5XTXpMallzTVM0ekxEWXVOUzB3TGpjc05pNHpMVFF1Tm13dE15NHlMVGN5TGpkakxUQXVNUzB4TGpVdE1DNDFMVEl1T1MweExqTXROQzR6YkRBdU1TMHdMakVnSUNBZ1l5MHdMakV0TUM0eUxUQXVNeTB3TGpRdE1DNDBMVEF1Tm13dE5EZ3VPQzAyTmk0MmJDMHhOaXd4TVM0M2JEUTBMakVzTmpBdU1tTXhMamdzTWk0MExERXVNaXcxTGpndE1TNHlMRGN1Tm13dE15NDRMREl1T0dNdE1pNDBMREV1T0MwMUxqZ3NNUzR5TFRjdU5pMHhMakpNTVRFNExEUTJMamtnSUNBZ2JDMHhOUzQ0TERFeExqWnNORFF1TkN3Mk1DNDNZekV1Tml3eUxqSXNNUzR4TERVdU1pMHhMakVzTmk0NGJDMDBMamNzTXk0MVl5MHlMaklzTVM0MkxUVXVNaXd4TGpFdE5pNDRMVEV1TVV3NE9TNDJMRFkzTGpaTU56SXVOaXc0TUd3ME55NHlMRFkwTGpRZ0lDQWdRekV5TVN3eE5EWXVPQ3d4TWpNc01UUTRMamtzTVRJMUxqVXNNVFE1TGpoNklFMHhNemdzTVRReExqbHNORGN1Tmkwek5DNDVZekl1T1MweUxqRXNOeTQyTERFdU15dzNMamdzTlM0NGJERXVNU3d6T1M0M1l5MHdMamNzTUM0eUxURXVOQ3d3TGpNdE1pd3dMamRzTFRFMExqSXNNVEF1TkNBZ0lDQmpMVEF1TVN3d0xqRXRNQzR6TERBdE1DNHpMREF1TVd3dE16WXVPQzB4TWk0MlF6RXpOeXd4TkRrdU5pd3hNelV1TVN3eE5EUXNNVE00TERFME1TNDVlaUlnWm1sc2JEMGlJek13TTBFelJpSXZQanh3WVhSb0lHUTlJazAyT0M0NUxEYzFMak5zTFRVdU55MDNMamRqTFRFd0xqVXRNVFF1TXkwM0xqTXRNelF1TlN3M0xUUTFiREl5TFRFMkxqRmpNVFF1TXkweE1DNDFMRE0wTGpVdE55NHpMRFExTERkc05TNDNMRGN1TjB3Mk9DNDVMRGMxTGpONklpQm1hV3hzUFNJak16QXpRVE5HSWk4K1BDOW5Qand2Wno0OEwzTjJaejQ9IiAvPjwvc3ZnPg=="); } .wmd-spoiler-button { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjI0OSAtMC42MTQgLTAuNjcyIDAuMDAwIDEuMDM1IC0wLjY0NiAwLjI4OCAtMC42NjQgMC4wMDAgMS4wMjAgLTAuNjM2IC0wLjYwOSAwLjI1MCAwLjAwMCAwLjk5NCAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9Qanh6ZG1jZ1pHRjBZUzF1WVcxbFBTSk1ZWGxsY2lBeElpQnBaRDBpVEdGNVpYSmZNU0lnZG1sbGQwSnZlRDBpTUNBd0lETXlJRE15SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4MGFYUnNaUzgrUEhCaGRHZ2daRDBpVFRJM0xqTTNMREpJTVRRdU1EVmhPQzR3Tnl3NExqQTNMREFzTUN3eExESXVOemNzTmk0eExEY3VPVEVzTnk0NU1Td3dMREFzTVMwdU5qTXNNeTR4TW1nM0xqUTRZUzQ1TkM0NU5Dd3dMREVzTVN3d0xERXVPRGRJTVRVdU1XTXRMakUyTGpJdExqTTBMalF0TGpVeUxqVTVZVGd1TVRJc09DNHhNaXd3TERBc01TMDFMamcxTERJdU5URXNNaTR4Tnl3eUxqRTNMREFzTUN3eExTNHpOaXd3VmpJNFlUSXNNaXd3TERBc01Dd3lMREpvTVRkaE1pd3lMREFzTUN3d0xESXRNbFkwUVRJc01pd3dMREFzTUN3eU55NHpOeXd5V20wdE15NDNMREU0TGpjNGFDMDVMalpoTGprMExqazBMREFzTVN3eExEQXRNUzQ0TjJnNUxqWmhMamswTGprMExEQXNNU3d4TERBc01TNDROMXB0TUMwekxqZzFhQzA1TGpaaExqa3pMamt6TERBc01Td3hMREF0TVM0NE5tZzVMalpoTGprekxqa3pMREFzTVN3eExEQXNNUzQ0TmxvaUx6NDhjR0YwYUNCa1BTSk5PQzQzTXl3eE5DNHhPV0UyTGpBM0xEWXVNRGNzTUN3d0xEQXNOQzQwTVMweExqbEJOUzQyTVN3MUxqWXhMREFzTUN3d0xERTBMREV4TGpJellUWXNOaXd3TERBc01Dd3VPRGN0TXk0eE15dzJMakVzTmk0eExEQXNNQ3d3TFRVdE5tZ3dZVFlzTml3d0xEQXNNQzB4TFM0d09TdzJMakE1TERZdU1Ea3NNQ3d3TERBdExqTTJMREV5TGpFM1FUSXVNVGNzTWk0eE55d3dMREFzTUN3NExqY3pMREUwTGpFNVdtMHRNeTAyTGpBNVlURXNNU3d3TERBc01Td3hMVEZvTkdFeExERXNNQ3d3TERFc01Dd3lhQzAwUVRFc01Td3dMREFzTVN3MUxqY3pMRGd1TVZvaUx6NDhMM04yWno0PSIgLz48L3N2Zz4="); + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE1MCI+PGRlZnM+PGZpbHRlciBpZD0iZGFya3JlYWRlci1pbWFnZS1maWx0ZXIiPjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwLjIwNyAtMC41MDkgLTAuNTU3IDAuMDAwIDAuODU5IC0wLjUzNiAwLjIzOSAtMC41NTEgMC4wMDAgMC44NDcgLTAuNTI4IC0wLjUwNiAwLjIwOCAwLjAwMCAwLjgyNSAwLjAwMCAwLjAwMCAwLjAwMCAxLjAwMCAwLjAwMCIgLz48L2ZpbHRlcj48L2RlZnM+PGltYWdlIHdpZHRoPSIxNTAiIGhlaWdodD0iMTUwIiBmaWx0ZXI9InVybCgjZGFya3JlYWRlci1pbWFnZS1maWx0ZXIpIiB4bGluazpocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS9Qanh6ZG1jZ1pHRjBZUzF1WVcxbFBTSk1ZWGxsY2lBeElpQnBaRDBpVEdGNVpYSmZNU0lnZG1sbGQwSnZlRDBpTUNBd0lETXlJRE15SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpUGp4MGFYUnNaUzgrUEhCaGRHZ2daRDBpVFRJM0xqTTNMREpJTVRRdU1EVmhPQzR3Tnl3NExqQTNMREFzTUN3eExESXVOemNzTmk0eExEY3VPVEVzTnk0NU1Td3dMREFzTVMwdU5qTXNNeTR4TW1nM0xqUTRZUzQ1TkM0NU5Dd3dMREVzTVN3d0xERXVPRGRJTVRVdU1XTXRMakUyTGpJdExqTTBMalF0TGpVeUxqVTVZVGd1TVRJc09DNHhNaXd3TERBc01TMDFMamcxTERJdU5URXNNaTR4Tnl3eUxqRTNMREFzTUN3eExTNHpOaXd3VmpJNFlUSXNNaXd3TERBc01Dd3lMREpvTVRkaE1pd3lMREFzTUN3d0xESXRNbFkwUVRJc01pd3dMREFzTUN3eU55NHpOeXd5V20wdE15NDNMREU0TGpjNGFDMDVMalpoTGprMExqazBMREFzTVN3eExEQXRNUzQ0TjJnNUxqWmhMamswTGprMExEQXNNU3d4TERBc01TNDROMXB0TUMwekxqZzFhQzA1TGpaaExqa3pMamt6TERBc01Td3hMREF0TVM0NE5tZzVMalpoTGprekxqa3pMREFzTVN3eExEQXNNUzQ0TmxvaUx6NDhjR0YwYUNCa1BTSk5PQzQzTXl3eE5DNHhPV0UyTGpBM0xEWXVNRGNzTUN3d0xEQXNOQzQwTVMweExqbEJOUzQyTVN3MUxqWXhMREFzTUN3d0xERTBMREV4TGpJellUWXNOaXd3TERBc01Dd3VPRGN0TXk0eE15dzJMakVzTmk0eExEQXNNQ3d3TFRVdE5tZ3dZVFlzTml3d0xEQXNNQzB4TFM0d09TdzJMakE1TERZdU1Ea3NNQ3d3TERBdExqTTJMREV5TGpFM1FUSXVNVGNzTWk0eE55d3dMREFzTUN3NExqY3pMREUwTGpFNVdtMHRNeTAyTGpBNVlURXNNU3d3TERBc01Td3hMVEZvTkdFeExERXNNQ3d3TERFc01Dd3lhQzAwUVRFc01Td3dMREFzTVN3MUxqY3pMRGd1TVZvaUx6NDhMM04yWno0PSIgLz48L3N2Zz4="); } .wmd-button-active:hover { - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .wmd-prompt-background { background-color: rgb(0, 0, 0); } .wmd-prompt-dialog { - border-color: rgb(77, 83, 86); - background-color: rgb(30, 32, 33); + border-color: rgb(64, 69, 71); + background-color: rgb(25, 27, 27); } .wmd-prompt-dialog > form > input[type="text"] { - border-color: rgb(77, 83, 86); - color: rgb(232, 230, 227); + border-color: rgb(64, 69, 71); + color: rgb(193, 191, 188); } .wmd-prompt-dialog > form > input[type="button"] { - border-color: rgb(82, 88, 92); + border-color: rgb(68, 73, 76); } .wmd-preview { background-image: initial; - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); } .pagedown-image-upload { background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); box-shadow: rgba(0, 0, 0, 0.5) 2px 2px 10px 0px; } .pagedown-image-upload .submit-loading { - border-color: rgb(46, 91, 113) rgb(51, 56, 58) rgb(51, 56, 58); + border-color: rgb(38, 76, 94) rgb(42, 46, 48) rgb(42, 46, 48); } div.dmmd-preview-update { background-image: initial; - background-color: rgb(53, 57, 59); - color: rgb(200, 195, 188); + background-color: rgb(44, 47, 49); + color: rgb(166, 162, 156); } div.dmmd-preview-stale { background-image: repeating-linear-gradient(-45deg, - rgb(24, 26, 27), - rgb(24, 26, 27) 10px, - rgb(28, 30, 31) 10px, - rgb(28, 30, 31) 20px); + rgb(20, 22, 22), + rgb(20, 22, 22) 10px, + rgb(23, 25, 26) 10px, + rgb(23, 25, 26) 20px); background-color: initial; } code .hll { - background-color: rgb(61, 61, 0); + background-color: rgb(51, 51, 0); } code .c { - color: rgb(162, 154, 142); + color: rgb(134, 128, 118); } code .err { - color: rgb(233, 94, 94); - background-color: rgb(58, 36, 36); + color: rgb(193, 78, 78); + background-color: rgb(48, 30, 30); } code .k { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .o { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .cm { - color: rgb(162, 154, 142); + color: rgb(134, 128, 118); } code .cp { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } code .c1 { - color: rgb(162, 154, 142); + color: rgb(134, 128, 118); } code .cs { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } code .gd { - color: rgb(232, 230, 227); - background-color: rgb(71, 0, 0); + color: rgb(193, 191, 188); + background-color: rgb(59, 0, 0); } code .ge { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .gr { - color: rgb(255, 85, 85); + color: rgb(212, 71, 71); } code .gh { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } code .gi { - color: rgb(232, 230, 227); - background-color: rgb(18, 71, 0); + color: rgb(193, 191, 188); + background-color: rgb(15, 59, 0); } code .go { - color: rgb(157, 148, 136); + color: rgb(130, 123, 113); } code .gp { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } code .gu { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } code .gt { - color: rgb(255, 85, 85); + color: rgb(212, 71, 71); } code .kc { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .kd { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .kn { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .kp { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .kr { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .kt { - color: rgb(139, 166, 197); + color: rgb(115, 138, 164); } code .m { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } code .s { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .na { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .nb { - color: rgb(79, 211, 255); + color: rgb(66, 175, 212); } code .nc { - color: rgb(139, 166, 197); + color: rgb(115, 138, 164); } code .no { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .nd { - color: rgb(184, 178, 168); + color: rgb(153, 148, 139); } code .ni { - color: rgb(255, 114, 255); + color: rgb(212, 95, 212); } code .ne { - color: rgb(255, 97, 97); + color: rgb(212, 81, 81); } code .nf { - color: rgb(255, 97, 97); + color: rgb(212, 81, 81); } code .nl { - color: rgb(255, 97, 97); + color: rgb(212, 81, 81); } code .nn { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } code .nt { - color: rgb(127, 174, 255); + color: rgb(105, 144, 212); } code .nv { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .ow { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } code .w { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } code .mf { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } code .mh { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } code .mi { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } code .mo { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } code .sb { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .sc { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .sd { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .s2 { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .se { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .sh { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .si { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .sx { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .sr { - color: rgb(97, 255, 136); + color: rgb(81, 212, 113); } code .s1 { - color: rgb(240, 62, 107); + color: rgb(199, 51, 89); } code .ss { - color: rgb(255, 97, 216); + color: rgb(212, 81, 179); } code .bp { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } code .vc { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .vg { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .vi { - color: rgb(114, 255, 255); + color: rgb(95, 212, 212); } code .il { - color: rgb(97, 255, 255); + color: rgb(81, 212, 212); } .fa-border { - border-color: rgb(53, 57, 59); + border-color: rgb(44, 47, 49); } .fa-inverse { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } @media all { .featherlight { @@ -3453,12 +3481,12 @@ code .il { .featherlight .featherlight-content { border-bottom-color: transparent; background-image: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .featherlight .featherlight-close-icon { background-image: initial; - background-color: rgba(24, 26, 27, 0.3); - color: rgb(232, 230, 227); + background-color: rgba(20, 22, 22, 0.3); + color: rgb(193, 191, 188); } .featherlight-iframe .featherlight-content { border-bottom-color: initial; @@ -3473,14 +3501,14 @@ code .il { } } .tooltipped::after { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); text-decoration-color: initial; text-shadow: none; background-image: initial; background-color: rgba(0, 0, 0, 0.8); } .tooltipped::before { - color: rgba(232, 230, 227, 0.8); + color: rgba(193, 191, 188, 0.8); border-color: transparent; } .tooltipped:hover::before, @@ -3494,25 +3522,25 @@ code .il { .tooltipped-s::before, .tooltipped-se::before, .tooltipped-sw::before { - border-bottom-color: rgba(140, 130, 115, 0.8); + border-bottom-color: rgba(116, 108, 95, 0.8); } .tooltipped-n::before, .tooltipped-ne::before, .tooltipped-nw::before { - border-top-color: rgba(140, 130, 115, 0.8); + border-top-color: rgba(116, 108, 95, 0.8); } .tooltipped-w::before { - border-left-color: rgba(140, 130, 115, 0.8); + border-left-color: rgba(116, 108, 95, 0.8); } .tooltipped-e::before { - border-right-color: rgba(140, 130, 115, 0.8); + border-right-color: rgba(116, 108, 95, 0.8); } .select2-container .select2-search--inline .select2-search__field { border-color: initial; } .select2-dropdown { - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); } .select2-results__options { list-style-image: initial; @@ -3525,109 +3553,109 @@ code .il { } .select2-close-mask { border-color: initial; - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .select2-hidden-accessible { border-color: initial !important; } .select2-container--default .select2-selection--single { - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); } .select2-container--default .select2-selection--single .select2-selection__rendered { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: rgb(82, 88, 92) transparent transparent; + border-color: rgb(68, 73, 76) transparent transparent; } .select2-container--default.select2-container--disabled .select2-selection--single { - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent rgb(82, 88, 92); + border-color: transparent transparent rgb(68, 73, 76); } .select2-container--default .select2-selection--multiple { - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); } .select2-container--default .select2-selection--multiple .select2-selection__rendered { list-style-image: initial; } .select2-container--default .select2-selection--multiple .select2-selection__placeholder { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: rgb(39, 43, 44); - border-color: rgb(72, 78, 81); + background-color: rgb(32, 36, 37); + border-color: rgb(60, 65, 67); } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: rgb(200, 195, 188); + color: rgb(166, 162, 156); } .select2-container--default.select2-container--focus .select2-selection--multiple { - border-color: rgb(140, 130, 115); + border-color: rgb(116, 108, 95); outline-color: initial; } .select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } .select2-container--default .select2-search--dropdown .select2-search__field { - border-color: rgb(72, 78, 81); + border-color: rgb(60, 65, 67); } .select2-container--default .select2-search--inline .select2-search__field { background-image: initial; background-color: transparent; border-color: initial; outline-color: initial; box-shadow: none; } .select2-container--default .select2-results__option[aria-disabled="true"] { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .select2-container--default .select2-results__option[aria-selected="true"] { - background-color: rgb(43, 47, 49); + background-color: rgb(36, 39, 41); } .select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: rgb(4, 60, 150); - color: rgb(232, 230, 227); + background-color: rgb(3, 50, 125); + color: rgb(193, 191, 188); } .select2-container--classic .select2-selection--single { - background-color: rgb(29, 31, 32); - border-color: rgb(72, 78, 81); + background-color: rgb(24, 26, 27); + border-color: rgb(60, 65, 67); outline-color: initial; - background-image: linear-gradient(rgb(24, 26, 27) 50%, - rgb(34, 36, 38) 100%); + background-image: linear-gradient(rgb(20, 22, 22) 50%, + rgb(28, 30, 32) 100%); } .select2-container--classic .select2-selection--single:focus { - border-color: rgb(4, 60, 150); + border-color: rgb(3, 50, 125); } .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: rgb(189, 183, 175); + color: rgb(157, 152, 145); } .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: rgb(43, 47, 49); + background-color: rgb(36, 39, 41); border-top-color: initial; border-right-color: initial; border-bottom-color: initial; - border-left-color: rgb(72, 78, 81); - background-image: linear-gradient(rgb(34, 36, 38) 50%, - rgb(53, 57, 59) 100%); + border-left-color: rgb(60, 65, 67); + background-image: linear-gradient(rgb(28, 30, 32) 50%, + rgb(44, 47, 49) 100%); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: rgb(82, 88, 92) transparent transparent; + border-color: rgb(68, 73, 76) transparent transparent; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border-top-color: initial; border-bottom-color: initial; border-left-color: initial; - border-right-color: rgb(72, 78, 81); + border-right-color: rgb(60, 65, 67); } .select2-container--classic.select2-container--open .select2-selection--single { - border-color: rgb(4, 60, 150); + border-color: rgb(3, 50, 125); } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background-image: initial; @@ -3635,41 +3663,41 @@ code .il { border-color: initial; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent rgb(82, 88, 92); + border-color: transparent transparent rgb(68, 73, 76); } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top-color: initial; - background-image: linear-gradient(rgb(24, 26, 27) 0%, - rgb(34, 36, 38) 50%); + background-image: linear-gradient(rgb(20, 22, 22) 0%, + rgb(28, 30, 32) 50%); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom-color: initial; - background-image: linear-gradient(rgb(34, 36, 38) 50%, - rgb(24, 26, 27) 100%); + background-image: linear-gradient(rgb(28, 30, 32) 50%, + rgb(20, 22, 22) 100%); } .select2-container--classic .select2-selection--multiple { - background-color: rgb(24, 26, 27); - border-color: rgb(72, 78, 81); + background-color: rgb(20, 22, 22); + border-color: rgb(60, 65, 67); outline-color: initial; } .select2-container--classic .select2-selection--multiple:focus { - border-color: rgb(4, 60, 150); + border-color: rgb(3, 50, 125); } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style-image: initial; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: rgb(39, 43, 44); - border-color: rgb(72, 78, 81); + background-color: rgb(32, 36, 37); + border-color: rgb(60, 65, 67); } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: rgb(157, 148, 136); + color: rgb(130, 123, 113); } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: rgb(178, 172, 162); + color: rgb(148, 143, 134); } .select2-container--classic.select2-container--open .select2-selection--multiple { - border-color: rgb(4, 60, 150); + border-color: rgb(3, 50, 125); } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top-color: initial; @@ -3678,7 +3706,7 @@ code .il { border-bottom-color: initial; } .select2-container--classic .select2-search--dropdown .select2-search__field { - border-color: rgb(72, 78, 81); + border-color: rgb(60, 65, 67); outline-color: initial; } .select2-container--classic .select2-search--inline .select2-search__field { @@ -3686,7 +3714,7 @@ code .il { box-shadow: none; } .select2-container--classic .select2-dropdown { - background-color: rgb(24, 26, 27); border-color: transparent; + background-color: rgb(20, 22, 22); border-color: transparent; } .select2-container--classic .select2-dropdown--above { border-bottom-color: initial; @@ -3695,97 +3723,97 @@ code .il { border-top-color: initial; } .select2-container--classic .select2-results__option[aria-disabled="true"] { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: rgb(33, 82, 162); - color: rgb(232, 230, 227); + background-color: rgb(27, 68, 134); + color: rgb(193, 191, 188); } .select2-container--classic.select2-container--open .select2-dropdown { - border-color: rgb(4, 60, 150); + border-color: rgb(3, 50, 125); } .icofont-border { - border-color: rgb(52, 56, 58); + border-color: rgb(43, 46, 48); } .icofont-inverse { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .sr-only { border-color: initial; } .CtxtMenu_InfoContent { border-color: initial; - background-color: rgb(34, 36, 38); + background-color: rgb(28, 30, 32); } .CtxtMenu_Info.CtxtMenu_MousePost { outline-color: initial; } .CtxtMenu_Info { border-color: initial; - background-color: rgb(43, 47, 49); - color: rgb(232, 230, 227); - box-shadow: rgb(96, 104, 108) 0px 10px 20px; + background-color: rgb(36, 39, 41); + color: rgb(193, 191, 188); + box-shadow: rgb(80, 86, 90) 0px 10px 20px; } .CtxtMenu_MenuClose { - border-color: rgb(72, 78, 81); - color: rgb(223, 220, 215); + border-color: rgb(60, 65, 67); + color: rgb(185, 183, 178); } .CtxtMenu_MenuClose span { - background-color: rgb(72, 78, 81); + background-color: rgb(60, 65, 67); border-color: initial; } .CtxtMenu_MenuClose:hover { - color: rgb(232, 230, 227) !important; - border-color: rgb(62, 68, 70) !important; + color: rgb(193, 191, 188) !important; + border-color: rgb(51, 56, 58) !important; } .CtxtMenu_MenuClose:hover span { - background-color: rgb(53, 57, 59) !important; + background-color: rgb(44, 47, 49) !important; } .CtxtMenu_MenuClose:hover:focus { outline-color: initial; } .CtxtMenu_Menu { - background-color: rgb(24, 26, 27); - color: rgb(232, 230, 227); - border-color: rgb(62, 68, 70); - box-shadow: rgb(96, 104, 108) 0px 10px 20px; + background-color: rgb(20, 22, 22); + color: rgb(193, 191, 188); + border-color: rgb(51, 56, 58); + box-shadow: rgb(80, 86, 90) 0px 10px 20px; } .CtxtMenu_MenuItem { background-image: initial; background-color: transparent; } .CtxtMenu_MenuArrow { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .CtxtMenu_MenuActive .CtxtMenu_MenuArrow { - color: rgb(232, 230, 227); + color: rgb(193, 191, 188); } .CtxtMenu_MenuInputBox { - color: rgb(168, 160, 149); + color: rgb(139, 133, 124); } .CtxtMenu_SliderValue { - color: rgb(200, 195, 188); + color: rgb(166, 162, 156); } .CtxtMenu_SliderBar { outline-color: initial; background-image: initial; - background-color: rgb(49, 53, 55); + background-color: rgb(41, 44, 46); } .CtxtMenu_MenuRule { - border-top-color: rgb(58, 62, 65); + border-top-color: rgb(48, 51, 54); } .CtxtMenu_MenuDisabled { - color: rgb(152, 143, 129); + color: rgb(126, 119, 107); } .CtxtMenu_MenuActive { - background-color: rgb(79, 86, 89); - color: rgb(232, 230, 227); + background-color: rgb(66, 71, 74); + color: rgb(193, 191, 188); } .CtxtMenu_MenuDisabled:focus { - background-color: rgb(37, 40, 42); + background-color: rgb(31, 33, 35); } .CtxtMenu_MenuLabel:focus { - background-color: rgb(37, 40, 42); + background-color: rgb(31, 33, 35); } .CtxtMenu_ContextMenu:focus { outline-color: initial; @@ -3798,30 +3826,27 @@ code .il { box-shadow: none; } .CtxtMenu_SelectionBox { - background-color: rgb(24, 26, 27); + background-color: rgb(20, 22, 22); } .CtxtMenu_SelectionDivider { - border-top-color: rgb(140, 130, 115); + border-top-color: rgb(116, 108, 95); } mjx-merror { - color: rgb(255, 26, 26); - background-color: rgb(153, 153, 0); + color: rgb(212, 22, 22); + background-color: rgb(127, 127, 0); } mjx-assistive-mml { border-color: initial !important; } -mjx-stretchy-v > mjx-ext { - border-color: transparent; -} -.recently-attempted ul { - list-style-image: initial; -} /* Override Style */ .vimvixen-hint { - background-color: #7b5300 !important; - border-color: #d8b013 !important; - color: #f3e8c8 !important; + background-color: #664500 !important; + border-color: #b39210 !important; + color: #cac1a6 !important; +} +#vimvixen-console-frame { + color-scheme: light !important } ::placeholder { opacity: 0.5 !important; @@ -3832,7 +3857,7 @@ mjx-stretchy-v > mjx-ext { color: var(--darkreader-neutral-text) !important; } gr-main-header { - background-color: #0f3a48 !important; + background-color: #0d303c !important; } .tou-z65h9k, .tou-mignzq, @@ -3841,7 +3866,7 @@ gr-main-header { background-color: var(--darkreader-neutral-background) !important; } .tou-75mvi { - background-color: #032029 !important; + background-color: #031b22 !important; } .tou-ta9e87, .tou-1w3fhi0, @@ -3850,11 +3875,43 @@ gr-main-header { .tou-1lpmd9d, .tou-1frrtv8, .tou-17ezmgn { - background-color: #0a0a0a !important; + background-color: #080808 !important; } .tou-uknfeu { - background-color: #231603 !important; + background-color: #1d1202 !important; } .tou-6i3zyv { - background-color: #19576c !important; + background-color: #15485a !important; +} +div.mermaid-viewer-control-panel .btn { + fill: var(--darkreader-neutral-text); + background-color: var(--darkreader-neutral-background); +} +svg g rect.er { + fill: var(--darkreader-neutral-background) !important; +} +svg g rect.er.entityBox { + fill: var(--darkreader-neutral-background) !important; +} +svg g rect.er.attributeBoxOdd { + fill: var(--darkreader-neutral-background) !important; +} +svg g rect.er.attributeBoxEven { + fill-opacity: 0.8 !important; + fill: var(--darkreader-selection-background); +} +svg rect.er.relationshipLabelBox { + fill: var(--darkreader-neutral-background) !important; +} +svg g g.nodes rect, svg g g.nodes polygon { + fill: var(--darkreader-neutral-background) !important; +} +svg g rect.task { + fill: var(--darkreader-selection-background) !important; +} +svg line.messageLine0, svg line.messageLine1 { + stroke: var(--darkreader-neutral-text) !important; +} +div.mermaid .actor { + fill: var(--darkreader-neutral-background) !important; } diff --git a/resources/datetime-picker/datetimepicker.full.min.js b/resources/datetime-picker/datetimepicker.full.min.js new file mode 100644 index 0000000..a2a09c6 --- /dev/null +++ b/resources/datetime-picker/datetimepicker.full.min.js @@ -0,0 +1 @@ +var DateFormatter;!function(){"use strict";var e,t,a,r,n,o,i;o=864e5,i=3600,e=function(e,t){return"string"==typeof e&&"string"==typeof t&&e.toLowerCase()===t.toLowerCase()},t=function(e,a,r){var n=r||"0",o=e.toString();return o.lengths?"20":"19")+i):s,h=!0;break;case"m":case"n":case"M":case"F":if(isNaN(s)){if(!((u=m.getMonth(i))>0))return null;D.month=u}else{if(!(s>=1&&12>=s))return null;D.month=s}h=!0;break;case"d":case"j":if(!(s>=1&&31>=s))return null;D.day=s,h=!0;break;case"g":case"h":if(d=r.indexOf("a")>-1?r.indexOf("a"):r.indexOf("A")>-1?r.indexOf("A"):-1,c=n[d],d>-1)l=e(c,p.meridiem[0])?0:e(c,p.meridiem[1])?12:-1,s>=1&&12>=s&&l>-1?D.hour=s+l-1:s>=0&&23>=s&&(D.hour=s);else{if(!(s>=0&&23>=s))return null;D.hour=s}g=!0;break;case"G":case"H":if(!(s>=0&&23>=s))return null;D.hour=s,g=!0;break;case"i":if(!(s>=0&&59>=s))return null;D.min=s,g=!0;break;case"s":if(!(s>=0&&59>=s))return null;D.sec=s,g=!0}if(!0===h&&D.year&&D.month&&D.day)D.date=new Date(D.year,D.month-1,D.day,D.hour,D.min,D.sec,0);else{if(!0!==g)return null;D.date=new Date(0,0,0,D.hour,D.min,D.sec,0)}return D.date},guessDate:function(e,t){if("string"!=typeof e)return e;var a,r,n,o,i,s,u=this,d=e.replace(u.separators,"\0").split("\0"),l=/^[djmn]/g,f=t.match(u.validParts),c=new Date,m=0;if(!l.test(f[0]))return e;for(n=0;na?a:4,!(r=parseInt(4>a?r.toString().substr(0,4-a)+i:i.substr(0,4))))return null;c.setFullYear(r);break;case 3:c.setHours(s);break;case 4:c.setMinutes(s);break;case 5:c.setSeconds(s)}(o=i.substr(m)).length>0&&d.splice(n+1,0,o)}return c},parseFormat:function(e,a){var r,n=this,s=n.dateSettings,u=/\\?(.?)/gi,d=function(e,t){return r[e]?r[e]():t};return r={d:function(){return t(r.j(),2)},D:function(){return s.daysShort[r.w()]},j:function(){return a.getDate()},l:function(){return s.days[r.w()]},N:function(){return r.w()||7},w:function(){return a.getDay()},z:function(){var e=new Date(r.Y(),r.n()-1,r.j()),t=new Date(r.Y(),0,1);return Math.round((e-t)/o)},W:function(){var e=new Date(r.Y(),r.n()-1,r.j()-r.N()+3),a=new Date(e.getFullYear(),0,4);return t(1+Math.round((e-a)/o/7),2)},F:function(){return s.months[a.getMonth()]},m:function(){return t(r.n(),2)},M:function(){return s.monthsShort[a.getMonth()]},n:function(){return a.getMonth()+1},t:function(){return new Date(r.Y(),r.n(),0).getDate()},L:function(){var e=r.Y();return e%4==0&&e%100!=0||e%400==0?1:0},o:function(){var e=r.n(),t=r.W();return r.Y()+(12===e&&9>t?1:1===e&&t>9?-1:0)},Y:function(){return a.getFullYear()},y:function(){return r.Y().toString().slice(-2)},a:function(){return r.A().toLowerCase()},A:function(){var e=r.G()<12?0:1;return s.meridiem[e]},B:function(){var e=a.getUTCHours()*i,r=60*a.getUTCMinutes(),n=a.getUTCSeconds();return t(Math.floor((e+r+n+i)/86.4)%1e3,3)},g:function(){return r.G()%12||12},G:function(){return a.getHours()},h:function(){return t(r.g(),2)},H:function(){return t(r.G(),2)},i:function(){return t(a.getMinutes(),2)},s:function(){return t(a.getSeconds(),2)},u:function(){return t(1e3*a.getMilliseconds(),6)},e:function(){return/\((.*)\)/.exec(String(a))[1]||"Coordinated Universal Time"},I:function(){return new Date(r.Y(),0)-Date.UTC(r.Y(),0)!=new Date(r.Y(),6)-Date.UTC(r.Y(),6)?1:0},O:function(){var e=a.getTimezoneOffset(),r=Math.abs(e);return(e>0?"-":"+")+t(100*Math.floor(r/60)+r%60,4)},P:function(){var e=r.O();return e.substr(0,3)+":"+e.substr(3,2)},T:function(){return(String(a).match(n.tzParts)||[""]).pop().replace(n.tzClip,"")||"UTC"},Z:function(){return 60*-a.getTimezoneOffset()},c:function(){return"Y-m-d\\TH:i:sP".replace(u,d)},r:function(){return"D, d M Y H:i:s O".replace(u,d)},U:function(){return a.getTime()/1e3||0}},d(e,e)},formatDate:function(e,t){var a,r,n,o,i,s=this,u="";if("string"==typeof e&&!(e=s.parseDate(e,t)))return null;if(e instanceof Date){for(n=t.length,a=0;n>a;a++)"S"!==(i=t.charAt(a))&&"\\"!==i&&(a>0&&"\\"===t.charAt(a-1)?u+=i:(o=s.parseFormat(i,e),a!==n-1&&s.intParts.test(i)&&"S"===t.charAt(a+1)&&(r=parseInt(o)||0,o+=s.dateSettings.ordinal(r)),u+=o));return u}return""}}}();var datetimepickerFactory=function(e){"use strict";function t(e,t,a){this.date=e,this.desc=t,this.style=a}var a={i18n:{ar:{months:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],dayOfWeekShort:["ن","ث","ع","خ","ج","س","ح"],dayOfWeek:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","الأحد"]},ro:{months:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],dayOfWeekShort:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],dayOfWeek:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"]},id:{months:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"],dayOfWeekShort:["Min","Sen","Sel","Rab","Kam","Jum","Sab"],dayOfWeek:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"]},is:{months:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],dayOfWeekShort:["Sun","Mán","Þrið","Mið","Fim","Fös","Lau"],dayOfWeek:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"]},bg:{months:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],dayOfWeekShort:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],dayOfWeek:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"]},fa:{months:["فروردین","اردیبهشت","خرداد","تیر","مرداد","شهریور","مهر","آبان","آذر","دی","بهمن","اسفند"],dayOfWeekShort:["یکشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayOfWeek:["یک‌شنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنج‌شنبه","جمعه","شنبه","یک‌شنبه"]},ru:{months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],dayOfWeekShort:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],dayOfWeek:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"]},uk:{months:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],dayOfWeekShort:["Ндл","Пнд","Втр","Срд","Чтв","Птн","Сбт"],dayOfWeek:["Неділя","Понеділок","Вівторок","Середа","Четвер","П'ятниця","Субота"]},en:{months:["January","February","March","April","May","June","July","August","September","October","November","December"],dayOfWeekShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},el:{months:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],dayOfWeekShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayOfWeek:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"]},de:{months:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],dayOfWeekShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayOfWeek:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]},nl:{months:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],dayOfWeekShort:["zo","ma","di","wo","do","vr","za"],dayOfWeek:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"]},tr:{months:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],dayOfWeekShort:["Paz","Pts","Sal","Çar","Per","Cum","Cts"],dayOfWeek:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"]},fr:{months:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],dayOfWeekShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayOfWeek:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]},es:{months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],dayOfWeekShort:["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"],dayOfWeek:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"]},th:{months:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],dayOfWeekShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayOfWeek:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัส","ศุกร์","เสาร์","อาทิตย์"]},pl:{months:["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],dayOfWeekShort:["nd","pn","wt","śr","cz","pt","sb"],dayOfWeek:["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"]},pt:{months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],dayOfWeekShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sab"],dayOfWeek:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"]},ch:{months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayOfWeekShort:["日","一","二","三","四","五","六"]},se:{months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],dayOfWeekShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"]},km:{months:["មករា​","កុម្ភៈ","មិនា​","មេសា​","ឧសភា​","មិថុនា​","កក្កដា​","សីហា​","កញ្ញា​","តុលា​","វិច្ឆិកា","ធ្នូ​"],dayOfWeekShort:["អាទិ​","ច័ន្ទ​","អង្គារ​","ពុធ​","ព្រហ​​","សុក្រ​","សៅរ៍"],dayOfWeek:["អាទិត្យ​","ច័ន្ទ​","អង្គារ​","ពុធ​","ព្រហស្បតិ៍​","សុក្រ​","សៅរ៍"]},kr:{months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayOfWeekShort:["일","월","화","수","목","금","토"],dayOfWeek:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"]},it:{months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],dayOfWeekShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayOfWeek:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"]},da:{months:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],dayOfWeekShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayOfWeek:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"]},no:{months:["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],dayOfWeekShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayOfWeek:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"]},ja:{months:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeekShort:["日","月","火","水","木","金","土"],dayOfWeek:["日曜","月曜","火曜","水曜","木曜","金曜","土曜"]},vi:{months:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayOfWeekShort:["CN","T2","T3","T4","T5","T6","T7"],dayOfWeek:["Chủ nhật","Thứ hai","Thứ ba","Thứ tư","Thứ năm","Thứ sáu","Thứ bảy"]},sl:{months:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],dayOfWeekShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayOfWeek:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"]},cs:{months:["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"],dayOfWeekShort:["Ne","Po","Út","St","Čt","Pá","So"]},hu:{months:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],dayOfWeekShort:["Va","Hé","Ke","Sze","Cs","Pé","Szo"],dayOfWeek:["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"]},az:{months:["Yanvar","Fevral","Mart","Aprel","May","Iyun","Iyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],dayOfWeekShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayOfWeek:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"]},bs:{months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],dayOfWeekShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayOfWeek:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"]},ca:{months:["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"],dayOfWeekShort:["Dg","Dl","Dt","Dc","Dj","Dv","Ds"],dayOfWeek:["Diumenge","Dilluns","Dimarts","Dimecres","Dijous","Divendres","Dissabte"]},"en-GB":{months:["January","February","March","April","May","June","July","August","September","October","November","December"],dayOfWeekShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},et:{months:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],dayOfWeekShort:["P","E","T","K","N","R","L"],dayOfWeek:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"]},eu:{months:["Urtarrila","Otsaila","Martxoa","Apirila","Maiatza","Ekaina","Uztaila","Abuztua","Iraila","Urria","Azaroa","Abendua"],dayOfWeekShort:["Ig.","Al.","Ar.","Az.","Og.","Or.","La."],dayOfWeek:["Igandea","Astelehena","Asteartea","Asteazkena","Osteguna","Ostirala","Larunbata"]},fi:{months:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],dayOfWeekShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayOfWeek:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"]},gl:{months:["Xan","Feb","Maz","Abr","Mai","Xun","Xul","Ago","Set","Out","Nov","Dec"],dayOfWeekShort:["Dom","Lun","Mar","Mer","Xov","Ven","Sab"],dayOfWeek:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"]},hr:{months:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],dayOfWeekShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayOfWeek:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"]},ko:{months:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayOfWeekShort:["일","월","화","수","목","금","토"],dayOfWeek:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"]},lt:{months:["Sausio","Vasario","Kovo","Balandžio","Gegužės","Birželio","Liepos","Rugpjūčio","Rugsėjo","Spalio","Lapkričio","Gruodžio"],dayOfWeekShort:["Sek","Pir","Ant","Tre","Ket","Pen","Šeš"],dayOfWeek:["Sekmadienis","Pirmadienis","Antradienis","Trečiadienis","Ketvirtadienis","Penktadienis","Šeštadienis"]},lv:{months:["Janvāris","Februāris","Marts","Aprīlis ","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],dayOfWeekShort:["Sv","Pr","Ot","Tr","Ct","Pk","St"],dayOfWeek:["Svētdiena","Pirmdiena","Otrdiena","Trešdiena","Ceturtdiena","Piektdiena","Sestdiena"]},mk:{months:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],dayOfWeekShort:["нед","пон","вто","сре","чет","пет","саб"],dayOfWeek:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"]},mn:{months:["1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар"],dayOfWeekShort:["Дав","Мяг","Лха","Пүр","Бсн","Бям","Ням"],dayOfWeek:["Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба","Ням"]},"pt-BR":{months:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],dayOfWeekShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayOfWeek:["Domingo","Segunda","Terça","Quarta","Quinta","Sexta","Sábado"]},sk:{months:["Január","Február","Marec","Apríl","Máj","Jún","Júl","August","September","Október","November","December"],dayOfWeekShort:["Ne","Po","Ut","St","Št","Pi","So"],dayOfWeek:["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"]},sq:{months:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],dayOfWeekShort:["Die","Hën","Mar","Mër","Enj","Pre","Shtu"],dayOfWeek:["E Diel","E Hënë","E Martē","E Mërkurë","E Enjte","E Premte","E Shtunë"]},"sr-YU":{months:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],dayOfWeekShort:["Ned","Pon","Uto","Sre","čet","Pet","Sub"],dayOfWeek:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"]},sr:{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],dayOfWeekShort:["нед","пон","уто","сре","чет","пет","суб"],dayOfWeek:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"]},sv:{months:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],dayOfWeekShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayOfWeek:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"]},"zh-TW":{months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayOfWeekShort:["日","一","二","三","四","五","六"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},zh:{months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayOfWeekShort:["日","一","二","三","四","五","六"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},ug:{months:["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي"],dayOfWeek:["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"]},he:{months:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],dayOfWeekShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayOfWeek:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת","ראשון"]},hy:{months:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],dayOfWeekShort:["Կի","Երկ","Երք","Չոր","Հնգ","Ուրբ","Շբթ"],dayOfWeek:["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","Ուրբաթ","Շաբաթ"]},kg:{months:["Үчтүн айы","Бирдин айы","Жалган Куран","Чын Куран","Бугу","Кулжа","Теке","Баш Оона","Аяк Оона","Тогуздун айы","Жетинин айы","Бештин айы"],dayOfWeekShort:["Жек","Дүй","Шей","Шар","Бей","Жум","Ише"],dayOfWeek:["Жекшемб","Дүйшөмб","Шейшемб","Шаршемб","Бейшемби","Жума","Ишенб"]},rm:{months:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],dayOfWeekShort:["Du","Gli","Ma","Me","Gie","Ve","So"],dayOfWeek:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"]},ka:{months:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],dayOfWeekShort:["კვ","ორშ","სამშ","ოთხ","ხუთ","პარ","შაბ"],dayOfWeek:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"]}},ownerDocument:document,contentWindow:window,value:"",rtl:!1,format:"Y/m/d H:i",formatTime:"H:i",formatDate:"Y/m/d",startDate:!1,step:60,monthChangeSpinner:!0,closeOnDateSelect:!1,closeOnTimeSelect:!0,closeOnWithoutClick:!0,closeOnInputClick:!0,openOnFocus:!0,timepicker:!0,datepicker:!0,weeks:!1,defaultTime:!1,defaultDate:!1,minDate:!1,maxDate:!1,minTime:!1,maxTime:!1,minDateTime:!1,maxDateTime:!1,allowTimes:[],opened:!1,initTime:!0,inline:!1,theme:"",touchMovedThreshold:5,onSelectDate:function(){},onSelectTime:function(){},onChangeMonth:function(){},onGetWeekOfYear:function(){},onChangeYear:function(){},onChangeDateTime:function(){},onShow:function(){},onClose:function(){},onGenerate:function(){},withoutCopyright:!0,inverseButton:!1,hours12:!1,next:"xdsoft_next",prev:"xdsoft_prev",dayOfWeekStart:0,parentID:"body",timeHeightInTimePicker:25,timepickerScrollbar:!0,todayButton:!0,prevButton:!0,nextButton:!0,defaultSelect:!0,scrollMonth:!0,scrollTime:!0,scrollInput:!0,lazyInit:!1,mask:!1,validateOnBlur:!0,allowBlank:!0,yearStart:1950,yearEnd:2050,monthStart:0,monthEnd:11,style:"",id:"",fixed:!1,roundTime:"round",className:"",weekends:[],highlightedDates:[],highlightedPeriods:[],allowDates:[],allowDateRe:null,disabledDates:[],disabledWeekDays:[],yearOffset:0,beforeShowDay:null,enterLikeTab:!0,showApplyButton:!1},r=null,n=null,o="en",i={meridiem:["AM","PM"]},s=function(){var t=a.i18n[o],s={days:t.dayOfWeek,daysShort:t.dayOfWeekShort,months:t.months,monthsShort:e.map(t.months,function(e){return e.substring(0,3)})};"function"==typeof DateFormatter&&(r=n=new DateFormatter({dateSettings:e.extend({},i,s)}))},u={moment:{default_options:{format:"YYYY/MM/DD HH:mm",formatDate:"YYYY/MM/DD",formatTime:"HH:mm"},formatter:{parseDate:function(e,t){if(l(t))return n.parseDate(e,t);var a=moment(e,t);return!!a.isValid()&&a.toDate()},formatDate:function(e,t){return l(t)?n.formatDate(e,t):moment(e).format(t)},formatMask:function(e){return e.replace(/Y{4}/g,"9999").replace(/Y{2}/g,"99").replace(/M{2}/g,"19").replace(/D{2}/g,"39").replace(/H{2}/g,"29").replace(/m{2}/g,"59").replace(/s{2}/g,"59")}}}};e.datetimepicker={setLocale:function(e){var t=a.i18n[e]?e:"en";o!==t&&(o=t,s())},setDateFormatter:function(t){if("string"==typeof t&&u.hasOwnProperty(t)){var n=u[t];e.extend(a,n.default_options),r=n.formatter}else r=t}};var d={RFC_2822:"D, d M Y H:i:s O",ATOM:"Y-m-dTH:i:sP",ISO_8601:"Y-m-dTH:i:sO",RFC_822:"D, d M y H:i:s O",RFC_850:"l, d-M-y H:i:s T",RFC_1036:"D, d M y H:i:s O",RFC_1123:"D, d M Y H:i:s O",RSS:"D, d M Y H:i:s O",W3C:"Y-m-dTH:i:sP"},l=function(e){return-1!==Object.values(d).indexOf(e)};e.extend(e.datetimepicker,d),s(),window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var a=/(-([a-z]))/g;return"float"===t&&(t="styleFloat"),a.test(t)&&(t=t.replace(a,function(e,t,a){return a.toUpperCase()})),e.currentStyle[t]||null},this}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e,t){var a,r;for(a=t||0,r=this.length;a'),s=e('
'),i.append(s),u.addClass("xdsoft_scroller_box").append(i),D=function(e){var t=d(e).y-c+p;t<0&&(t=0),t+s[0].offsetHeight>h&&(t=h-s[0].offsetHeight),u.trigger("scroll_element.xdsoft_scroller",[l?t/l:0])},s.on("touchstart.xdsoft_scroller mousedown.xdsoft_scroller",function(r){n||u.trigger("resize_scroll.xdsoft_scroller",[a]),c=d(r).y,p=parseInt(s.css("margin-top"),10),h=i[0].offsetHeight,"mousedown"===r.type||"touchstart"===r.type?(t.ownerDocument&&e(t.ownerDocument.body).addClass("xdsoft_noselect"),e([t.ownerDocument.body,t.contentWindow]).on("touchend mouseup.xdsoft_scroller",function a(){e([t.ownerDocument.body,t.contentWindow]).off("touchend mouseup.xdsoft_scroller",a).off("mousemove.xdsoft_scroller",D).removeClass("xdsoft_noselect")}),e(t.ownerDocument.body).on("mousemove.xdsoft_scroller",D)):(g=!0,r.stopPropagation(),r.preventDefault())}).on("touchmove",function(e){g&&(e.preventDefault(),D(e))}).on("touchend touchcancel",function(){g=!1,p=0}),u.on("scroll_element.xdsoft_scroller",function(e,t){n||u.trigger("resize_scroll.xdsoft_scroller",[t,!0]),t=t>1?1:t<0||isNaN(t)?0:t,s.css("margin-top",l*t),setTimeout(function(){r.css("marginTop",-parseInt((r[0].offsetHeight-n)*t,10))},10)}).on("resize_scroll.xdsoft_scroller",function(e,t,a){var d,f;n=u[0].clientHeight,o=r[0].offsetHeight,f=(d=n/o)*i[0].offsetHeight,d>1?s.hide():(s.show(),s.css("height",parseInt(f>10?f:10,10)),l=i[0].offsetHeight-s[0].offsetHeight,!0!==a&&u.trigger("scroll_element.xdsoft_scroller",[t||Math.abs(parseInt(r.css("marginTop"),10))/(o-n)]))}),u.on("mousewheel",function(e){var t=Math.abs(parseInt(r.css("marginTop"),10));return(t-=20*e.deltaY)<0&&(t=0),u.trigger("scroll_element.xdsoft_scroller",[t/(o-n)]),e.stopPropagation(),!1}),u.on("touchstart",function(e){f=d(e),m=Math.abs(parseInt(r.css("marginTop"),10))}),u.on("touchmove",function(e){if(f){e.preventDefault();var t=d(e);u.trigger("scroll_element.xdsoft_scroller",[(m-(t.y-f.y))/(o-n)])}}),u.on("touchend touchcancel",function(){f=!1,m=0})),u.trigger("resize_scroll.xdsoft_scroller",[a])):u.find(".xdsoft_scrollbar").hide()})},e.fn.datetimepicker=function(n,i){var s,u,d=this,l=48,f=57,c=96,m=105,h=17,g=46,p=13,D=27,v=8,y=37,b=38,k=39,x=40,T=9,S=116,M=65,w=67,O=86,W=90,_=89,F=!1,C=e.isPlainObject(n)||!n?e.extend(!0,{},a,n):e.extend(!0,{},a),P=0,Y=function(e){e.on("open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart",function t(){e.is(":disabled")||e.data("xdsoft_datetimepicker")||(clearTimeout(P),P=setTimeout(function(){e.data("xdsoft_datetimepicker")||s(e),e.off("open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart",t).trigger("open.xdsoft")},100))})};return s=function(a){function i(){var e,t=!1;return C.startDate?t=A.strToDate(C.startDate):(t=C.value||(a&&a.val&&a.val()?a.val():""))?(t=A.strToDateTime(t),C.yearOffset&&(t=new Date(t.getFullYear()-C.yearOffset,t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()))):C.defaultDate&&(t=A.strToDateTime(C.defaultDate),C.defaultTime&&(e=A.strtotime(C.defaultTime),t.setHours(e.getHours()),t.setMinutes(e.getMinutes()))),t&&A.isValidDate(t)?j.data("changed",!0):t="",t||0}function s(t){var n=function(e,t){var a=e.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g,"\\$1").replace(/_/g,"{digit+}").replace(/([0-9]{1})/g,"{digit$1}").replace(/\{digit([0-9]{1})\}/g,"[0-$1_]{1}").replace(/\{digit[\+]\}/g,"[0-9_]{1}");return new RegExp(a).test(t)},o=function(e,a){if(!(e="string"==typeof e||e instanceof String?t.ownerDocument.getElementById(e):e))return!1;if(e.createTextRange){var r=e.createTextRange();return r.collapse(!0),r.moveEnd("character",a),r.moveStart("character",a),r.select(),!0}return!!e.setSelectionRange&&(e.setSelectionRange(a,a),!0)};t.mask&&a.off("keydown.xdsoft"),!0===t.mask&&(r.formatMask?t.mask=r.formatMask(t.format):t.mask=t.format.replace(/Y/g,"9999").replace(/F/g,"9999").replace(/m/g,"19").replace(/d/g,"39").replace(/H/g,"29").replace(/i/g,"59").replace(/s/g,"59")),"string"===e.type(t.mask)&&(n(t.mask,a.val())||(a.val(t.mask.replace(/[0-9]/g,"_")),o(a[0],0)),a.on("paste.xdsoft",function(r){var i=(r.clipboardData||r.originalEvent.clipboardData||window.clipboardData).getData("text"),s=this.value,u=this.selectionStart;return s=s.substr(0,u)+i+s.substr(u+i.length),u+=i.length,n(t.mask,s)?(this.value=s,o(this,u)):""===e.trim(s)?this.value=t.mask.replace(/[0-9]/g,"_"):a.trigger("error_input.xdsoft"),r.preventDefault(),!1}),a.on("keydown.xdsoft",function(r){var i,s=this.value,u=r.which,d=this.selectionStart,C=this.selectionEnd,P=d!==C;if(u>=l&&u<=f||u>=c&&u<=m||u===v||u===g){for(i=u===v||u===g?"_":String.fromCharCode(c<=u&&u<=m?u-l:u),u===v&&d&&!P&&(d-=1);;){var Y=t.mask.substr(d,1),A=d0;if(!(/[^0-9_]/.test(Y)&&A&&H))break;d+=u!==v||P?1:-1}if(P){var j=C-d,J=t.mask.replace(/[0-9]/g,"_"),z=J.substr(d,j).substr(1);s=s.substr(0,d)+(i+z)+s.substr(d+j)}else s=s.substr(0,d)+i+s.substr(d+1);if(""===e.trim(s))s=J;else if(d===t.mask.length)return r.preventDefault(),!1;for(d+=u===v?0:1;/[^0-9_]/.test(t.mask.substr(d,1))&&d0;)d+=u===v?0:1;n(t.mask,s)?(this.value=s,o(this,d)):""===e.trim(s)?this.value=t.mask.replace(/[0-9]/g,"_"):a.trigger("error_input.xdsoft")}else if(-1!==[M,w,O,W,_].indexOf(u)&&F||-1!==[D,b,x,y,k,S,h,T,p].indexOf(u))return!0;return r.preventDefault(),!1}))}var u,d,P,Y,A,H,j=e('
'),J=e(''),z=e('
'),I=e('
'),N=e('
'),L=e('
'),E=L.find(".xdsoft_time_box").eq(0),R=e('
'),V=e(''),B=e('
'),G=e('
'),U=!1,q=0;C.id&&j.attr("id",C.id),C.style&&j.attr("style",C.style),C.weeks&&j.addClass("xdsoft_showweeks"),C.rtl&&j.addClass("xdsoft_rtl"),j.addClass("xdsoft_"+C.theme),j.addClass(C.className),I.find(".xdsoft_month span").after(B),I.find(".xdsoft_year span").after(G),I.find(".xdsoft_month,.xdsoft_year").on("touchstart mousedown.xdsoft",function(t){var a,r,n=e(this).find(".xdsoft_select").eq(0),o=0,i=0,s=n.is(":visible");for(I.find(".xdsoft_select").hide(),A.currentTime&&(o=A.currentTime[e(this).hasClass("xdsoft_month")?"getMonth":"getFullYear"]()),n[s?"hide":"show"](),a=n.find("div.xdsoft_option"),r=0;rC.touchMovedThreshold&&(this.touchMoved=!0)};I.find(".xdsoft_select").xdsoftScroller(C).on("touchstart mousedown.xdsoft",function(e){var t=e.originalEvent;this.touchMoved=!1,this.touchStartPosition=t.touches?t.touches[0]:t,e.stopPropagation(),e.preventDefault()}).on("touchmove",".xdsoft_option",X).on("touchend mousedown.xdsoft",".xdsoft_option",function(){if(!this.touchMoved){void 0!==A.currentTime&&null!==A.currentTime||(A.currentTime=A.now());var t=A.currentTime.getFullYear();A&&A.currentTime&&A.currentTime[e(this).parent().parent().hasClass("xdsoft_monthselect")?"setMonth":"setFullYear"](e(this).data("value")),e(this).parent().parent().hide(),j.trigger("xchange.xdsoft"),C.onChangeMonth&&e.isFunction(C.onChangeMonth)&&C.onChangeMonth.call(j,A.currentTime,j.data("input")),t!==A.currentTime.getFullYear()&&e.isFunction(C.onChangeYear)&&C.onChangeYear.call(j,A.currentTime,j.data("input"))}}),j.getValue=function(){return A.getCurrentTime()},j.setOptions=function(n){var o={};C=e.extend(!0,{},C,n),n.allowTimes&&e.isArray(n.allowTimes)&&n.allowTimes.length&&(C.allowTimes=e.extend(!0,[],n.allowTimes)),n.weekends&&e.isArray(n.weekends)&&n.weekends.length&&(C.weekends=e.extend(!0,[],n.weekends)),n.allowDates&&e.isArray(n.allowDates)&&n.allowDates.length&&(C.allowDates=e.extend(!0,[],n.allowDates)),n.allowDateRe&&"[object String]"===Object.prototype.toString.call(n.allowDateRe)&&(C.allowDateRe=new RegExp(n.allowDateRe)),n.highlightedDates&&e.isArray(n.highlightedDates)&&n.highlightedDates.length&&(e.each(n.highlightedDates,function(a,n){var i,s=e.map(n.split(","),e.trim),u=new t(r.parseDate(s[0],C.formatDate),s[1],s[2]),d=r.formatDate(u.date,C.formatDate);void 0!==o[d]?(i=o[d].desc)&&i.length&&u.desc&&u.desc.length&&(o[d].desc=i+"\n"+u.desc):o[d]=u}),C.highlightedDates=e.extend(!0,[],o)),n.highlightedPeriods&&e.isArray(n.highlightedPeriods)&&n.highlightedPeriods.length&&(o=e.extend(!0,[],C.highlightedDates),e.each(n.highlightedPeriods,function(a,n){var i,s,u,d,l,f,c;if(e.isArray(n))i=n[0],s=n[1],u=n[2],c=n[3];else{var m=e.map(n.split(","),e.trim);i=r.parseDate(m[0],C.formatDate),s=r.parseDate(m[1],C.formatDate),u=m[2],c=m[3]}for(;i<=s;)d=new t(i,u,c),l=r.formatDate(i,C.formatDate),i.setDate(i.getDate()+1),void 0!==o[l]?(f=o[l].desc)&&f.length&&d.desc&&d.desc.length&&(o[l].desc=f+"\n"+d.desc):o[l]=d}),C.highlightedDates=e.extend(!0,[],o)),n.disabledDates&&e.isArray(n.disabledDates)&&n.disabledDates.length&&(C.disabledDates=e.extend(!0,[],n.disabledDates)),n.disabledWeekDays&&e.isArray(n.disabledWeekDays)&&n.disabledWeekDays.length&&(C.disabledWeekDays=e.extend(!0,[],n.disabledWeekDays)),!C.open&&!C.opened||C.inline||a.trigger("open.xdsoft"),C.inline&&(U=!0,j.addClass("xdsoft_inline"),a.after(j).hide()),C.inverseButton&&(C.next="xdsoft_prev",C.prev="xdsoft_next"),C.datepicker?z.addClass("active"):z.removeClass("active"),C.timepicker?L.addClass("active"):L.removeClass("active"),C.value&&(A.setCurrentTime(C.value),a&&a.val&&a.val(A.str)),isNaN(C.dayOfWeekStart)?C.dayOfWeekStart=0:C.dayOfWeekStart=parseInt(C.dayOfWeekStart,10)%7,C.timepickerScrollbar||E.xdsoftScroller(C,"hide"),C.minDate&&/^[\+\-](.*)$/.test(C.minDate)&&(C.minDate=r.formatDate(A.strToDateTime(C.minDate),C.formatDate)),C.maxDate&&/^[\+\-](.*)$/.test(C.maxDate)&&(C.maxDate=r.formatDate(A.strToDateTime(C.maxDate),C.formatDate)),C.minDateTime&&/^\+(.*)$/.test(C.minDateTime)&&(C.minDateTime=A.strToDateTime(C.minDateTime).dateFormat(C.formatDate)),C.maxDateTime&&/^\+(.*)$/.test(C.maxDateTime)&&(C.maxDateTime=A.strToDateTime(C.maxDateTime).dateFormat(C.formatDate)),V.toggle(C.showApplyButton),I.find(".xdsoft_today_button").css("visibility",C.todayButton?"visible":"hidden"),I.find("."+C.prev).css("visibility",C.prevButton?"visible":"hidden"),I.find("."+C.next).css("visibility",C.nextButton?"visible":"hidden"),s(C),C.validateOnBlur&&a.off("blur.xdsoft").on("blur.xdsoft",function(){if(C.allowBlank&&(!e.trim(e(this).val()).length||"string"==typeof C.mask&&e.trim(e(this).val())===C.mask.replace(/[0-9]/g,"_")))e(this).val(null),j.data("xdsoft_datetime").empty();else{var t=r.parseDate(e(this).val(),C.format);if(t)e(this).val(r.formatDate(t,C.format));else{var a=+[e(this).val()[0],e(this).val()[1]].join(""),n=+[e(this).val()[2],e(this).val()[3]].join("");!C.datepicker&&C.timepicker&&a>=0&&a<24&&n>=0&&n<60?e(this).val([a,n].map(function(e){return e>9?e:"0"+e}).join(":")):e(this).val(r.formatDate(A.now(),C.format))}j.data("xdsoft_datetime").setCurrentTime(e(this).val())}j.trigger("changedatetime.xdsoft"),j.trigger("close.xdsoft")}),C.dayOfWeekStartPrev=0===C.dayOfWeekStart?6:C.dayOfWeekStart-1,j.trigger("xchange.xdsoft").trigger("afterOpen.xdsoft")},j.data("options",C).on("touchstart mousedown.xdsoft",function(e){return e.stopPropagation(),e.preventDefault(),G.hide(),B.hide(),!1}),E.append(R),E.xdsoftScroller(C),j.on("afterOpen.xdsoft",function(){E.xdsoftScroller(C)}),j.append(z).append(L),!0!==C.withoutCopyright&&j.append(J),z.append(I).append(N).append(V),e(C.parentID).append(j),A=new function(){var t=this;t.now=function(e){var a,r,n=new Date;return!e&&C.defaultDate&&(a=t.strToDateTime(C.defaultDate),n.setFullYear(a.getFullYear()),n.setMonth(a.getMonth()),n.setDate(a.getDate())),n.setFullYear(n.getFullYear()),!e&&C.defaultTime&&(r=t.strtotime(C.defaultTime),n.setHours(r.getHours()),n.setMinutes(r.getMinutes()),n.setSeconds(r.getSeconds()),n.setMilliseconds(r.getMilliseconds())),n},t.isValidDate=function(e){return"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e.getTime())},t.setCurrentTime=function(e,a){"string"==typeof e?t.currentTime=t.strToDateTime(e):t.isValidDate(e)?t.currentTime=e:e||a||!C.allowBlank||C.inline?t.currentTime=t.now():t.currentTime=null,j.trigger("xchange.xdsoft")},t.empty=function(){t.currentTime=null},t.getCurrentTime=function(){return t.currentTime},t.nextMonth=function(){void 0!==t.currentTime&&null!==t.currentTime||(t.currentTime=t.now());var a,r=t.currentTime.getMonth()+1;return 12===r&&(t.currentTime.setFullYear(t.currentTime.getFullYear()+1),r=0),a=t.currentTime.getFullYear(),t.currentTime.setDate(Math.min(new Date(t.currentTime.getFullYear(),r+1,0).getDate(),t.currentTime.getDate())),t.currentTime.setMonth(r),C.onChangeMonth&&e.isFunction(C.onChangeMonth)&&C.onChangeMonth.call(j,A.currentTime,j.data("input")),a!==t.currentTime.getFullYear()&&e.isFunction(C.onChangeYear)&&C.onChangeYear.call(j,A.currentTime,j.data("input")),j.trigger("xchange.xdsoft"),r},t.prevMonth=function(){void 0!==t.currentTime&&null!==t.currentTime||(t.currentTime=t.now());var a=t.currentTime.getMonth()-1;return-1===a&&(t.currentTime.setFullYear(t.currentTime.getFullYear()-1),a=11),t.currentTime.setDate(Math.min(new Date(t.currentTime.getFullYear(),a+1,0).getDate(),t.currentTime.getDate())),t.currentTime.setMonth(a),C.onChangeMonth&&e.isFunction(C.onChangeMonth)&&C.onChangeMonth.call(j,A.currentTime,j.data("input")),j.trigger("xchange.xdsoft"),a},t.getWeekOfYear=function(t){if(C.onGetWeekOfYear&&e.isFunction(C.onGetWeekOfYear)){var a=C.onGetWeekOfYear.call(j,t);if(void 0!==a)return a}var r=new Date(t.getFullYear(),0,1);return 4!==r.getDay()&&r.setMonth(0,1+(4-r.getDay()+7)%7),Math.ceil(((t-r)/864e5+r.getDay()+1)/7)},t.strToDateTime=function(e){var a,n,o=[];return e&&e instanceof Date&&t.isValidDate(e)?e:((o=/^([+-]{1})(.*)$/.exec(e))&&(o[2]=r.parseDate(o[2],C.formatDate)),o&&o[2]?(a=o[2].getTime()-6e4*o[2].getTimezoneOffset(),n=new Date(t.now(!0).getTime()+parseInt(o[1]+"1",10)*a)):n=e?r.parseDate(e,C.format):t.now(),t.isValidDate(n)||(n=t.now()),n)},t.strToDate=function(e){if(e&&e instanceof Date&&t.isValidDate(e))return e;var a=e?r.parseDate(e,C.formatDate):t.now(!0);return t.isValidDate(a)||(a=t.now(!0)),a},t.strtotime=function(e){if(e&&e instanceof Date&&t.isValidDate(e))return e;var a=e?r.parseDate(e,C.formatTime):t.now(!0);return t.isValidDate(a)||(a=t.now(!0)),a},t.str=function(){var e=C.format;return C.yearOffset&&(e=(e=e.replace("Y",t.currentTime.getFullYear()+C.yearOffset)).replace("y",String(t.currentTime.getFullYear()+C.yearOffset).substring(2,4))),r.formatDate(t.currentTime,e)},t.currentTime=this.now()},V.on("touchend click",function(e){e.preventDefault(),j.data("changed",!0),A.setCurrentTime(i()),a.val(A.str()),j.trigger("close.xdsoft")}),I.find(".xdsoft_today_button").on("touchend mousedown.xdsoft",function(){j.data("changed",!0),A.setCurrentTime(0,!0),j.trigger("afterOpen.xdsoft")}).on("dblclick.xdsoft",function(){var e,t,r=A.getCurrentTime();r=new Date(r.getFullYear(),r.getMonth(),r.getDate()),e=A.strToDate(C.minDate),r<(e=new Date(e.getFullYear(),e.getMonth(),e.getDate()))||(t=A.strToDate(C.maxDate),r>(t=new Date(t.getFullYear(),t.getMonth(),t.getDate()))||(a.val(A.str()),a.trigger("change"),j.trigger("close.xdsoft")))}),I.find(".xdsoft_prev,.xdsoft_next").on("touchend mousedown.xdsoft",function(){var t=e(this),a=0,r=!1;!function e(n){t.hasClass(C.next)?A.nextMonth():t.hasClass(C.prev)&&A.prevMonth(),C.monthChangeSpinner&&(r||(a=setTimeout(e,n||100)))}(500),e([C.ownerDocument.body,C.contentWindow]).on("touchend mouseup.xdsoft",function t(){clearTimeout(a),r=!0,e([C.ownerDocument.body,C.contentWindow]).off("touchend mouseup.xdsoft",t)})}),L.find(".xdsoft_prev,.xdsoft_next").on("touchend mousedown.xdsoft",function(){var t=e(this),a=0,r=!1,n=110;!function e(o){var i=E[0].clientHeight,s=R[0].offsetHeight,u=Math.abs(parseInt(R.css("marginTop"),10));t.hasClass(C.next)&&s-i-C.timeHeightInTimePicker>=u?R.css("marginTop","-"+(u+C.timeHeightInTimePicker)+"px"):t.hasClass(C.prev)&&u-C.timeHeightInTimePicker>=0&&R.css("marginTop","-"+(u-C.timeHeightInTimePicker)+"px"),E.trigger("scroll_element.xdsoft_scroller",[Math.abs(parseInt(R[0].style.marginTop,10)/(s-i))]),n=n>10?10:n-10,r||(a=setTimeout(e,o||n))}(500),e([C.ownerDocument.body,C.contentWindow]).on("touchend mouseup.xdsoft",function t(){clearTimeout(a),r=!0,e([C.ownerDocument.body,C.contentWindow]).off("touchend mouseup.xdsoft",t)})}),u=0,j.on("xchange.xdsoft",function(t){clearTimeout(u),u=setTimeout(function(){void 0!==A.currentTime&&null!==A.currentTime||(A.currentTime=A.now());for(var t,i,s,u,d,l,f,c,m,h,g="",p=new Date(A.currentTime.getFullYear(),A.currentTime.getMonth(),1,12,0,0),D=0,v=A.now(),y=!1,b=!1,k=!1,x=!1,T=[],S=!0,M="";p.getDay()!==C.dayOfWeekStart;)p.setDate(p.getDate()-1);for(g+="",C.weeks&&(g+=""),t=0;t<7;t+=1)g+="";g+="",g+="",!1!==C.maxDate&&(y=A.strToDate(C.maxDate),y=new Date(y.getFullYear(),y.getMonth(),y.getDate(),23,59,59,999)),!1!==C.minDate&&(b=A.strToDate(C.minDate),b=new Date(b.getFullYear(),b.getMonth(),b.getDate())),!1!==C.minDateTime&&(k=A.strToDate(C.minDateTime),k=new Date(k.getFullYear(),k.getMonth(),k.getDate(),k.getHours(),k.getMinutes(),k.getSeconds())),!1!==C.maxDateTime&&(x=A.strToDate(C.maxDateTime),x=new Date(x.getFullYear(),x.getMonth(),x.getDate(),x.getHours(),x.getMinutes(),x.getSeconds()));var w;for(!1!==x&&(w=31*(12*x.getFullYear()+x.getMonth())+x.getDate());D0&&-1===C.allowDates.indexOf(r.formatDate(p,C.formatDate))&&T.push("xdsoft_disabled");var O=31*(12*p.getFullYear()+p.getMonth())+p.getDate();(!1!==y&&p>y||!1!==k&&pw||c&&!1===c[0])&&T.push("xdsoft_disabled"),-1!==C.disabledDates.indexOf(r.formatDate(p,C.formatDate))&&T.push("xdsoft_disabled"),-1!==C.disabledWeekDays.indexOf(s)&&T.push("xdsoft_disabled"),a.is("[disabled]")&&T.push("xdsoft_disabled"),c&&""!==c[1]&&T.push(c[1]),A.currentTime.getMonth()!==l&&T.push("xdsoft_other_month"),(C.defaultSelect||j.data("changed"))&&r.formatDate(A.currentTime,C.formatDate)===r.formatDate(p,C.formatDate)&&T.push("xdsoft_current"),r.formatDate(v,C.formatDate)===r.formatDate(p,C.formatDate)&&T.push("xdsoft_today"),0!==p.getDay()&&6!==p.getDay()&&-1===C.weekends.indexOf(r.formatDate(p,C.formatDate))||T.push("xdsoft_weekend"),void 0!==C.highlightedDates[r.formatDate(p,C.formatDate)]&&(i=C.highlightedDates[r.formatDate(p,C.formatDate)],T.push(void 0===i.style?"xdsoft_highlighted_default":i.style),h=void 0===i.desc?"":i.desc),C.beforeShowDay&&e.isFunction(C.beforeShowDay)&&T.push(C.beforeShowDay(p)),S&&(g+="",S=!1,C.weeks&&(g+="")),g+='",p.getDay()===C.dayOfWeekStartPrev&&(g+="",S=!0),p.setDate(u+1)}g+="
"+C.i18n[o].dayOfWeekShort[(t+C.dayOfWeekStart)%7]+"
"+f+"
'+u+"
",N.html(g),I.find(".xdsoft_label span").eq(0).text(C.i18n[o].months[A.currentTime.getMonth()]),I.find(".xdsoft_label span").eq(1).text(A.currentTime.getFullYear()+C.yearOffset),M="",l="";var W=0;if(!1!==C.minTime){F=A.strtotime(C.minTime);W=60*F.getHours()+F.getMinutes()}var _=1440;if(!1!==C.maxTime){F=A.strtotime(C.maxTime);_=60*F.getHours()+F.getMinutes()}if(!1!==C.minDateTime){F=A.strToDateTime(C.minDateTime);r.formatDate(A.currentTime,C.formatDate)===r.formatDate(F,C.formatDate)&&(l=60*F.getHours()+F.getMinutes())>W&&(W=l)}if(!1!==C.maxDateTime){var F=A.strToDateTime(C.maxDateTime);r.formatDate(A.currentTime,C.formatDate)===r.formatDate(F,C.formatDate)&&(l=60*F.getHours()+F.getMinutes())<_&&(_=l)}if(m=function(t,n){var o,i=A.now(),s=C.allowTimes&&e.isArray(C.allowTimes)&&C.allowTimes.length;i.setHours(t),t=parseInt(i.getHours(),10),i.setMinutes(n),n=parseInt(i.getMinutes(),10),T=[];var u=60*t+n;(a.is("[disabled]")||u>=_||u59||o.getMinutes()===parseInt(n,10))&&(C.defaultSelect||j.data("changed")?T.push("xdsoft_current"):C.initTime&&T.push("xdsoft_init_time")),parseInt(v.getHours(),10)===parseInt(t,10)&&parseInt(v.getMinutes(),10)===parseInt(n,10)&&T.push("xdsoft_today"),M+='
'+r.formatDate(i,C.formatTime)+"
"},C.allowTimes&&e.isArray(C.allowTimes)&&C.allowTimes.length)for(D=0;D=_||m((D<10?"0":"")+D,l=(t<10?"0":"")+t))}for(R.html(M),n="",D=parseInt(C.yearStart,10);D<=parseInt(C.yearEnd,10);D+=1)n+='
'+(D+C.yearOffset)+"
";for(G.children().eq(0).html(n),D=parseInt(C.monthStart,10),n="";D<=parseInt(C.monthEnd,10);D+=1)n+='
'+C.i18n[o].months[D]+"
";B.children().eq(0).html(n),e(j).trigger("generate.xdsoft")},10),t.stopPropagation()}).on("afterOpen.xdsoft",function(){if(C.timepicker){var e,t,a,r;R.find(".xdsoft_current").length?e=".xdsoft_current":R.find(".xdsoft_init_time").length&&(e=".xdsoft_init_time"),e?(t=E[0].clientHeight,(a=R[0].offsetHeight)-t<(r=R.find(e).index()*C.timeHeightInTimePicker+1)&&(r=a-t),E.trigger("scroll_element.xdsoft_scroller",[parseInt(r,10)/(a-t)])):E.trigger("scroll_element.xdsoft_scroller",[0])}}),d=0,N.on("touchend click.xdsoft","td",function(t){t.stopPropagation(),d+=1;var r=e(this),n=A.currentTime;if(void 0!==n&&null!==n||(A.currentTime=A.now(),n=A.currentTime),r.hasClass("xdsoft_disabled"))return!1;n.setDate(1),n.setFullYear(r.data("year")),n.setMonth(r.data("month")),n.setDate(r.data("date")),j.trigger("select.xdsoft",[n]),a.val(A.str()),C.onSelectDate&&e.isFunction(C.onSelectDate)&&C.onSelectDate.call(j,A.currentTime,j.data("input"),t),j.data("changed",!0),j.trigger("xchange.xdsoft"),j.trigger("changedatetime.xdsoft"),(d>1||!0===C.closeOnDateSelect||!1===C.closeOnDateSelect&&!C.timepicker)&&!C.inline&&j.trigger("close.xdsoft"),setTimeout(function(){d=0},200)}),R.on("touchstart","div",function(e){this.touchMoved=!1}).on("touchmove","div",X).on("touchend click.xdsoft","div",function(t){if(!this.touchMoved){t.stopPropagation();var a=e(this),r=A.currentTime;if(void 0!==r&&null!==r||(A.currentTime=A.now(),r=A.currentTime),a.hasClass("xdsoft_disabled"))return!1;r.setHours(a.data("hour")),r.setMinutes(a.data("minute")),j.trigger("select.xdsoft",[r]),j.data("input").val(A.str()),C.onSelectTime&&e.isFunction(C.onSelectTime)&&C.onSelectTime.call(j,A.currentTime,j.data("input"),t),j.data("changed",!0),j.trigger("xchange.xdsoft"),j.trigger("changedatetime.xdsoft"),!0!==C.inline&&!0===C.closeOnTimeSelect&&j.trigger("close.xdsoft")}}),z.on("mousewheel.xdsoft",function(e){return!C.scrollMonth||(e.deltaY<0?A.nextMonth():A.prevMonth(),!1)}),a.on("mousewheel.xdsoft",function(e){return!C.scrollInput||(!C.datepicker&&C.timepicker?((P=R.find(".xdsoft_current").length?R.find(".xdsoft_current").eq(0).index():0)+e.deltaY>=0&&P+e.deltaYc+m?(l="bottom",r=c+m-t.top):r-=m):r+j[0].offsetHeight>c+m&&(r=t.top-j[0].offsetHeight+1),r<0&&(r=0),n+a.offsetWidth>d&&(n=d-a.offsetWidth)),i=j[0],H(i,function(e){if("relative"===C.contentWindow.getComputedStyle(e).getPropertyValue("position")&&d>=e.offsetWidth)return n-=(d-e.offsetWidth)/2,!1}),(f={position:o,left:n,top:"",bottom:""})[l]=r,j.css(f)},j.on("open.xdsoft",function(t){var a=!0;C.onShow&&e.isFunction(C.onShow)&&(a=C.onShow.call(j,A.currentTime,j.data("input"),t)),!1!==a&&(j.show(),Y(),e(C.contentWindow).off("resize.xdsoft",Y).on("resize.xdsoft",Y),C.closeOnWithoutClick&&e([C.ownerDocument.body,C.contentWindow]).on("touchstart mousedown.xdsoft",function t(){j.trigger("close.xdsoft"),e([C.ownerDocument.body,C.contentWindow]).off("touchstart mousedown.xdsoft",t)}))}).on("close.xdsoft",function(t){var a=!0;I.find(".xdsoft_month,.xdsoft_year").find(".xdsoft_select").hide(),C.onClose&&e.isFunction(C.onClose)&&(a=C.onClose.call(j,A.currentTime,j.data("input"),t)),!1===a||C.opened||C.inline||j.hide(),t.stopPropagation()}).on("toggle.xdsoft",function(){j.is(":visible")?j.trigger("close.xdsoft"):j.trigger("open.xdsoft")}).data("input",a),q=0,j.data("xdsoft_datetime",A),j.setOptions(C),A.setCurrentTime(i()),a.data("xdsoft_datetimepicker",j).on("open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart",function(){a.is(":disabled")||a.data("xdsoft_datetimepicker").is(":visible")&&C.closeOnInputClick||C.openOnFocus&&(clearTimeout(q),q=setTimeout(function(){a.is(":disabled")||(U=!0,A.setCurrentTime(i(),!0),C.mask&&s(C),j.trigger("open.xdsoft"))},100))}).on("keydown.xdsoft",function(t){var a,r=t.which;return-1!==[p].indexOf(r)&&C.enterLikeTab?(a=e("input:visible,textarea:visible,button:visible,a:visible"),j.trigger("close.xdsoft"),a.eq(a.index(this)+1).focus(),!1):-1!==[T].indexOf(r)?(j.trigger("close.xdsoft"),!0):void 0}).on("blur.xdsoft",function(){j.trigger("close.xdsoft")})},u=function(t){var a=t.data("xdsoft_datetimepicker");a&&(a.data("xdsoft_datetime",null),a.remove(),t.data("xdsoft_datetimepicker",null).off(".xdsoft"),e(C.contentWindow).off("resize.xdsoft"),e([C.contentWindow,C.ownerDocument.body]).off("mousedown.xdsoft touchstart"),t.unmousewheel&&t.unmousewheel())},e(C.ownerDocument).off("keydown.xdsoftctrl keyup.xdsoftctrl").on("keydown.xdsoftctrl",function(e){e.keyCode===h&&(F=!0)}).on("keyup.xdsoftctrl",function(e){e.keyCode===h&&(F=!1)}),this.each(function(){var t=e(this).data("xdsoft_datetimepicker");if(t){if("string"===e.type(n))switch(n){case"show":e(this).select().focus(),t.trigger("open.xdsoft");break;case"hide":t.trigger("close.xdsoft");break;case"toggle":t.trigger("toggle.xdsoft");break;case"destroy":u(e(this));break;case"reset":this.value=this.defaultValue,this.value&&t.data("xdsoft_datetime").isValidDate(r.parseDate(this.value,C.format))||t.data("changed",!1),t.data("xdsoft_datetime").setCurrentTime(this.value);break;case"validate":t.data("input").trigger("blur.xdsoft");break;default:t[n]&&e.isFunction(t[n])&&(d=t[n](i))}else t.setOptions(n);return 0}"string"!==e.type(n)&&(!C.lazyInit||C.open||C.inline?s(e(this)):Y(e(this)))}),d},e.fn.datetimepicker.defaults=a};!function(e){"function"==typeof define&&define.amd?define(["jquery","jquery-mousewheel"],e):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(datetimepickerFactory),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var i=t||window.event,s=u.call(arguments,1),d=0,f=0,c=0,m=0,h=0,g=0;if(t=e.event.fix(i),t.type="mousewheel","detail"in i&&(c=-1*i.detail),"wheelDelta"in i&&(c=i.wheelDelta),"wheelDeltaY"in i&&(c=i.wheelDeltaY),"wheelDeltaX"in i&&(f=-1*i.wheelDeltaX),"axis"in i&&i.axis===i.HORIZONTAL_AXIS&&(f=-1*c,c=0),d=0===c?f:c,"deltaY"in i&&(d=c=-1*i.deltaY),"deltaX"in i&&(f=i.deltaX,0===c&&(d=-1*f)),0!==c||0!==f){if(1===i.deltaMode){var p=e.data(this,"mousewheel-line-height");d*=p,c*=p,f*=p}else if(2===i.deltaMode){var D=e.data(this,"mousewheel-page-height");d*=D,c*=D,f*=D}if(m=Math.max(Math.abs(c),Math.abs(f)),(!o||m=1?"floor":"ceil"](d/o),f=Math[f>=1?"floor":"ceil"](f/o),c=Math[c>=1?"floor":"ceil"](c/o),l.settings.normalizeOffset&&this.getBoundingClientRect){var v=this.getBoundingClientRect();h=t.clientX-v.left,g=t.clientY-v.top}return t.deltaX=f,t.deltaY=c,t.deltaFactor=o,t.offsetX=h,t.offsetY=g,t.deltaMode=0,s.unshift(t,d,f,c),n&&clearTimeout(n),n=setTimeout(a,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function a(){o=null}function r(e,t){return l.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}var n,o,i=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],u=Array.prototype.slice;if(e.event.fixHooks)for(var d=i.length;d;)e.event.fixHooks[i[--d]]=e.event.mouseHooks;var l=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var a=s.length;a;)this.addEventListener(s[--a],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",l.getLineHeight(this)),e.data(this,"mousewheel-page-height",l.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var a=s.length;a;)this.removeEventListener(s[--a],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var a=e(t),r=a["offsetParent"in e.fn?"offsetParent":"parent"]();return r.length||(r=e("body")),parseInt(r.css("fontSize"),10)||parseInt(a.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}); \ No newline at end of file diff --git a/resources/datetime-picker/datetimepicker.min.css b/resources/datetime-picker/datetimepicker.min.css new file mode 100644 index 0000000..14a08a1 --- /dev/null +++ b/resources/datetime-picker/datetimepicker.min.css @@ -0,0 +1 @@ +.xdsoft_datetimepicker{box-shadow:0 5px 15px -5px rgba(0,0,0,0.506);background:#fff;border-bottom:1px solid #bbb;border-left:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:8px;padding-left:0;padding-top:2px;position:absolute;z-index:9999;-moz-box-sizing:border-box;box-sizing:border-box;display:none}.xdsoft_datetimepicker.xdsoft_rtl{padding:8px 0 8px 8px}.xdsoft_datetimepicker iframe{position:absolute;left:0;top:0;width:75px;height:210px;background:transparent;border:0}.xdsoft_datetimepicker button{border:none !important}.xdsoft_noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.xdsoft_noselect::selection{background:transparent}.xdsoft_noselect::-moz-selection{background:transparent}.xdsoft_datetimepicker.xdsoft_inline{display:inline-block;position:static;box-shadow:none}.xdsoft_datetimepicker *{-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin:0}.xdsoft_datetimepicker .xdsoft_datepicker,.xdsoft_datetimepicker .xdsoft_timepicker{display:none}.xdsoft_datetimepicker .xdsoft_datepicker.active,.xdsoft_datetimepicker .xdsoft_timepicker.active{display:block}.xdsoft_datetimepicker .xdsoft_datepicker{width:224px;float:left;margin-left:8px}.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_datepicker{float:right;margin-right:8px;margin-left:0}.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_datepicker{width:256px}.xdsoft_datetimepicker .xdsoft_timepicker{width:58px;float:left;text-align:center;margin-left:8px;margin-top:0}.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker{float:right;margin-right:8px;margin-left:0}.xdsoft_datetimepicker .xdsoft_datepicker.active+.xdsoft_timepicker{margin-top:8px;margin-bottom:3px}.xdsoft_datetimepicker .xdsoft_monthpicker{position:relative;text-align:center}.xdsoft_datetimepicker .xdsoft_label i,.xdsoft_datetimepicker .xdsoft_prev,.xdsoft_datetimepicker .xdsoft_next,.xdsoft_datetimepicker .xdsoft_today_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NBRjI1NjM0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NBRjI1NjQ0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0FGMjU2MTQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0FGMjU2MjQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNEP54AAAIOSURBVHja7Jq9TsMwEMcxrZD4WpBYeKUCe+kTMCACHZh4BFfHO/AAIHZGFhYkBBsSEqxsLCAgXKhbXYOTxh9pfJVP+qutnZ5s/5Lz2Y5I03QhWji2GIcgAokWgfCxNvcOCCGKqiSqhUp0laHOne05vdEyGMfkdxJDVjgwDlEQgYQBgx+ULJaWSXXS6r/ER5FBVR8VfGftTKcITNs+a1XpcFoExREIDF14AVIFxgQUS+h520cdud6wNkC0UBw6BCO/HoCYwBhD8QCkQ/x1mwDyD4plh4D6DDV0TAGyo4HcawLIBBSLDkHeH0Mg2yVP3l4TQMZQDDsEOl/MgHQqhMNuE0D+oBh0CIr8MAKyazBH9WyBuKxDWgbXfjNf32TZ1KWm/Ap1oSk/R53UtQ5xTh3LUlMmT8gt6g51Q9p+SobxgJQ/qmsfZhWywGFSl0yBjCLJCMgXail3b7+rumdVJ2YRss4cN+r6qAHDkPWjPjdJCF4n9RmAD/V9A/Wp4NQassDjwlB6XBiCxcJQWmZZb8THFilfy/lfrTvLghq2TqTHrRMTKNJ0sIhdo15RT+RpyWwFdY96UZ/LdQKBGjcXpcc1AlSFEfLmouD+1knuxBDUVrvOBmoOC/rEcN7OQxKVeJTCiAdUzUJhA2Oez9QTkp72OTVcxDcXY8iKNkxGAJXmJCOQwOa6dhyXsOa6XwEGAKdeb5ET3rQdAAAAAElFTkSuQmCC)}.xdsoft_datetimepicker .xdsoft_label i{opacity:.5;background-position:-92px -19px;display:inline-block;width:9px;height:20px;vertical-align:middle}.xdsoft_datetimepicker .xdsoft_prev{float:left;background-position:-20px 0}.xdsoft_datetimepicker .xdsoft_today_button{float:left;background-position:-70px 0;margin-left:5px}.xdsoft_datetimepicker .xdsoft_next{float:right;background-position:0 0}.xdsoft_datetimepicker .xdsoft_next,.xdsoft_datetimepicker .xdsoft_prev,.xdsoft_datetimepicker .xdsoft_today_button{background-color:transparent;background-repeat:no-repeat;border:0 none;cursor:pointer;display:block;height:30px;opacity:.5;-ms-filter:"alpha(opacity=50)";outline:medium none;overflow:hidden;padding:0;position:relative;text-indent:100%;white-space:nowrap;width:20px;min-width:0}.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev,.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next{float:none;background-position:-40px -15px;height:15px;width:30px;display:block;margin-left:14px;margin-top:7px}.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_prev,.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_next{float:none;margin-left:0;margin-right:14px}.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev{background-position:-40px 0;margin-bottom:7px;margin-top:0}.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box{height:151px;overflow:hidden;border-bottom:1px solid #ddd}.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div{background:#f5f5f5;border-top:1px solid #ddd;color:#666;font-size:12px;text-align:center;border-collapse:collapse;cursor:pointer;border-bottom-width:0;height:25px;line-height:25px}.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div:first-child{border-top-width:0}.xdsoft_datetimepicker .xdsoft_today_button:hover,.xdsoft_datetimepicker .xdsoft_next:hover,.xdsoft_datetimepicker .xdsoft_prev:hover{opacity:1;-ms-filter:"alpha(opacity=100)"}.xdsoft_datetimepicker .xdsoft_label{display:inline;position:relative;z-index:9999;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:bold;background-color:#fff;float:left;width:182px;text-align:center;cursor:pointer}.xdsoft_datetimepicker .xdsoft_label:hover>span{text-decoration:underline}.xdsoft_datetimepicker .xdsoft_label:hover i{opacity:1.0}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select{border:1px solid #ccc;position:absolute;right:0;top:30px;z-index:101;display:none;background:#fff;max-height:160px;overflow-y:hidden}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select.xdsoft_monthselect{right:-7px}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select.xdsoft_yearselect{right:2px}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select>div>.xdsoft_option:hover{color:#fff;background:#ff8000}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select>div>.xdsoft_option{padding:2px 10px 2px 5px;text-decoration:none !important}.xdsoft_datetimepicker .xdsoft_label>.xdsoft_select>div>.xdsoft_option.xdsoft_current{background:#3af;box-shadow:#178fe5 0 1px 3px 0 inset;color:#fff;font-weight:700}.xdsoft_datetimepicker .xdsoft_month{width:100px;text-align:right}.xdsoft_datetimepicker .xdsoft_calendar{clear:both}.xdsoft_datetimepicker .xdsoft_year{width:48px;margin-left:5px}.xdsoft_datetimepicker .xdsoft_calendar table{border-collapse:collapse;width:100%}.xdsoft_datetimepicker .xdsoft_calendar td>div{padding-right:5px}.xdsoft_datetimepicker .xdsoft_calendar th{height:25px}.xdsoft_datetimepicker .xdsoft_calendar td,.xdsoft_datetimepicker .xdsoft_calendar th{width:14.2857142%;background:#f5f5f5;border:1px solid #ddd;color:#666;font-size:12px;text-align:right;vertical-align:middle;padding:0;border-collapse:collapse;cursor:pointer;height:25px}.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar th{width:12.5%}.xdsoft_datetimepicker .xdsoft_calendar th{background:#f1f1f1}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today{color:#3af}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default{background:#ffe9d2;box-shadow:#ffb871 0 1px 4px 0 inset;color:#000}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint{background:#c1ffc9;box-shadow:#00dd1c 0 1px 4px 0 inset;color:#000}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default,.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current,.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current{background:#3af;box-shadow:#178fe5 0 1px 3px 0 inset;color:#fff;font-weight:700}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month,.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled,.xdsoft_datetimepicker .xdsoft_time_box>div>div.xdsoft_disabled{opacity:.5;-ms-filter:"alpha(opacity=50)";cursor:default}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled{opacity:.2;-ms-filter:"alpha(opacity=20)"}.xdsoft_datetimepicker .xdsoft_calendar td:hover,.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div:hover{color:#fff !important;background:#ff8000 !important;box-shadow:none !important}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover,.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current.xdsoft_disabled:hover{background:#3af !important;box-shadow:#178fe5 0 1px 3px 0 inset !important;color:#fff !important}.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover,.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_disabled:hover{color:inherit !important;background:inherit !important;box-shadow:inherit !important}.xdsoft_datetimepicker .xdsoft_calendar th{font-weight:700;text-align:center;color:#999;cursor:default}.xdsoft_datetimepicker .xdsoft_copyright{color:#ccc !important;font-size:10px;clear:both;float:none;margin-left:8px}.xdsoft_datetimepicker .xdsoft_copyright a{color:#eee !important}.xdsoft_datetimepicker .xdsoft_copyright a:hover{color:#aaa !important}.xdsoft_time_box{position:relative;border:1px solid #ccc}.xdsoft_scrollbar>.xdsoft_scroller{background:#ccc !important;height:20px;border-radius:3px}.xdsoft_scrollbar{position:absolute;width:7px;right:0;top:0;bottom:0;cursor:pointer}.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_scrollbar{left:0;right:auto}.xdsoft_scroller_box{position:relative}.xdsoft_datetimepicker.xdsoft_dark{box-shadow:0 5px 15px -5px rgba(255,255,255,0.506);background:#000;border-bottom:1px solid #444;border-left:1px solid #333;border-right:1px solid #333;border-top:1px solid #333;color:#ccc}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box{border-bottom:1px solid #222}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box>div>div{background:#0a0a0a;border-top:1px solid #222;color:#999}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label{background-color:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label>.xdsoft_select{border:1px solid #333;background:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label>.xdsoft_select>div>.xdsoft_option:hover{color:#000;background:#007fff}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label>.xdsoft_select>div>.xdsoft_option.xdsoft_current{background:#c50;box-shadow:#b03e00 0 1px 3px 0 inset;color:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_next,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==)}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th{background:#0a0a0a;border:1px solid #222;color:#999}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th{background:#0e0e0e}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today{color:#c50}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default{background:#ffe9d2;box-shadow:#ffb871 0 1px 4px 0 inset;color:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint{background:#c1ffc9;box-shadow:#00dd1c 0 1px 4px 0 inset;color:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current{background:#c50;box-shadow:#b03e00 0 1px 3px 0 inset;color:#000}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover,.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box>div>div:hover{color:#000 !important;background:#007fff !important}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th{color:#666}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright{color:#333 !important}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a{color:#111 !important}.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover{color:#555 !important}.xdsoft_dark .xdsoft_time_box{border:1px solid #333}.xdsoft_dark .xdsoft_scrollbar>.xdsoft_scroller{background:#333 !important}.xdsoft_datetimepicker .xdsoft_save_selected{display:block;border:1px solid #ddd !important;margin-top:5px;width:100%;color:#454551;font-size:13px}.xdsoft_datetimepicker .blue-gradient-button{font-family:"museo-sans","Book Antiqua",sans-serif;font-size:12px;font-weight:300;color:#82878c;height:28px;position:relative;padding:4px 17px 4px 33px;border:1px solid #d7d8da;background:-moz-linear-gradient(top,#fff 0,#f4f8fa 73%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(73%,#f4f8fa));background:-webkit-linear-gradient(top,#fff 0,#f4f8fa 73%);background:-o-linear-gradient(top,#fff 0,#f4f8fa 73%);background:-ms-linear-gradient(top,#fff 0,#f4f8fa 73%);background:linear-gradient(to bottom,#fff 0,#f4f8fa 73%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff',endColorstr='#f4f8fa',GradientType=0)}.xdsoft_datetimepicker .blue-gradient-button:hover,.xdsoft_datetimepicker .blue-gradient-button:focus,.xdsoft_datetimepicker .blue-gradient-button:hover span,.xdsoft_datetimepicker .blue-gradient-button:focus span{color:#454551;background:-moz-linear-gradient(top,#f4f8fa 0,#FFF 73%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#f4f8fa),color-stop(73%,#FFF));background:-webkit-linear-gradient(top,#f4f8fa 0,#FFF 73%);background:-o-linear-gradient(top,#f4f8fa 0,#FFF 73%);background:-ms-linear-gradient(top,#f4f8fa 0,#FFF 73%);background:linear-gradient(to bottom,#f4f8fa 0,#FFF 73%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f8fa',endColorstr='#FFF',GradientType=0)} \ No newline at end of file diff --git a/resources/loading.gif b/resources/loading.gif index 7e46f92..9e71f71 100644 Binary files a/resources/loading.gif and b/resources/loading.gif differ diff --git a/resources/submission.scss b/resources/submission.scss index 8519dc2..ba07515 100644 --- a/resources/submission.scss +++ b/resources/submission.scss @@ -1,3 +1,4 @@ +@import "vars"; .info-float { position: sticky; top: 60px; @@ -20,6 +21,11 @@ &:first-of-type { border-top: #ccc 1px solid; + border-top-left-radius: $widget_border_radius; + border-top-right-radius: $widget_border_radius; + .sub-result { + border-top-left-radius: $widget_border_radius; + } } > div { diff --git a/resources/ticket.scss b/resources/ticket.scss index d7f9143..092c1a1 100644 --- a/resources/ticket.scss +++ b/resources/ticket.scss @@ -150,14 +150,6 @@ padding: 7px; } - .message .content :first-child { - margin-top: 0; - } - - .message .content :last-child { - margin-bottom: 0; - } - .new-message .detail { padding: 8px 10px; } @@ -174,4 +166,10 @@ padding-left: 0.5em; padding-top: 1.65em; } +} + +@media (max-width: 799px) { + .ticket-container { + flex-direction: column-reverse; + } } \ No newline at end of file diff --git a/resources/vars.scss b/resources/vars.scss index 4bcda31..7556626 100644 --- a/resources/vars.scss +++ b/resources/vars.scss @@ -10,3 +10,5 @@ $widget_border_radius: 4px; $table_header_rounding: 6px; $monospace-fonts: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + +$navbar_height: 48px; diff --git a/resources/widgets.scss b/resources/widgets.scss index e7a423e..ffc0e4e 100644 --- a/resources/widgets.scss +++ b/resources/widgets.scss @@ -277,6 +277,15 @@ input { overflow-x: auto; overflow-y: hidden; + &::-webkit-scrollbar { + width: 0.1rem; // Adjust the width as needed + background-color: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: transparent; + } + > li { position: relative; display: block; @@ -614,6 +623,14 @@ ul.select2-selection__rendered { background: gray; } +ul.errorlist { + margin: 0px; + text-align: right; + list-style: none; + padding: 0px; + color: red; +} + .registration-form { .sortedm2m-container, .sortedm2m-container p.selector-filter { width: 300px; @@ -690,12 +707,6 @@ ul.select2-selection__rendered { width: 450px; } - ul.errorlist { - margin: 0px; - text-align: right; - list-style: none; - } - .full-textfield { padding-top: 0.5em; } diff --git a/templates/base.html b/templates/base.html index 1a014af..ae5f91b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -193,6 +193,15 @@ } + {% if request.profile.css_background %} + + {% endif %} @@ -202,7 +211,7 @@ +
{% if request.in_contest %}
diff --git a/templates/blog/dashboard.html b/templates/blog/dashboard.html index b34d406..36a2fa5 100644 --- a/templates/blog/dashboard.html +++ b/templates/blog/dashboard.html @@ -3,7 +3,7 @@