diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..c8cd82ee480cdb1a1fcaad83f60767e8948ba10e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,40 @@ +module.exports = { + extends: [ + "eslint:recommended", + "plugin:vue/strongly-recommended", + "prettier", + "plugin:@intlify/vue-i18n/recommended", + ], + rules: { + "no-unused-vars": "warn", + "vue/no-unused-vars": "off", + "vue/multi-word-component-names": "off", + "@intlify/vue-i18n/key-format-style": [ + "error", + "snake_case", + { + splitByDots: false, + }, + ], + // "@intlify/vue-i18n/no-unused-keys": ["warn", {}], + "@intlify/vue-i18n/no-raw-text": [ + "error", + { + ignoreNodes: ["v-icon"], + ignorePattern: "^[-–—·#:()\\[\\]&\\.\\s]+$", + }, + ], + }, + settings: { + "vue-i18n": { + localeDir: "./aleksis/core/frontend/messages/*.{json}", + messageSyntaxVersion: "^8.0.0", + }, + }, + env: { + es2021: true, + }, + parserOptions: { + ecmaVersion: "latest", + }, +}; diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index ccc75937408fdbeb5e724bb618e223bb390182a4..0000000000000000000000000000000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -<!-- AlekSIS is developed on EduGit. GitHub only serves as - backup mirror and to help people find the project. If - possible, please submit your merge request on EduGit! - - EduGit accepts logins with GitHub accounts. ---> - -[ ] I have read the above and have no way to contribute on EduGit -[ ] I understand that GitHub's terms of service exclude young and - learning contributors, but still cannot contribute on EduGit - instead. diff --git a/.gitignore b/.gitignore index 0faf3e4c3ecc7ff5de08a7c56ee313c488b183f6..9f60735a5e85703360c8669a34fa01622a079afd 100644 --- a/.gitignore +++ b/.gitignore @@ -62,9 +62,9 @@ docs/_build/ *.aux # Generated files -aleksis/node_modules/ -aleksis/static/ -aleksis/whoosh_index/ +/node_modules/ +/static/ +/whoosh_index/ poetry.lock .coverage @@ -74,8 +74,13 @@ htmlcov/ maintenance_mode_state.txt media/ package-lock.json +yarn.lock # VSCode .vscode/ .history/ *.code-workspace + +/cache +/node_modules +.vite diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 564449be1717a97282b53b2d94f9f234b34261c2..cf02f39e36aa6fa715f8e3c73c8069433c44f497 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,21 +1,21 @@ include: - - project: "AlekSIS/official/AlekSIS" - file: /ci/general.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/prepare/lock.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/test/test.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/test/lint.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/test/security.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/build/dist.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/publish/pypi.yml - - project: "AlekSIS/official/AlekSIS" - file: /ci/docker/image.yml - - project: "AlekSIS/official/AlekSIS" - file: "/ci/deploy/review.yml" - - project: "AlekSIS/official/AlekSIS" - file: "/ci/deploy/trigger_dist.yml" + - project: "AlekSIS/official/AlekSIS" + file: /ci/general.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/prepare/lock.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/test/test.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/test/lint.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/test/security.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/build/dist.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/publish/pypi.yml + - project: "AlekSIS/official/AlekSIS" + file: /ci/docker/image.yml + - project: "AlekSIS/official/AlekSIS" + file: "/ci/deploy/review.yml" + - project: "AlekSIS/official/AlekSIS" + file: "/ci/deploy/trigger_dist.yml" diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000000000000000000000000000000000..38d141b743fd55678f50077c0617924475817095 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,91 @@ +# Byte-compiled / optimized / DLL files +*$py.class +*.py[cod] +__pycache__/ + +# Distribution / packaging +*.egg +*.egg-info/ +.Python +.eggs/ +.installed.cfg +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ + +# Installer logs +pip-delete-this-directory.txt +pip-log.txt + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# pyenv +.python-version + +# Environments +.env +.venv +ENV/ +env/ +venv/ + +# Editors +*~ +DEADJOE +\#*# + +# IntelliJ +.idea +.idea/ + +# Database +db.sqlite3 + +# Sphinx +docs/_build/ + +# TeX +*.aux + +# Generated files +/node_modules/ +/static/ +/whoosh_index/ +poetry.lock + +.coverage +.mypy_cache/ +.tox/ +htmlcov/ +maintenance_mode_state.txt +media/ +package-lock.json +yarn.lock + +# VSCode +.vscode/ +.history/ +*.code-workspace + +/cache + +# Add HTML files to avoid problems with unsupported Django templates +*.html + +# Do not check/reformat generated files +aleksis/core/util/licenses.json +.vite/ diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..2e8ff5864a48be6a22bd1742c2317556a8ec9419 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["stylelint-config-standard", "stylelint-config-prettier"] +} diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d8f63837d8cf7b0c60adf26d13b6ae8603a8a771..6e02cdf9f869f9f313eaa229dcb54aa44d9191e0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,11 +9,252 @@ and this project adheres to `Semantic Versioning`_. Unreleased ---------- +Deprecated +~~~~~~~~~~ + +* The `webpack_bundle` management command is replaced by the new `vite` + command. The `webpack_bundle` command will be removed in AlekSIS-Core 4.0. + +Added +~~~~~ + +* Notification drawer in top nav bar +* GraphQL queries and mutations for core data management +* [Dev] Introduce new mechanism to register classes over all apps. + Changed ~~~~~~~ +* Rewrite of frontend using Vuetify + * The runuwsgi dev server now starts a Vite dev server with HMR in the + background +* OIDC scope "profile" now exposes the avatar instead of the official photo +* Based on Django 4.0 + * Use built-in Redis cache backend + * Introduce PBKDF2-SHA1 password hashing +* Persistent database connections are now health-checked as to not fail + requests +* Incorporate SPDX license list for app licenses on About page +* [Dev] The undocumented field `check` on `DataCheckResult` was renamed to `data_check` +* Frontend bundling migrated from Webpack to Vite +* Get dashboard widgets and data checks from apps with new registration mechanism. * Use write-through cache for sessions to retain on clear_cache +Fixed +~~~~~ + +* The system tried to send notifications for done background tasks + in addition to tasks started in the foreground. +* Invitations for existing short name did not work. +* Invitations for persons without pre-defined e-mail address did not behave correctly +* OIDC scope "phone" had no claims. + +Removed +~~~~~~~ + +* Support for materialize-based frontend views (deprecated in 2.11) +* Legacy support for person iCal feed URLs. +* Django debug toolbar + * It caused major performance issues and is not useful with the new + frontend anymore + +`2.12.1`_ - 2022-11-06 +---------------------- + +Fixed +~~~~~ + +* An invalid backport caused OIDC clients without PKCD to fail. + +`2.12`_ - 2022-11-04 +-------------------- + +Added +~~~~~ + +* Show also group ownerships on person detail page +* [Dev] Provide plain PDF template without header/footer for special layouts. +* [Dev] Introduce support for reformattinga and linting JS, Vue, and CSS files. + +Changed +~~~~~~~ + +* OIDC scope "profile" now exposes the avatar instead of the official photo +* Language selection on Vue pages now runs via GraphQL queries. +* [Dev] Provide function to generate PDF files from fully-rendered templates. +* [Dev] Accept pre-created file object for PDF generation to define + the redirect URL in advance. + +Fixed +~~~~~ + +* The logo in the PDF files was displayed at the wrong position. +* Sometimes the PDF files were not generated correctly + and images were displayed only partially. +* Error message in permission form was misleading. +* Personal invites did not work +* Invite Person view threw an error when personal invites existed +* Detailed information for done Celery tasks weren't saved. + +`2.11`_ - 2022-08-27 +-------------------- + +This release sunsets the 2.x series of the AleKSIS core. + +Deprecated +~~~~~~~~~~ + +* All frontends using Django views and Django templates are deprecated and support + for them will be removed in AlekSIS-Core 3.0. All frontend code must be written in + Vue.js and be properly separated from the backend. In the same spirit, all backend + features must expose GraphQL APIs for the frontend to use. + +Added +~~~~~ + +The following features are introduced here mainly to simplify gradual +updates. GraphQL and the Vuetify/Vue.js frontend mechanisms are preview +functionality and app developers should not rely on them before AlekSIS-Core +3.0. + +* Introduce GraphQL API and Vue.js frontend implementation +* Introduce webpack bundling for frontend code + +`2.10.2`_ - 2022-08-25 +---------------------- + +Fixed +~~~~~ + +* Celery's logging did not honour Django's logging level +* Automatically clean up expired OAuth tokens after 24 hourse + +`2.10.1`_ - 2022-07-24 +---------------------- + +Changed +~~~~~~~ + +* Make External Link Widget icons clickable + +Fixed +~~~~~ + +* The progress page for background tasks didn't show all status messages. + +`2.10`_ - 2022-06-25 +-------------------- + +Added +~~~~~ + +* Add Ukrainian locale (contributed by Sergiy Gorichenko from Fre(i)e Software GmbH). +* Add third gender to gender choices +* Add DataCheck to validate specific fields of specific models + +Changed +~~~~~~~ + +* Restructure group page and show more information about members. +* django-two-factor-auth >= 1.14.0 is now required due to a + backwards-incompatible breakage in that library + +Fixed +~~~~~~~ + +* Password change view did not redirect to login when accessed unauthenticated. +* Sorting icons were inlined into stylesheet +* iOS devices used the favicon instead of the PWA icon when the PWA was added to the home screen. + +Changed +~~~~~~~ + +* Update icon choices for models to new icon set + +`2.9`_ - 2022-05-25 +------------------- + +Added +~~~~~ + +* Allow to disable exception mails to admins +* Add possibility to create iCal feeds in all apps and dynamically create user-specific urls. + +Fixed +~~~~~ + +* The menu button used to be displayed twice on smaller screens. +* The icons were loaded from external servers instead from local server. +* Weekdays were not translated if system locales were missing + + * Added locales-all to base image and note to docs + +* The icons in the account menu were still the old ones. +* Due to a merge error, the once removed account menu in the sidenav appeared again. +* Scheduled notifications were shown on dashboard before time. +* Remove broken notifications menu item in favor of item next to account menu. +* [OAuth2] Resources which are protected with client credentials + allowed access if no scopes were allowed (CVE-2022-29773). +* The site logo could overlap with the menu for logos with an unexpected aspect ratio. +* Some OAuth2 views stopped working with long scope names. +* Resetting password was impossible due to a missing rule +* Language selection was broken when only one language was enabled in + preferences. + +Removed +~~~~~~~ + +* Remove option to limit available languages in preferences. + +Changed +~~~~~~~ + +* [Dev] ActionForm now checks permissions on objects before executing +* [Dev] ActionForm now returns a proper return value from the executed action +* Pin version of javascript dependencies + +`2.8.1`_ - 2022-03-13 +-------------------- + +Changed +~~~~~~~ + +* Official apps can now override any setting + +`2.8`_ - 2022-03-11 +------------------- + +Added +~~~~~ + +* Add iconify icons +* Use identicons where avatars are missing. +* Display personal photos instead of avatars based on a site preference. +* Add an account menu in the top navbar. +* Create a reusable snippet for avatar content. +* Allow to configure if additional field is required +* Allow to configure description of additional fields +* Allow configuring regex for allowed usernames +* [Dev] Support scheduled notifications. +* Implement StaticContentWidget +* Allow to enable password change independently of password reset + +Changed +~~~~~~~ + +* Added a `Retry` button to the server error page + +Fixed +~~~~~ + +* The user handbook was lacking images and instructions on PWA usage with the Safari browser. +* The ``reset password`` button on the login site used to overflow the card on smaller devices. + +Deprecated +~~~~~~~~~~ + +* Legacy material icon font will be removed in AlekSIS-Core 3.0 + `2.7.4`_ - 2022-02-09 --------------------- @@ -758,3 +999,13 @@ Fixed .. _2.7.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.2 .. _2.7.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.3 .. _2.7.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.4 +.. _2.8: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8 +.. _2.8.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.8.1 +.. _2.9: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.9 +.. _2.10: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10 +.. _2.10.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10.1 +.. _2.10.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.10.2 +.. _2.11: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.11 +.. _2.11.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.11.1 +.. _2.12: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12 +.. _2.12.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.12.1 diff --git a/Dockerfile b/Dockerfile index acb08f98ffe79dccc32f048590bb123c2763302f..44159bb3fd185d4eb11224e48139319c9468b019 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -FROM debian:bullseye-slim AS core +FROM debian:bookworm-slim AS core # Build arguments ARG EXTRAS="ldap,s3,sentry" -ARG APP_VERSION="" +ARG APP_VERSION="==2.10.1.dev0+20220801181456.7ba74939" # Configure Python to be nice inside Docker and pip to stfu ENV PYTHONUNBUFFERED 1 @@ -15,6 +15,7 @@ ENV PIP_USE_DEPRECATED legacy-resolver ENV DEBIAN_FRONTEND noninteractive # Configure app settings for build and runtime +ENV ALEKSIS_caching__dir /var/cache/aleksis ENV ALEKSIS_static__root /usr/share/aleksis/static ENV ALEKSIS_media__root /var/lib/aleksis/media ENV ALEKSIS_backup__location /var/lib/aleksis/backups @@ -29,6 +30,7 @@ RUN apt-get -y update && \ eatmydata apt-get install -y --no-install-recommends \ build-essential \ chromium \ + chromium-driver \ curl \ dumb-init \ gettext \ @@ -36,6 +38,7 @@ RUN apt-get -y update && \ less \ libpq-dev \ libssl-dev \ + locales-all \ postgresql-client-14 \ pspg \ python3-dev \ @@ -57,7 +60,8 @@ RUN case ",$EXTRAS," in \ # Install core RUN set -e; \ - mkdir -p ${ALEKSIS_static__root} \ + mkdir -p ${ALEKSIS_caching__dir} \ + ${ALEKSIS_static__root} \ ${ALEKSIS_media__root} \ ${ALEKSIS_backup__location}; \ eatmydata pip install AlekSIS-Core\[$EXTRAS\]$APP_VERSION @@ -71,9 +75,12 @@ CMD ["/usr/local/bin/aleksis-docker-startup"] # Install assets FROM core as assets -RUN eatmydata aleksis-admin yarn install; \ +RUN eatmydata aleksis-admin vite build; \ eatmydata aleksis-admin collectstatic --no-input; \ rm -rf /usr/local/share/.cache +# FIXME Introduce deletion after we don't need materializecss anymore for SASS +# also in ONBUILD below +# rm -rf /usr/local/share/.cache ${ALEKSIS_caching__dir}/* # Clean up build dependencies FROM assets AS clean @@ -117,7 +124,7 @@ ONBUILD RUN set -e; \ if [ -n "$APPS" ]; then \ eatmydata pip install $APPS; \ fi; \ - eatmydata aleksis-admin yarn install; \ + eatmydata aleksis-admin vite build; \ eatmydata aleksis-admin collectstatic --no-input; \ rm -rf /usr/local/share/.cache; \ eatmydata apt-get remove --purge -y yarnpkg $BUILD_DEPS; \ diff --git a/README.rst b/README.rst index a6732de3b038f5d1d4f5b59d2c05f3c77840c2b9..1a233ce7ae9e1b24e3cb0eaf088c17f41ef29a61 100644 --- a/README.rst +++ b/README.rst @@ -61,16 +61,17 @@ Licence :: - Copyright © 2017, 2018, 2019, 2020, 2021, 2022 Jonathan Weth <dev@jonathanweth.de> + Copyright © 2017, 2018, 2019, 2020, 2021, 2022, 2023 Jonathan Weth <dev@jonathanweth.de> Copyright © 2017, 2018, 2019, 2020 Frank Poetzsch-Heffter <p-h@katharineum.de> - Copyright © 2018, 2019, 2020, 2021, 2022 Hangzhi Yu <yuha@katharineum.de> - Copyright © 2018, 2019, 2020, 2021 Julian Leucker <leuckeju@katharineum.de> - Copyright © 2019, 2020, 2021, 2022 Dominik George <dominik.george@teckids.org> + Copyright © 2018, 2019, 2020, 2021, 2022, 2023 Hangzhi Yu <yuha@katharineum.de> + Copyright © 2018, 2019, 2020, 2021, 2022, 2023 Julian Leucker <leuckeju@katharineum.de> + Copyright © 2019, 2020, 2021, 2022, 2023 Dominik George <dominik.george@teckids.org> Copyright © 2019, 2020, 2021, 2022 Tom Teichler <tom.teichler@teckids.org> Copyright © 2019 mirabilos <thorsten.glaser@teckids.org> + Copyright © 2021, 2022 magicfelix <felix@felix-zauberer.de> Copyright © 2021 Lloyd Meins <meinsll@katharineum.de> - Copyright © 2021 magicfelix <felix@felix-zauberer.de> Copyright © 2022 Benedict Suska <benedict.suska@teckids.org> + Copyright © 2022 Lukas Weichelt <lukas.weichelt@teckids.org> Licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany). diff --git a/aleksis/core/__init__.py b/aleksis/core/__init__.py index 66d1ef788b034aea3d1518bc009e5be0ca05b3f2..df69a63b63a08043dd6de7a3344eee787f3acfd1 100644 --- a/aleksis/core/__init__.py +++ b/aleksis/core/__init__.py @@ -6,5 +6,3 @@ try: __version__ = metadata.distribution("AlekSIS-Core").version except Exception: __version__ = "unknown" - -default_app_config = "aleksis.core.apps.CoreConfig" diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py index 77e4b2a6327d9b88254b160375b1ce85be73ed68..9b0518472c6309d33305188659de22700497aee5 100644 --- a/aleksis/core/apps.py +++ b/aleksis/core/apps.py @@ -36,16 +36,17 @@ class CoreConfig(AppConfig): } licence = "EUPL-1.2+" copyright_info = ( - ([2017, 2018, 2019, 2020, 2021, 2022], "Jonathan Weth", "wethjo@katharineum.de"), + ([2017, 2018, 2019, 2020, 2021, 2022, 2023], "Jonathan Weth", "wethjo@katharineum.de"), ([2017, 2018, 2019, 2020], "Frank Poetzsch-Heffter", "p-h@katharineum.de"), - ([2018, 2019, 2020, 2021, 2022], "Hangzhi Yu", "yuha@katharineum.de"), - ([2018, 2019, 2020, 2021], "Julian Leucker", "leuckeju@katharineum.de"), - ([2019, 2020, 2021, 2022], "Dominik George", "dominik.george@teckids.org"), + ([2018, 2019, 2020, 2021, 2022, 2023], "Hangzhi Yu", "yuha@katharineum.de"), + ([2018, 2019, 2020, 2021, 2022, 2023], "Julian Leucker", "leuckeju@katharineum.de"), + ([2019, 2020, 2021, 2022, 2023], "Dominik George", "dominik.george@teckids.org"), ([2019, 2020, 2021, 2022], "Tom Teichler", "tom.teichler@teckids.org"), ([2019], "mirabilos", "thorsten.glaser@teckids.org"), + ([2021, 2022], "magicfelix", "felix@felix-zauberer.de"), ([2021], "Lloyd Meins", "meinsll@katharineum.de"), - ([2021], "magicfelix", "felix@felix-zauberer.de"), ([2022], "Benedict Suska", "benedict.suska@teckids.org"), + ([2022], "Lukas Weichelt", "lukas.weichelt@teckids.org"), ) def ready(self): @@ -64,8 +65,6 @@ class CoreConfig(AppConfig): preference_models.register(personpreferencemodel, person_preferences_registry) preference_models.register(grouppreferencemodel, group_preferences_registry) - self._load_data_checks() - from .health_checks import ( BackupJobHealthCheck, DataChecksHealthCheckBackend, @@ -78,16 +77,6 @@ class CoreConfig(AppConfig): plugin_dir.register(MediaBackupAgeHealthCheck) plugin_dir.register(BackupJobHealthCheck) - @classmethod - def _load_data_checks(cls): - """Get all data checks from all loaded models.""" - from aleksis.core.data_checks import DataCheckRegistry - - data_checks = set() - for model in apps.get_models(): - data_checks.update(getattr(model, "data_checks", [])) - DataCheckRegistry.data_checks = data_checks - def preference_updated( self, sender: Any, @@ -188,9 +177,9 @@ class CoreConfig(AppConfig): claims["profile"] = django_request.build_absolute_uri( request.user.person.get_absolute_url() ) - if request.user.person.photo: + if request.user.person.avatar: claims["picture"] = django_request.build_absolute_uri( - request.user.person.photo.url + request.user.person.avatar.url ) else: claims["given_name"] = request.user.first_name @@ -211,6 +200,10 @@ class CoreConfig(AppConfig): "postal_code": request.user.person.postal_code, } + if "phone" in scopes and has_person(request.user): + claims["mobile_number"] = request.user.person.mobile_number + claims["phone_number"] = request.user.person.phone_number + if "groups" in scopes and has_person(request.user): claims["groups"] = list( request.user.person.member_of.values_list("name", flat=True).all() diff --git a/aleksis/core/celery.py b/aleksis/core/celery.py index ab78cfb080ad1abc79f92e873641ef36c22432c9..492f7e79c9715a3f5477623cb5a925e4cdc4a850 100644 --- a/aleksis/core/celery.py +++ b/aleksis/core/celery.py @@ -1,10 +1,11 @@ +import logging import os from traceback import format_exception from django.conf import settings from celery import Celery -from celery.signals import task_failure +from celery.signals import setup_logging, task_failure from .util.core_helpers import get_site_preferences from .util.email import send_email @@ -35,3 +36,9 @@ def task_failure_notifier( "traceback": "".join(format_exception(type(exception), exception, traceback)), }, ) + + +@setup_logging.connect +def on_setup_logging(*args, **kwargs): + """Load Django's logging configuration when running inside Celery.""" + logging.config.dictConfig(settings.LOGGING) diff --git a/aleksis/core/data_checks.py b/aleksis/core/data_checks.py index d82c30d5ddf0b5ab11e7b1b5f8c2a595838c07e1..f16ab2e9f0b3b39ea86d9f53112a4619fb960e90 100644 --- a/aleksis/core/data_checks.py +++ b/aleksis/core/data_checks.py @@ -3,13 +3,17 @@ from datetime import timedelta from django.apps import apps from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db.models import Model from django.db.models.aggregates import Count from django.utils.functional import classproperty +from django.utils.text import slugify from django.utils.translation import gettext as _ import reversion from reversion import set_comment +from .mixins import RegistryObject from .util.celery_progress import ProgressRecorder, recorded_task from .util.core_helpers import get_site_preferences from .util.email import send_email @@ -62,7 +66,7 @@ class IgnoreSolveOption(SolveOption): check_result.save() -class DataCheck: +class DataCheck(RegistryObject): """Define a data check. Data checks should be used to search objects of @@ -152,7 +156,6 @@ class DataCheck: the preference ``Send emails if data checks detect problems``. """ # noqa: D412 - name: str = "" verbose_name: str = "" problem_name: str = "" @@ -199,7 +202,7 @@ class DataCheck: ct = ContentType.objects.get_for_model(instance) result, __ = DataCheckResult.objects.get_or_create( - check=cls.name, content_type=ct, object_id=instance.id + data_check=cls.name, content_type=ct, object_id=instance.id ) # Track all existing problems (for deleting old results) @@ -213,7 +216,7 @@ class DataCheck: DataCheckResult = apps.get_model("core", "DataCheckResult") pks = [r.pk for r in cls._current_results] - old_results = DataCheckResult.objects.filter(check=cls.name).exclude(pk__in=pks) + old_results = DataCheckResult.objects.filter(data_check=cls.name).exclude(pk__in=pks) if old_results: logging.info(f"Delete {old_results.count()} old data check results.") @@ -222,25 +225,15 @@ class DataCheck: # Reset list with existing problems cls._current_results = [] - -class DataCheckRegistry: - """Create central registry for all data checks in AlekSIS.""" - - data_checks: set = set() - - @classproperty - def data_checks_by_name(cls): - return {check.name: check for check in cls.data_checks} - @classproperty def data_checks_choices(cls): - return [(check.name, check.verbose_name) for check in cls.data_checks] + return [(check.name, check.verbose_name) for check in cls.registered_objects_list] @recorded_task(run_every=timedelta(minutes=15)) def check_data(recorder: ProgressRecorder): """Execute all registered data checks and send email if activated.""" - for check in recorder.iterate(DataCheckRegistry.data_checks): + for check in recorder.iterate(DataCheck.registered_objects_list): logging.info(f"Run check: {check.verbose_name}") check.run_check_data() @@ -258,12 +251,12 @@ def send_emails_for_data_checks(): results = DataCheckResult.objects.filter(solved=False, sent=False) if results.exists(): - results_by_check = results.values("check").annotate(count=Count("check")) + results_by_check = results.values("data_check").annotate(count=Count("data_check")) results_with_checks = [] for result in results_by_check: results_with_checks.append( - (DataCheckRegistry.data_checks_by_name[result["check"]], result["count"]) + (DataCheck.registered_objects_dict[result["data_check"]], result["count"]) ) recipient_list = [ @@ -316,3 +309,34 @@ class BrokenDashboardWidgetDataCheck(DataCheck): for widget in broken_widgets: logging.info("Check DashboardWidget %s", widget) cls.register_result(widget) + + +def field_validation_data_check_factory(app_name: str, model_name: str, field_name: str) -> type: + from django.apps import apps + + class FieldValidationDataCheck(DataCheck): + name = f"field_validation_{slugify(model_name)}_{slugify(field_name)}" + verbose_name = _( + "Validate field %s of model %s." % (field_name, app_name + "." + model_name) + ) + problem_name = _("The field %s couldn't be validated successfully." % field_name) + solve_options = { + IgnoreSolveOption.name: IgnoreSolveOption, + } + + @classmethod + def check_data(cls): + model: Model = apps.get_model(app_name, model_name) + for obj in model.objects.all(): + try: + model._meta.get_field(field_name).validate(getattr(obj, field_name), obj) + except ValidationError as e: + logging.info(f"Check {model_name} {obj}") + cls.register_result(obj) + + FieldValidationDataCheck.__name__ = model_name + "FieldValidationDataCheck" + + return FieldValidationDataCheck + + +field_validation_data_check_factory("core", "CustomMenuItem", "icon") diff --git a/aleksis/core/decorators.py b/aleksis/core/decorators.py new file mode 100644 index 0000000000000000000000000000000000000000..b12bf1942b04a8ab207e5e4e53f532637641f624 --- /dev/null +++ b/aleksis/core/decorators.py @@ -0,0 +1,20 @@ +from functools import wraps + + +def pwa_cache(view_func): + """Add headers to a response so that the PWA will recognize it as cacheable.""" + + @wraps(view_func) + def _wrapped_view_func(request, *args, **kwargs): + # Ensure argument looks like a request. + if not hasattr(request, "META"): + raise TypeError( + "pwa_cache didn't receive an HttpRequest. If you are " + "decorating a classmethod, be sure to use @method_decorator." + ) + response = view_func(request, *args, **kwargs) + response.headers["PWA-Is-Cacheable"] = "true" + response.headers["Access-Control-Expose-Headers"] = "PWA-Is-Cacheable" + return response + + return _wrapped_view_func diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index ef4184812f73d22bb1dcfa1ff84f74f722c3c774..92c120886e4a530cc566b8489cb09d3e38f5ba2e 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -39,7 +39,7 @@ from .registries import ( site_preferences_registry, ) from .util.auth_helpers import AppScopes -from .util.core_helpers import get_site_preferences +from .util.core_helpers import get_site_preferences, queryset_rules_filter class PersonForm(ExtensibleForm): @@ -496,7 +496,7 @@ class AssignPermissionForm(forms.Form): if not cleaned_data.get("objects") and not cleaned_data.get("all_objects"): raise ValidationError( - _("You must grant the permission to all objects and/" "or to some objects.") + _("You must grant the permission to all objects or to specific objects.") ) return cleaned_data @@ -583,7 +583,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): "short_name", ), Fieldset( - _("Adress data"), + _("Address data"), Row("street", "housenumber"), Row("postal_code", "place"), ), @@ -611,6 +611,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): request = kwargs.pop("request", None) super(AccountRegisterForm, self).__init__(*args, **kwargs) + person = None if request.session.get("account_verified_email"): email = request.session["account_verified_email"] @@ -619,16 +620,27 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): except (Person.DoesNotExist, Person.MultipleObjectsReturned): raise SuspiciousOperation() - self.fields["email"].disabled = True - self.fields["email2"].disabled = True + elif request.session.get("invitation_code"): + try: + invitation = PersonInvitation.objects.get( + key=request.session.get("invitation_code") + ) + except PersonInvitation.DoesNotExist: + raise SuspiciousOperation() + + person = invitation.person - if person: - available_fields = [field.name for field in Person._meta.get_fields()] + if person: + self.instance = person + available_fields = [field.name for field in Person._meta.get_fields()] + if person.email: + self.fields["email"].disabled = True + self.fields["email2"].disabled = True self.fields["email2"].initial = person.email - for field in self.fields: - if field in available_fields and getattr(person, field): - self.fields[field].disabled = True - self.fields[field].initial = getattr(person, field) + for field in self.fields: + if field in available_fields and getattr(person, field): + self.fields[field].disabled = True + self.fields[field].initial = getattr(person, field) def save(self, request): adapter = get_adapter(request) @@ -639,8 +651,29 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): for field in Person._meta.get_fields(): if field.name in self.cleaned_data: data[field.name] = self.cleaned_data[field.name] - if not Person.objects.filter(email=data["email"]): - _person, created = Person.objects.update_or_create(user=user, **data) + if self.instance: + person_qs = Person.objects.filter(pk=self.instance.pk) + else: + person_qs = Person.objects.filter(email=data["email"]) + if not person_qs.exists(): + if get_site_preferences()["account__auto_create_person"]: + Person.objects.create(user=user, **data) + if person_qs.exists(): + person = person_qs.first() + for field, value in data.items(): + setattr(person, field, value) + person.user = user + person.save() + invitation_code = request.session.get("invitation_code") + if invitation_code: + from invitations.views import accept_invitation # noqa + + try: + invitation = PersonInvitation.objects.get(key=invitation_code) + except PersonInvitation.DoesNotExist: + raise SuspiciousOperation() + + accept_invitation(invitation, request, user) self.custom_signup(request, user) setup_user_email(request, user, []) return user @@ -722,17 +755,37 @@ class ActionForm(forms.Form): self.fields["selected_objects"].queryset = self.queryset self.fields["action"].choices = self._get_action_choices() - def execute(self) -> bool: + def clean_action(self): + action = self._get_actions_dict().get(self.cleaned_data["action"], None) + if not action: + raise ValidationError(_("The selected action does not exist.")) + return action + + def clean_selected_objects(self): + action = self.cleaned_data["action"] + if hasattr(action, "permission"): + selected_objects = queryset_rules_filter( + self.request, self.cleaned_data["selected_objects"], action.permission + ) + if selected_objects.count() < self.cleaned_data["selected_objects"].count(): + raise ValidationError( + _("You do not have permission to run {} on all selected objects.").format( + getattr(value, "short_description", value.__name__) + ) + ) + return self.cleaned_data["selected_objects"] + + def execute(self) -> Any: """Execute the selected action on all selected objects. - :return: If the form is not valid, it will return ``False``. + :return: the return value of the action """ if self.is_valid(): data = self.cleaned_data["selected_objects"] - action = self._get_actions_dict()[self.cleaned_data["action"]] - action(None, self.request, data) - return True - return False + action = self.cleaned_data["action"] + return action(None, self.request, data) + + raise TypeError("execute() must be called on a pre-validated form.") class ListActionForm(ActionForm): diff --git a/aleksis/core/frontend/app/apollo.js b/aleksis/core/frontend/app/apollo.js new file mode 100644 index 0000000000000000000000000000000000000000..c14ba118d0c4d14558f23a747a98b207067ff7b2 --- /dev/null +++ b/aleksis/core/frontend/app/apollo.js @@ -0,0 +1,97 @@ +/* + * Configuration for Apollo provider, client, and caches. + */ + +import { ApolloClient, HttpLink, from } from "@/apollo-boost"; + +import { RetryLink } from "@/apollo-link-retry"; +import { persistCache, LocalStorageWrapper } from "@/apollo3-cache-persist"; +import { InMemoryCache } from "@/apollo-cache-inmemory"; + +// Cache for GraphQL query results in memory and persistent across sessions +const cache = new InMemoryCache(); +await persistCache({ + cache: cache, + storage: new LocalStorageWrapper(window.localStorage), +}); + +/** + * Construct the GraphQL endpoint URI. + * + * @returns The URI of the GraphQL endpoint on the AlekSIS server + */ +function getGraphqlURL() { + const settings = JSON.parse( + document.getElementById("frontend_settings").textContent + ); + const base = settings.urls.base || window.location.origin; + return new URL(settings.urls.graphql, base); +} + +// Define Apollo links for handling query operations. +const links = [ + // Automatically retry failed queries + new RetryLink(), + // Finally, the HTTP link to the real backend (Django) + new HttpLink({ + uri: getGraphqlURL(), + }), +]; + +/** Upstream Apollo GraphQL client */ +const apolloClient = new ApolloClient({ + cache, + link: from(links), +}); + +const apolloOpts = { + defaultClient: apolloClient, + defaultOptions: { + $query: { + skip: function (vm, queryKey) { + if (queryKey in vm.$_apollo.queries) { + // We only want to run this query when background activity is on and we are not reported offline + return !!( + vm.$_apollo.queries[queryKey].options.pollInterval && + (!vm.$root.backgroundActive || vm.$root.offline) + ); + } + return false; + }, + error: ({ graphQLErrors, networkError }, vm) => { + if (graphQLErrors) { + for (let err of graphQLErrors) { + console.error( + "GraphQL query error in query", + err.path.join("."), + ":", + err.message + ); + } + // Add a snackbar on all errors returned by the GraphQL endpoint + // If App is offline, don't add snackbar since only the ping query is active + if (!vm.$root.offline) { + vm.$root.snackbarItems.push({ + id: crypto.randomUUID(), + timeout: 5000, + messageKey: "graphql.snackbar_error_message", + color: "red", + }); + } + } + if (networkError) { + // Set app offline globally on network errors + // This will cause the offline logic to kick in, starting a ping check or + // similar recovery strategies depending on the app/navigator state + console.error("Network error:", networkError); + console.error( + "Network error during GraphQL query, setting offline state" + ); + vm.$root.offline = true; + } + }, + }, + }, +}; + +export default apolloOpts; diff --git a/aleksis/core/frontend/app/dateTimeFormats.js b/aleksis/core/frontend/app/dateTimeFormats.js new file mode 100644 index 0000000000000000000000000000000000000000..a835b238ccb56b0cdfc465f3b7ea2341e45322f8 --- /dev/null +++ b/aleksis/core/frontend/app/dateTimeFormats.js @@ -0,0 +1,45 @@ +/** Date.time formats for VueI18n */ +const dateTimeFormats = { + en: { + short: { + year: "numeric", + month: "short", + day: "numeric", + }, + long: { + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + hour: "numeric", + minute: "numeric", + }, + timeOnly: { + hour: "numeric", + minute: "numeric", + second: "numeric", + }, + }, + de: { + short: { + year: "numeric", + month: "short", + day: "numeric", + }, + long: { + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + hour: "numeric", + minute: "numeric", + }, + timeOnly: { + hour: "numeric", + minute: "numeric", + second: "numeric", + }, + }, +}; + +export default dateTimeFormats; diff --git a/aleksis/core/frontend/app/i18n.js b/aleksis/core/frontend/app/i18n.js new file mode 100644 index 0000000000000000000000000000000000000000..ed50743eddf2d7fe306b9fe1116ef17fc914911d --- /dev/null +++ b/aleksis/core/frontend/app/i18n.js @@ -0,0 +1,14 @@ +/* + * Configuration for VueI18n + */ + +import dateTimeFormats from "./dateTimeFormats.js"; + +const i18nOpts = { + locale: "en", + fallbackLocale: "en", + messages: {}, + dateTimeFormats, +}; + +export default i18nOpts; diff --git a/aleksis/core/frontend/app/router.js b/aleksis/core/frontend/app/router.js new file mode 100644 index 0000000000000000000000000000000000000000..b1667866c17472759c9a589dfbe2cad0a9a961eb --- /dev/null +++ b/aleksis/core/frontend/app/router.js @@ -0,0 +1,12 @@ +/* + * Configuration for Vue router + */ + +import routes from "../routes.js"; + +const routerOpts = { + mode: "history", + routes, +}; + +export default routerOpts; diff --git a/aleksis/core/frontend/app/sentry.js b/aleksis/core/frontend/app/sentry.js new file mode 100644 index 0000000000000000000000000000000000000000..ca54d469b0456568f0c952dac7bdfeb9d73ec6fd --- /dev/null +++ b/aleksis/core/frontend/app/sentry.js @@ -0,0 +1,4 @@ +import * as Sentry from "@sentry/vue"; +import { BrowserTracing } from "@sentry/tracing"; + +export default { Sentry, BrowserTracing }; diff --git a/aleksis/core/frontend/app/vuetify.js b/aleksis/core/frontend/app/vuetify.js new file mode 100644 index 0000000000000000000000000000000000000000..e2d4439a6dac88f00af6d7ff57d8bda0b963ea40 --- /dev/null +++ b/aleksis/core/frontend/app/vuetify.js @@ -0,0 +1,29 @@ +/* + * Configuration for Vuetify + */ + +import "@/@mdi/font/css/materialdesignicons.css"; +import "@/vuetify/dist/vuetify.min.css"; +import "../css/global.scss"; + +const vuetifyOpts = { + icons: { + iconfont: "mdi", // default - only for display purposes + values: { + cancel: "mdi-close-circle-outline", + delete: "mdi-close-circle-outline", + success: "mdi-check-circle-outline", + info: "mdi-information-outline", + warning: "mdi-alert-outline", + error: "mdi-alert-octagon-outline", + prev: "mdi-chevron-left", + next: "mdi-chevron-right", + checkboxOn: "mdi-checkbox-marked-outline", + checkboxIndeterminate: "mdi-minus-box-outline", + edit: "mdi-pencil-outline", + preferences: "mdi-cog-outline", + }, + }, +}; + +export default vuetifyOpts; diff --git a/aleksis/core/frontend/components/LegacyBaseTemplate.vue b/aleksis/core/frontend/components/LegacyBaseTemplate.vue new file mode 100644 index 0000000000000000000000000000000000000000..3f620e7a0b04e16eae53e15b505f4b847064c6b0 --- /dev/null +++ b/aleksis/core/frontend/components/LegacyBaseTemplate.vue @@ -0,0 +1,94 @@ +<!-- + Base component to load legacy views from Django. + + It loads the legacy view into an iframe and attaches some utility + code to it. The legacy application and the new Vue application can + communicate with each other through a message channel. + + This helps during the migration from the pure SSR Django application + in AlekSIS 2.x to the pure Vue and GraphQL based application. + It will be removed once legacy view get unsupported. +--> + +<template> + <iframe + :src="'/django' + $route.path + queryString" + :height="iFrameHeight + 'px'" + class="iframe-fullsize" + @load="load" + ref="contentIFrame" + ></iframe> +</template> + +<script> +export default { + data: function () { + return { + iFrameHeight: 0, + }; + }, + computed: { + queryString() { + let qs = []; + for (const [param, value] of Object.entries(this.$route.query)) { + qs.push(`${param}=${encodeURIComponent(value)}`); + } + return "?" + qs.join("&"); + }, + }, + methods: { + /** Receives a message from the legacy app inside the iframe */ + receiveMessage(event) { + if (event.data.height) { + // The iframe communicated us its render height + // Set iframe to full height to prevent an inner scroll bar + this.iFrameHeight = event.data.height; + this.$root.contentLoading = false; + } + }, + /** Handle iframe data after inner page loaded */ + load() { + // Write new location of iframe back to Vue Router + const location = this.$refs.contentIFrame.contentWindow.location; + const url = new URL(location); + const path = url.pathname.replace(/^\/django/, ""); + const routePath = + path.charAt(path.length - 1) === "/" && + this.$route.path.charAt(path.length - 1) !== "/" + ? this.$route.path + "/" + : this.$route.path; + if (path !== routePath) { + this.$router.push(path); + } + + // Show loader if iframe starts to change its content, even if the $route stays the same + this.$refs.contentIFrame.contentWindow.onpagehide = () => { + this.$root.contentLoading = true; + }; + + // Write title of iframe to SPA window + const title = this.$refs.contentIFrame.contentWindow.document.title; + this.$root.$setPageTitle(title); + }, + }, + mounted() { + // Subscribe to message channel to receive height from iframe + this.safeAddEventListener(window, "message", this.receiveMessage); + }, + watch: { + $route() { + // Show loading animation once route changes + this.$root.contentLoading = true; + }, + }, + name: "LegacyBaseTemplate", +}; +</script> + +<style scoped> +.iframe-fullsize { + border: 0; + width: calc(100% + 24px); + margin: -12px; +} +</style> diff --git a/aleksis/core/frontend/components/Parent.vue b/aleksis/core/frontend/components/Parent.vue new file mode 100644 index 0000000000000000000000000000000000000000..5d0501418b6480fb5b6a069417fd92291dd50a32 --- /dev/null +++ b/aleksis/core/frontend/components/Parent.vue @@ -0,0 +1,11 @@ +<!-- Parent template for Vue router views --> + +<template> + <router-view></router-view> +</template> + +<script> +export default { + name: "Parent", +}; +</script> diff --git a/aleksis/core/frontend/components/about/About.vue b/aleksis/core/frontend/components/about/About.vue new file mode 100644 index 0000000000000000000000000000000000000000..6187d7c84503ce8633dc9a9559a88ac86b725d37 --- /dev/null +++ b/aleksis/core/frontend/components/about/About.vue @@ -0,0 +1,16 @@ +<template> + <div class="mt-4 mb-4"> + <about-aleksis></about-aleksis> + <installed-apps-list /> + </div> +</template> + +<script> +import InstalledAppsList from "./InstalledAppsList.vue"; +import AboutAleksis from "./AboutAleksis.vue"; + +export default { + name: "About", + components: { AboutAleksis, InstalledAppsList }, +}; +</script> diff --git a/aleksis/core/frontend/components/about/AboutAleksis.vue b/aleksis/core/frontend/components/about/AboutAleksis.vue new file mode 100644 index 0000000000000000000000000000000000000000..f13d32113cd7a01f36450331522d1fb2f62d0561 --- /dev/null +++ b/aleksis/core/frontend/components/about/AboutAleksis.vue @@ -0,0 +1,67 @@ +<!-- General information about AlekSIS as a whole --> + +<template> + <v-row class="mb-3"> + <v-col cols="12"> + <v-card class="d-flex flex-column"> + <v-card-title>{{ $t("about.about_aleksis") }}</v-card-title> + <v-card-text> + <p class="text-body-1"> + {{ $t("about.about_aleksis_1") }} + </p> + <p class="text-body-1"> + {{ $t("about.about_aleksis_2") }} + </p> + </v-card-text> + <v-spacer /> + <v-card-actions> + <v-btn text color="primary" href="https://aleksis.org/"> + {{ $t("about.website_of_aleksis") }} + </v-btn> + <v-btn text color="primary" href="https://edugit.org/AlekSIS/"> + {{ $t("about.source_code") }} + </v-btn> + </v-card-actions> + </v-card> + </v-col> + <v-col cols="12"> + <v-card class="d-flex flex-column"> + <v-card-title>{{ $t("about.licence_information") }}</v-card-title> + <v-card-text> + <p> + {{ $t("about.licence_information_1") }} + </p> + <p> + <v-chip color="green" text-color="white" small> + {{ $t("about.free_open_source_licence") }} + </v-chip> + <v-chip color="orange" text-color="white" small> + {{ $t("about.other_licence") }} + </v-chip> + </p> + </v-card-text> + <v-spacer /> + <v-card-actions> + <v-btn text color="primary" href="https://eupl.eu"> + {{ $t("about.full_licence_text") }} + </v-btn> + <v-btn + text + color="primary" + href="https://joinup.ec.europa.eu/collection/eupl/guidelines-users-and-developers" + > + {{ $t("about.more_information_eupl") }} + </v-btn> + </v-card-actions> + </v-card> + </v-col> + </v-row> +</template> + +<script> +export default { + name: "AboutAleksis", +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/about/InstalledAppCard.vue b/aleksis/core/frontend/components/about/InstalledAppCard.vue new file mode 100644 index 0000000000000000000000000000000000000000..7115dbfeef5055d5c38477fb1381676a6490712a --- /dev/null +++ b/aleksis/core/frontend/components/about/InstalledAppCard.vue @@ -0,0 +1,136 @@ +<!-- Information card for one AlekSIS app --> + +<template> + <v-col cols="12" md="6" lg="6" xl="4" class="d-flex align-stretch"> + <v-card :id="app.name" class="d-flex flex-column flex-grow-1"> + <v-card-title> + {{ app.verboseName }} + </v-card-title> + + <v-card-subtitle class="text-body-1 black--text"> + {{ app.version }} + </v-card-subtitle> + + <v-card-text> + <v-row v-if="app.licence" class="mb-2"> + <v-col cols="6"> + {{ $t("about.licenced_under") }} <br /> + <strong class="text-body-1 black--text"> + {{ app.licence.verboseName }} + </strong> + </v-col> + <v-col cols="6"> + {{ $t("about.licence_type") }} <br /> + <v-chip + v-if="app.licence.flags.isFsfLibre" + color="green" + text-color="white" + small + > + {{ $t("about.free_software") }} + </v-chip> + <v-chip + v-else-if="app.licence.flags.isOsiApproved" + color="green" + text-color="white" + small + > + {{ $t("about.open_source") }} + </v-chip> + <v-chip v-else color="orange" text-color="white" small> + {{ $t("about.proprietary") }} + </v-chip> + </v-col> + + <v-col cols="12" v-if="app.licence.licences.length !== 0"> + {{ $t("about.licence_consists_of") }} + <div + v-for="licence in app.licence.licences" + class="mb-2" + :key="licence.name" + > + <v-chip + v-if="licence.isOsiApproved || licence.isFsfLibre" + color="green" + text-color="green" + outlined + small + :href="licence.url" + > + {{ licence.name }} + </v-chip> + <v-chip + v-else + color="orange" + text-color="orange" + outlined + :href="licence.url" + > + {{ licence.name }} + </v-chip> + </div> + </v-col> + </v-row> + </v-card-text> + + <v-spacer /> + + <v-card-actions v-if="app.urls.length !== 0"> + <v-btn text color="primary" @click="reveal = true"> + {{ $t("about.show_copyright") }} + </v-btn> + <v-btn + v-for="url in app.urls" + color="primary" + text + :href="url.url" + :key="url.url" + > + {{ url.name }} + </v-btn> + </v-card-actions> + + <v-expand-transition> + <v-card + v-if="reveal" + class="transition-fast-in-fast-out v-card--reveal d-flex flex-column" + > + <v-card-text class="pb-0"> + <v-row> + <v-col cols="12" v-if="app.copyrights.length !== 0"> + <span v-for="(copyright, index) in app.copyrights" :key="index"> + {{ "Copyright ©" + copyright.years }} + <a :href="'mailto:' + copyright.email"> + {{ copyright.name }} + </a> + <br /> + </span> + </v-col> + </v-row> + </v-card-text> + <v-spacer></v-spacer> + <v-card-actions class="pt-0"> + <v-btn text color="primary" @click="reveal = false">{{ + $t("actions.close") + }}</v-btn> + </v-card-actions> + </v-card> + </v-expand-transition> + </v-card> + </v-col> +</template> + +<script> +export default { + name: "InstalledAppCard", + data: () => ({ + reveal: false, + }), + props: { + app: { + type: Object, + required: true, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/about/InstalledAppsList.vue b/aleksis/core/frontend/components/about/InstalledAppsList.vue new file mode 100644 index 0000000000000000000000000000000000000000..04f14d873fd525848cb2287bafc9e21d211fabb7 --- /dev/null +++ b/aleksis/core/frontend/components/about/InstalledAppsList.vue @@ -0,0 +1,44 @@ +<!-- List of all installed AlekSIS apps, as discovered from the server --> + +<template> + <div> + <v-row v-if="$apollo.queries.installedApps.loading"> + <v-col + v-for="idx in 3" + :key="idx" + cols="12" + md="6" + lg="6" + xl="4" + class="d-flex align-stretch" + > + <v-card class="d-flex flex-column flex-grow-1 pa-4"> + <v-skeleton-loader + type="heading, actions, text@5" + ></v-skeleton-loader> + </v-card> + </v-col> + </v-row> + <v-row v-if="installedApps"> + <installed-app-card + v-for="app in installedApps" + :key="app.name" + :app="app" + /> + </v-row> + </div> +</template> + +<script> +import InstalledAppCard from "./InstalledAppCard.vue"; +import gqlInstalledApps from "./installedApps.graphql"; +export default { + name: "InstalledAppsList", + components: { InstalledAppCard }, + apollo: { + installedApps: { + query: gqlInstalledApps, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/about/installedApps.graphql b/aleksis/core/frontend/components/about/installedApps.graphql new file mode 100644 index 0000000000000000000000000000000000000000..01ceaf99eb8d79d44ee7014d9f582d7dfeb54ace --- /dev/null +++ b/aleksis/core/frontend/components/about/installedApps.graphql @@ -0,0 +1,29 @@ +{ + installedApps { + name + verboseName + version + copyrights { + years + name + email + } + licence { + verboseName + flags { + isFsfLibre + isOsiApproved + } + licences { + isFsfLibre + isOsiApproved + name + url + } + } + urls { + name + url + } + } +} diff --git a/aleksis/core/frontend/components/app/AccountMenu.vue b/aleksis/core/frontend/components/app/AccountMenu.vue new file mode 100644 index 0000000000000000000000000000000000000000..70e8c52fa770b743c138c6212f296b223be83340 --- /dev/null +++ b/aleksis/core/frontend/components/app/AccountMenu.vue @@ -0,0 +1,83 @@ +<template> + <v-menu offset-y> + <template #activator="{ on, attrs }"> + <v-avatar v-bind="attrs" v-on="on"> + <img + v-if=" + systemProperties.sitePreferences.accountPersonPreferPhoto && + whoAmI.person.photo && + whoAmI.person.photo.url + " + :src="whoAmI.person.photo.url" + :alt="whoAmI.person.fullName" + :title="whoAmI.person.fullName" + /> + <img + v-else-if="whoAmI.person.avatarUrl" + :src="whoAmI.person.avatarUrl" + :alt="whoAmI.person.fullName + '(' + $t('person.avatar') + ')'" + :title="whoAmI.person.fullName + '(' + $t('person.avatar') + ')'" + /> + <v-icon v-else>mdi-person</v-icon> + </v-avatar> + </template> + <v-list> + <v-subheader> + {{ + $t( + whoAmI && whoAmI.isImpersonate + ? "person.impersonation.impersonating" + : "person.logged_in_as" + ) + }} + {{ whoAmI.person.fullName ? whoAmI.person.fullName : whoAmI.username }} + </v-subheader> + <v-list-item + v-if="whoAmI && whoAmI.isImpersonate" + :to="{ name: 'impersonate.stop', query: { next: $route.path } }" + > + <v-list-item-icon> + <v-icon> mdi-stop</v-icon> + </v-list-item-icon> + <v-list-item-title> + {{ $t("person.impersonation.stop") }} + </v-list-item-title> + </v-list-item> + <div v-for="menuItem in accountMenu" :key="menuItem.name"> + <v-divider v-if="menuItem.divider"></v-divider> + <v-list-item + :to="{ name: menuItem.name }" + :target="menuItem.newTab ? '_blank' : '_self'" + > + <v-list-item-icon> + <v-icon v-if="menuItem.icon">{{ menuItem.icon }}</v-icon> + </v-list-item-icon> + <v-list-item-title>{{ $t(menuItem.titleKey) }}</v-list-item-title> + </v-list-item> + </div> + </v-list> + </v-menu> +</template> + +<script> +export default { + name: "AccountMenu", + props: { + accountMenu: { + type: Array, + required: false, + default: () => [], + }, + systemProperties: { + type: Object, + required: true, + }, + whoAmI: { + type: Object, + required: true, + }, + }, +}; +</script> + +<style></style> diff --git a/aleksis/core/frontend/components/app/App.vue b/aleksis/core/frontend/components/app/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..c86e5910a1797bc675973d198f80ce9bd4116c9c --- /dev/null +++ b/aleksis/core/frontend/components/app/App.vue @@ -0,0 +1,276 @@ +<!-- + Main App component. + + This component contains the outer app UI of AlekSIS and all behaviour + that is always on-screen, independent of the specific page. +--> + +<template> + <v-app v-cloak> + <splash v-if="$apollo.loading && !systemProperties" splash /> + <div v-else> + <side-nav + v-model="drawer" + :system-properties="systemProperties" + :side-nav-menu="sideNavMenu" + ></side-nav> + <v-app-bar + app + :color="$vuetify.theme.dark ? undefined : 'primary white--text'" + > + <v-app-bar-nav-icon @click="drawer = !drawer" color="white" /> + + <v-toolbar-title + tag="a" + class="white--text text-decoration-none" + @click="$router.push({ name: 'dashboard' })" + > + {{ systemProperties.sitePreferences.generalTitle }} + </v-toolbar-title> + + <v-progress-linear + :active="$root.contentLoading" + :indeterminate="$root.contentLoading" + absolute + bottom + :color="$vuetify.theme.dark ? 'primary' : 'grey lighten-3'" + ></v-progress-linear> + + <v-spacer /> + <v-btn + icon + color="white" + v-if="needRefresh && refreshDismissed" + @click="refreshDismissed = false" + > + <v-icon>mdi-update</v-icon> + </v-btn> + <div v-if="whoAmI && whoAmI.isAuthenticated" class="d-flex"> + <notification-list v-if="!whoAmI.person.isDummy" /> + <account-menu + :account-menu="accountMenu" + :system-properties="systemProperties" + :who-am-i="whoAmI" + ></account-menu> + </div> + </v-app-bar> + <v-main> + <v-container> + <broadcast-channel-notification channel-name="cache-or-not" /> + + <message-box type="warning" v-if="$root.offline"> + {{ $t("network_errors.offline_notification") }} + </message-box> + + <message-box + type="error" + v-if="whoAmI && whoAmI.person && whoAmI.person.isDummy" + > + {{ $t("base.person_is_dummy") }} + </message-box> + <message-box + type="error" + v-else-if="whoAmI && !whoAmI.person && !whoAmI.isAnonymous" + > + {{ $t("base.user_not_linked_to_person") }} + </message-box> + + <div v-if="messages"> + <message-box + v-for="(message, idx) in messages" + :type="message.tags" + :key="idx" + >{{ message.message }} + </message-box> + </div> + + <router-view + v-if=" + !$route.meta.permission || checkPermission($route.meta.permission) + " + /> + <message-box + type="error" + v-else-if=" + whoAmI && + !$apollo.queries.whoAmI.loading && + !checkPermission($route.meta.permission) + " + > + {{ $t("base.no_permission") }} + </message-box> + </v-container> + </v-main> + + <celery-progress-bottom v-if="whoAmI && !whoAmI.isAnonymous" /> + + <v-footer + app + absolute + inset + dark + class="pa-0 d-flex" + color="primary lighten-1" + > + <v-card flat tile class="primary white--text flex-grow-1"> + <div v-if="footerMenu && footerMenu.items"> + <v-card-text class="pa-0"> + <v-container class="px-6"> + <v-row justify="center" no-gutters> + <v-btn + v-for="menu_item in footerMenu.items" + :key="menu_item.name" + text + rounded + :href="menu_item.url" + color="white" + class="ma-2" + > + <v-icon v-if="menu_item.icon" left>{{ + "mdi-" + menu_item.icon + }}</v-icon> + {{ menu_item.name }} + </v-btn> + </v-row> + </v-container> + </v-card-text> + <v-divider /> + </div> + + <v-card-text class="pa-0"> + <v-container class="px-6"> + <v-row> + <v-col class="white--text d-flex align-center subtitle-2"> + <div> + <router-link + :to="{ name: 'core.about' }" + class="white--text text-decoration-none" + >{{ $t("base.about_aleksis") }} + </router-link> + <!-- eslint-disable-next-line --> + <span>© The AlekSIS Team</span> + </div> + </v-col> + <v-col class="d-flex justify-end"> + <v-btn + v-if="systemProperties.sitePreferences.footerImprintUrl" + small + text + :href="systemProperties.sitePreferences.footerImprintUrl" + color="white" + > + {{ $t("base.imprint") }} + </v-btn> + <v-btn + v-if="systemProperties.sitePreferences.footerPrivacyUrl" + small + text + :href="systemProperties.sitePreferences.footerPrivacyUrl" + color="white" + > + {{ $t("base.privacy_policy") }} + </v-btn> + </v-col> + </v-row> + </v-container> + </v-card-text> + </v-card> + </v-footer> + </div> + <snackbar-item + v-for="item in $root.snackbarItems" + :key="item.id" + :snackbar-item="item" + /> + <v-snackbar v-model="needRefresh" v-if="!refreshDismissed" timeout="-1"> + {{ $t("service_worker.new_version_available") }} + + <template #action="{ attrs }"> + <v-btn color="primary" text @click="updateServiceWorker()"> + {{ $t("service_worker.update") }} + </v-btn> + <v-btn color="primary" text @click="refreshDismissed = true"> + {{ $t("service_worker.dismiss") }} + </v-btn> + </template> + </v-snackbar> + </v-app> +</template> + +<script> +import BroadcastChannelNotification from "./BroadcastChannelNotification.vue"; +import AccountMenu from "./AccountMenu.vue"; +import NotificationList from "../notifications/NotificationList.vue"; +import CeleryProgressBottom from "../celery_progress/CeleryProgressBottom.vue"; +import Splash from "./Splash.vue"; +import SideNav from "./SideNav.vue"; +import SnackbarItem from "./SnackbarItem.vue"; + +import gqlWhoAmI from "./whoAmI.graphql"; +import gqlMessages from "./messages.graphql"; +import gqlSystemProperties from "./systemProperties.graphql"; + +import useRegisterSWMixin from "../../mixins/useRegisterSW"; +import offlineMixin from "../../mixins/offline"; +import menusMixin from "../../mixins/menus"; + +export default { + data() { + return { + drawer: this.$vuetify.breakpoint.lgAndUp, + whoAmI: null, + systemProperties: null, + messages: null, + }; + }, + apollo: { + systemProperties: gqlSystemProperties, + whoAmI: { + query: gqlWhoAmI, + variables() { + return { + permissions: this.permissionNames, + }; + }, + pollInterval: 10000, + }, + messages: { + query: gqlMessages, + pollInterval: 1000, + }, + }, + watch: { + systemProperties: function (newProperties) { + this.$i18n.locale = newProperties.currentLanguage; + this.$vuetify.lang.current = newProperties.currentLanguage; + this.$vuetify.theme.themes.light.primary = + newProperties.sitePreferences.themePrimary; + this.$vuetify.theme.themes.light.secondary = + newProperties.sitePreferences.themeSecondary; + this.$vuetify.theme.themes.dark.primary = + newProperties.sitePreferences.themePrimary; + this.$vuetify.theme.themes.dark.secondary = + newProperties.sitePreferences.themeSecondary; + }, + whoAmI: { + handler() { + this.buildMenus(); + }, + deep: true, + }, + }, + name: "App", + components: { + AccountMenu, + BroadcastChannelNotification, + NotificationList, + CeleryProgressBottom, + Splash, + SideNav, + SnackbarItem, + }, + mixins: [useRegisterSWMixin, offlineMixin, menusMixin], +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/app/BrandLogo.vue b/aleksis/core/frontend/components/app/BrandLogo.vue new file mode 100644 index 0000000000000000000000000000000000000000..8d32dd0c22382b1047df9150a8e3d0c247197a4f --- /dev/null +++ b/aleksis/core/frontend/components/app/BrandLogo.vue @@ -0,0 +1,19 @@ +<template> + <img + :src="sitePreferences.themeLogo.url" + :alt="sitePreferences.generalTitle + ' – ' + $t('base.logo')" + class="fullsize" + /> +</template> + +<script> +export default { + name: "BrandLogo", + props: { + sitePreferences: { + type: Object, + required: true, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/app/BroadcastChannelNotification.vue b/aleksis/core/frontend/components/app/BroadcastChannelNotification.vue new file mode 100644 index 0000000000000000000000000000000000000000..1dbad032d6e4ccdc1adacd94f76a981524a90dff --- /dev/null +++ b/aleksis/core/frontend/components/app/BroadcastChannelNotification.vue @@ -0,0 +1,31 @@ +<template> + <message-box :value="show" type="warning"> + {{ $t("alerts.page_cached") }} + </message-box> +</template> + +<script> +export default { + name: "BroadcastChannelNotification", + props: { + channelName: { + type: String, + required: true, + }, + }, + data() { + return { + show: false, + }; + }, + created() { + this.channel = new BroadcastChannel(this.channelName); + this.channel.onmessage = (event) => { + this.show = event.data === true; + }; + }, + destroyed() { + this.channel.close(); + }, +}; +</script> diff --git a/aleksis/core/frontend/components/app/ErrorPage.vue b/aleksis/core/frontend/components/app/ErrorPage.vue new file mode 100644 index 0000000000000000000000000000000000000000..abbf6a6cd828e5673c999032cc285c83b71d6a0b --- /dev/null +++ b/aleksis/core/frontend/components/app/ErrorPage.vue @@ -0,0 +1,36 @@ +<template> + <div + class="d-flex justify-center align-center flex-column text-center" + id="wrapper" + > + <h1 class="text-h2">{{ $t(shortErrorMessageKey) }}</h1> + <div>{{ $t(longErrorMessageKey) }}</div> + <v-btn color="secondary" :to="{ name: 'dashboard' }"> + <v-icon left>mdi-home-outline</v-icon> + {{ $t("network_errors.back_to_start") }} + </v-btn> + </div> +</template> + +<script> +export default { + name: "ErrorPage", + props: { + shortErrorMessageKey: { + type: String, + required: true, + }, + longErrorMessageKey: { + type: String, + required: true, + }, + }, +}; +</script> + +<style scoped> +#wrapper { + min-height: 70vh; + gap: 1em; +} +</style> diff --git a/aleksis/core/frontend/components/app/LanguageForm.vue b/aleksis/core/frontend/components/app/LanguageForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..355f719e45eb6e77f2ca6e439687986cbbf788de --- /dev/null +++ b/aleksis/core/frontend/components/app/LanguageForm.vue @@ -0,0 +1,46 @@ +<template> + <v-select + v-if="availableLanguages" + v-model="language" + :items="availableLanguages" + item-text="nameTranslated" + item-value="code" + menu-props="auto" + outlined + color="primary" + hide-details="auto" + single-line + return-object + dense + style="width: 75px" + @input="setLanguage(language)" + > + <template #selection="{ item, index }"> + <span class="text-uppercase">{{ item.code }}</span> + </template> + </v-select> +</template> + +<script> +export default { + data: function () { + return { + language: this.$i18n.locale, + }; + }, + props: { + availableLanguages: { + type: Array, + required: true, + }, + }, + methods: { + setLanguage: function (languageOption) { + document.cookie = languageOption.cookie; + this.$i18n.locale = languageOption.code; + this.$vuetify.lang.current = languageOption.code; + }, + }, + name: "LanguageForm", +}; +</script> diff --git a/aleksis/core/frontend/components/app/SideNav.vue b/aleksis/core/frontend/components/app/SideNav.vue new file mode 100644 index 0000000000000000000000000000000000000000..79ee3745b7c4fc4199eda657d18482408ad06f29 --- /dev/null +++ b/aleksis/core/frontend/components/app/SideNav.vue @@ -0,0 +1,96 @@ +<template> + <v-navigation-drawer app :value="value"> + <v-list nav dense shaped> + <v-list-item class="logo"> + <a + id="logo-container" + @click="$router.push({ name: 'dashboard' })" + class="brand-logo" + > + <brand-logo :site-preferences="systemProperties.sitePreferences" /> + </a> + </v-list-item> + <v-list-item class="search"> + <sidenav-search /> + </v-list-item> + <v-list-item-group :value="$route.name" v-if="sideNavMenu"> + <div v-for="menuItem in sideNavMenu" :key="menuItem.name"> + <v-list-group + v-if="menuItem.subMenu.length > 0" + href="#!" + :prepend-icon="menuItem.icon" + :value="$route.matched.slice(-2).shift().name === menuItem.name" + > + <template #activator> + <v-list-item-title + >{{ $t(menuItem.titleKey) }} + </v-list-item-title> + </template> + <v-list-item + v-for="subMenuItem in menuItem.subMenu" + exact + :to="{ name: subMenuItem.name }" + :target="subMenuItem.newTab ? '_blank' : '_self'" + :key="subMenuItem.name" + :value="subMenuItem.name" + > + <v-list-item-icon> + <v-icon v-if="subMenuItem.icon">{{ subMenuItem.icon }} </v-icon> + </v-list-item-icon> + <v-list-item-title + >{{ $t(subMenuItem.titleKey) }} + </v-list-item-title> + </v-list-item> + </v-list-group> + <v-list-item + v-else + exact + :to="{ name: menuItem.name }" + :target="menuItem.newTab ? '_blank' : '_self'" + :value="menuItem.name" + > + <v-list-item-icon> + <v-icon v-if="menuItem.icon">{{ menuItem.icon }}</v-icon> + </v-list-item-icon> + <v-list-item-title>{{ $t(menuItem.titleKey) }}</v-list-item-title> + </v-list-item> + </div> + </v-list-item-group> + <template v-else> + <v-skeleton-loader class="ma-2" type="list-item@5" /> + </template> + </v-list> + + <template #append> + <div class="pa-4 d-flex justify-center align-center"> + <v-spacer /> + <language-form + :available-languages="systemProperties.availableLanguages" + /> + <v-spacer /> + </div> + </template> + </v-navigation-drawer> +</template> + +<script> +import BrandLogo from "./BrandLogo.vue"; +import LanguageForm from "./LanguageForm.vue"; +import SidenavSearch from "./SidenavSearch.vue"; + +export default { + name: "SideNav", + components: { + BrandLogo, + LanguageForm, + SidenavSearch, + }, + props: { + sideNavMenu: { type: Array, required: false, default: null }, + systemProperties: { type: Object, required: true }, + value: { type: Boolean, required: true }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/app/SidenavSearch.vue b/aleksis/core/frontend/components/app/SidenavSearch.vue new file mode 100644 index 0000000000000000000000000000000000000000..281e5abb9ffc3d07e9607f6af4e076d192b9fd8a --- /dev/null +++ b/aleksis/core/frontend/components/app/SidenavSearch.vue @@ -0,0 +1,61 @@ +<template> + <v-autocomplete + :prepend-icon="'mdi-magnify'" + append-icon="" + @click:prepend="$router.push(`/search/?q=${q}`)" + @keydown.enter="$router.push(`/search/?q=${q}`)" + single-line + clearable + :loading="$apollo.queries.searchSnippets.loading" + id="search" + type="search" + enterkeyhint="search" + :label="$t('actions.search')" + :search-input.sync="q" + flat + solo + cache-items + hide-no-data + hide-details + menu-props="closeOnContentClick" + :items="searchSnippets" + > + <template #item="{ item }"> + <v-list-item @click="$router.push(item.obj.absoluteUrl.substring(7))"> + <v-list-item-icon v-if="item.obj.icon"> + <v-icon>{{ "mdi-" + item.obj.icon }}</v-icon> + </v-list-item-icon> + <v-list-item-content> + <v-list-item-title> {{ item.obj.name }}</v-list-item-title> + <v-list-item-subtitle>{{ item.text }}</v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + </template> + </v-autocomplete> +</template> + +<script> +import gqlSearchSnippets from "./searchSnippets.graphql"; + +export default { + name: "SidenavSearch", + data() { + return { + q: "", + }; + }, + apollo: { + searchSnippets: { + query: gqlSearchSnippets, + variables() { + return { + q: this.q, + }; + }, + skip() { + return !this.q; + }, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/app/SnackbarItem.vue b/aleksis/core/frontend/components/app/SnackbarItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..ee442c44f99d9e1222ca80f0cd8f9beda49d0c65 --- /dev/null +++ b/aleksis/core/frontend/components/app/SnackbarItem.vue @@ -0,0 +1,39 @@ +<template> + <v-snackbar + v-model="visible" + :color="snackbarItem.color" + :timeout="snackbarItem.timeout" + @input="deleteSnackbarItem" + > + {{ $t(snackbarItem.messageKey) }} + <template #action="{ attrs }"> + <v-btn icon @click="deleteSnackbarItem" + ><v-icon>mdi-close</v-icon> + </v-btn> + </template> + </v-snackbar> +</template> + +<script> +export default { + name: "SnackbarItem", + data() { + return { + visible: true, + }; + }, + props: { + snackbarItem: { + type: Object, + required: true, + }, + }, + methods: { + deleteSnackbarItem() { + this.$root.snackbarItems = this.$root.snackbarItems.filter( + (obj) => obj.id !== this.snackbarItem.id + ); + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/app/Splash.vue b/aleksis/core/frontend/components/app/Splash.vue new file mode 100644 index 0000000000000000000000000000000000000000..dbd491b627fdccbe9e8b289bdff076b442b314bb --- /dev/null +++ b/aleksis/core/frontend/components/app/Splash.vue @@ -0,0 +1,119 @@ +<template> + <div> + <div id="logo-container"> + <img :src="'/logo'" alt="Logo" id="logo" width="600" /> + </div> + <div class="lds-ellipsis"> + <div></div> + <div></div> + <div></div> + <div></div> + </div> + </div> +</template> + +<script> +export default { + name: "Splash", + props: { + splash: { + type: Boolean, + default: false, + }, + }, +}; +</script> + +<style scoped> +.progress-container { + position: fixed; + top: 10%; + right: 0; + left: 0; + bottom: 10%; + z-index: 1000; +} + +#logo { + width: 100%; + max-height: inherit; +} + +#logo-container { + width: min(80vw, 600px); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + max-height: calc(100vh - 10vh - calc(2 * min(85px, 15vh))); +} + +.lds-ellipsis { + display: inline-block; + position: absolute; + bottom: 5vh; + left: 50%; + transform: translate(-50%); + aspect-ratio: 1; + height: min(15vh, 85px); +} + +.lds-ellipsis div { + position: absolute; + top: 41.25%; + width: 16.25%; + height: 16.25%; + border-radius: 50%; + aspect-ratio: 1; + background: v-bind("$vuetify.theme.currentTheme.primary"); + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} + +.lds-ellipsis div:nth-child(1) { + left: 10%; + animation: lds-ellipsis1 0.6s infinite; +} + +.lds-ellipsis div:nth-child(2) { + left: 10%; + animation: lds-ellipsis2 0.6s infinite; +} + +.lds-ellipsis div:nth-child(3) { + left: 40%; + animation: lds-ellipsis2 0.6s infinite; +} + +.lds-ellipsis div:nth-child(4) { + left: 70%; + animation: lds-ellipsis3 0.6s infinite; +} + +@keyframes lds-ellipsis1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } +} + +@keyframes lds-ellipsis3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } +} + +@keyframes lds-ellipsis2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(calc(0.3 * min(15vh, 85px)), 0); + } +} +</style> diff --git a/aleksis/core/frontend/components/app/customMenu.graphql b/aleksis/core/frontend/components/app/customMenu.graphql new file mode 100644 index 0000000000000000000000000000000000000000..9591126f8226a590355969d643a5db9257c2b4e6 --- /dev/null +++ b/aleksis/core/frontend/components/app/customMenu.graphql @@ -0,0 +1,10 @@ +query ($name: String!) { + customMenuByName(name: $name) { + name + items { + name + url + icon + } + } +} diff --git a/aleksis/core/frontend/components/app/messages.graphql b/aleksis/core/frontend/components/app/messages.graphql new file mode 100644 index 0000000000000000000000000000000000000000..96c09c62c90962b103fae88dc53bc4c96e1a2b49 --- /dev/null +++ b/aleksis/core/frontend/components/app/messages.graphql @@ -0,0 +1,6 @@ +{ + messages { + tags + message + } +} diff --git a/aleksis/core/frontend/components/app/ping.graphql b/aleksis/core/frontend/components/app/ping.graphql new file mode 100644 index 0000000000000000000000000000000000000000..cc2f908e4bb80794c5a3c6c1bda2ecf98f31c087 --- /dev/null +++ b/aleksis/core/frontend/components/app/ping.graphql @@ -0,0 +1,3 @@ +query Pinf($payload: String) { + ping(payload: $payload) +} diff --git a/aleksis/core/frontend/components/app/searchSnippets.graphql b/aleksis/core/frontend/components/app/searchSnippets.graphql new file mode 100644 index 0000000000000000000000000000000000000000..65a686624b21d4aba3d925ad7d6c48b1ab185063 --- /dev/null +++ b/aleksis/core/frontend/components/app/searchSnippets.graphql @@ -0,0 +1,10 @@ +query search($q: String!) { + searchSnippets(query: $q, limit: 5) { + obj { + name + absoluteUrl + icon + } + text + } +} diff --git a/aleksis/core/frontend/components/app/systemProperties.graphql b/aleksis/core/frontend/components/app/systemProperties.graphql new file mode 100644 index 0000000000000000000000000000000000000000..e599cf04694c79a0bd7d1a38dd7f9bb0bd80a4ae --- /dev/null +++ b/aleksis/core/frontend/components/app/systemProperties.graphql @@ -0,0 +1,21 @@ +{ + systemProperties { + availableLanguages { + code + nameTranslated + cookie + } + currentLanguage + sitePreferences { + themePrimary + themeSecondary + themeLogo { + url + } + generalTitle + accountPersonPreferPhoto + footerImprintUrl + footerPrivacyUrl + } + } +} diff --git a/aleksis/core/frontend/components/app/whoAmI.graphql b/aleksis/core/frontend/components/app/whoAmI.graphql new file mode 100644 index 0000000000000000000000000000000000000000..12235e0ed7c320f46f0442c23e4a75dbba44c6cd --- /dev/null +++ b/aleksis/core/frontend/components/app/whoAmI.graphql @@ -0,0 +1,20 @@ +query ($permissions: [String]!) { + whoAmI { + username + isAuthenticated + isAnonymous + person { + photo { + url + } + fullName + avatarUrl + isDummy + isImpersonate + } + permissions: globalPermissionsByName(permissions: $permissions) { + name + result + } + } +} diff --git a/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue new file mode 100644 index 0000000000000000000000000000000000000000..5564ae8aa508268fc5ad1145bc14581fd3de08f9 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/CeleryProgress.vue @@ -0,0 +1,126 @@ +<!-- Display the progress/status of a background task on the server --> + +<template> + <small-container> + <v-card :loading="$apollo.loading"> + <v-card-title v-if="progress"> + {{ progress.meta.title }} + </v-card-title> + <v-card-text v-if="progress"> + <v-progress-linear + :value="progress.progress.percent" + buffer-value="0" + color="primary" + class="mb-2" + stream + /> + <div class="text-center mb-4"> + {{ + progress.meta.progressTitle + ? progress.meta.progressTitle + : $t("celery_progress.progress_title") + }} + </div> + <div v-if="progress"> + <message-box + v-for="(message, idx) in progress.messages" + dense + :type="message.tag" + transition="slide-x-transition" + :key="idx" + > + {{ message.message }} + </message-box> + </div> + <message-box + v-if="progress.state === 'ERROR'" + dense + type="error" + transition="slide-x-transition" + > + {{ + progress.meta.errorMessage + ? progress.meta.errorMessage + : $t("celery_progress.error_message") + }} + </message-box> + <message-box + v-if="progress.state === 'SUCCESS'" + dense + type="success" + transition="slide-x-transition" + > + {{ + progress.meta.successMessage + ? progress.meta.successMessage + : $t("celery_progress.success_message") + }} + </message-box> + </v-card-text> + <v-card-actions + v-if=" + progress && + (progress.state === 'ERROR' || progress.state === 'SUCCESS') + " + > + <back-button :href="progress.meta.backUrl" text /> + <v-spacer /> + <v-btn + v-if="progress.meta.additionalButton" + :href="progress.meta.additionalButton.url" + text + color="primary" + > + <v-icon v-if="progress.meta.additionalButton.icon" left> + {{ progress.meta.additionalButton.icon }} + </v-icon> + {{ progress.meta.additionalButton.title }} + </v-btn> + </v-card-actions> + </v-card> + </small-container> +</template> + +<script> +import gqlCeleryProgress from "./celeryProgress.graphql"; +import gqlCeleryProgressFetched from "./celeryProgressFetched.graphql"; + +export default { + name: "CeleryProgress", + apollo: { + celeryProgressByTaskId: { + query: gqlCeleryProgress, + variables() { + return { + taskId: this.$route.params.taskId, + }; + }, + pollInterval: 1000, + }, + }, + computed: { + progress() { + return this.celeryProgressByTaskId; + }, + state() { + return this.progress ? this.progress.state : null; + }, + }, + watch: { + state(newState) { + if (newState === "SUCCESS" || newState === "ERROR") { + this.$apollo.queries.celeryProgressByTaskId.stopPolling(); + this.$apollo.mutate({ + mutation: gqlCeleryProgressFetched, + variables: { + taskId: this.$route.params.taskId, + }, + }); + } + if (newState === "SUCCESS" && this.progress.meta.redirectOnSuccessUrl) { + this.$router.push(this.progress.meta.redirectOnSuccessUrl); + } + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue b/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue new file mode 100644 index 0000000000000000000000000000000000000000..410e57fda0eca36d3acaca7fc0318174fd71d318 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/CeleryProgressBottom.vue @@ -0,0 +1,54 @@ +<template> + <v-bottom-sheet :value="show" persistent hide-overlay max-width="400px"> + <v-expansion-panels accordion v-model="open"> + <v-expansion-panel> + <v-expansion-panel-header color="primary" class="white--text px-4"> + {{ + $tc("celery_progress.running_tasks", numberOfTasks, { + number: numberOfTasks, + }) + }} + </v-expansion-panel-header> + <v-expansion-panel-content> + <div class="mx-n6 mb-n4" v-if="celeryProgressByUser"> + <task-list-item + v-for="task in celeryProgressByUser" + :task="task" + :key="task.meta.taskId" + /> + </div> + </v-expansion-panel-content> + </v-expansion-panel> + </v-expansion-panels> + </v-bottom-sheet> +</template> + +<script> +import TaskListItem from "./TaskListItem.vue"; +import gqlCeleryProgressButton from "./celeryProgressBottom.graphql"; + +export default { + name: "CeleryProgressBottom", + components: { TaskListItem }, + data() { + return { open: 0 }; + }, + computed: { + show() { + return this.celeryProgressByUser && this.celeryProgressByUser.length > 0; + }, + numberOfTasks() { + if (!this.celeryProgressByUser) { + return 0; + } + return this.celeryProgressByUser.length; + }, + }, + apollo: { + celeryProgressByUser: { + query: gqlCeleryProgressButton, + pollInterval: 1000, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/celery_progress/TaskListItem.vue b/aleksis/core/frontend/components/celery_progress/TaskListItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..17c2a683532104f9c7ea71ba28da709ebb00fe89 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/TaskListItem.vue @@ -0,0 +1,37 @@ +<template> + <v-list-item + :key="task.meta.taskId" + :to="{ name: 'core.celery_progress', params: { taskId: task.meta.taskId } }" + > + <v-list-item-content> + <v-list-item-title>{{ task.meta.title }}</v-list-item-title> + <v-list-item-subtitle>{{ task.meta.progressTitle }}</v-list-item-subtitle> + </v-list-item-content> + + <v-list-item-action> + <v-progress-circular + v-if="!task.complete" + color="primary" + :value="task.progress.percent" + /> + <v-icon size="32px" v-else-if="task.state === 'SUCCESS'" color="success" + >mdi-check-circle-outline</v-icon + > + <v-icon size="32px" v-else color="error">mdi-alert-circle-outline</v-icon> + </v-list-item-action> + </v-list-item> +</template> + +<script> +export default { + name: "TaskListItem", + props: { + task: { + type: Object, + required: true, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/celery_progress/celeryProgress.graphql b/aleksis/core/frontend/components/celery_progress/celeryProgress.graphql new file mode 100644 index 0000000000000000000000000000000000000000..557e33517d4f3536e043ba0e64cb8c3f622741d2 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/celeryProgress.graphql @@ -0,0 +1,30 @@ +query ($taskId: String!) { + celeryProgressByTaskId(taskId: $taskId) { + state + success + progress { + current + total + percent + } + complete + messages { + level + message + tag + } + meta { + title + progressTitle + errorMessage + successMessage + redirectOnSuccessUrl + backUrl + additionalButton { + title + icon + url + } + } + } +} diff --git a/aleksis/core/frontend/components/celery_progress/celeryProgressBottom.graphql b/aleksis/core/frontend/components/celery_progress/celeryProgressBottom.graphql new file mode 100644 index 0000000000000000000000000000000000000000..5cae8f3baa46b14b4cf1031dc248d2dd7757b576 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/celeryProgressBottom.graphql @@ -0,0 +1,17 @@ +{ + celeryProgressByUser { + state + success + progress { + current + total + percent + } + complete + meta { + taskId + title + progressTitle + } + } +} diff --git a/aleksis/core/frontend/components/celery_progress/celeryProgressFetched.graphql b/aleksis/core/frontend/components/celery_progress/celeryProgressFetched.graphql new file mode 100644 index 0000000000000000000000000000000000000000..b3fedc916e6a3851677f0fe7a3c322c9311a33e4 --- /dev/null +++ b/aleksis/core/frontend/components/celery_progress/celeryProgressFetched.graphql @@ -0,0 +1,7 @@ +mutation ($taskId: String!) { + celeryProgressFetched(taskId: $taskId) { + celeryProgress { + state + } + } +} diff --git a/aleksis/core/frontend/components/generic/AvatarClickbox.vue b/aleksis/core/frontend/components/generic/AvatarClickbox.vue new file mode 100644 index 0000000000000000000000000000000000000000..53b705431c50cd011fdff4c8b4bfa94d331cd1d4 --- /dev/null +++ b/aleksis/core/frontend/components/generic/AvatarClickbox.vue @@ -0,0 +1,31 @@ +<template> + <v-dialog v-model="overlay" max-width="fit-content" max-height="fit-content"> + <template #activator="{ on, attrs }"> + <v-card class="rounded-circle"> + <v-responsive :aspect-ratio="1" v-bind="attrs" v-on="on"> + <slot name="activator" /> + </v-responsive> + </v-card> + </template> + <div class="inDialog"> + <slot class="inDialog" /> + </div> + </v-dialog> +</template> + +<script> +export default { + name: "AvatarClickBox", + data: () => ({ + overlay: false, + }), +}; +</script> + +<style scoped> +.inDialog { + /* FIXME: find a way to enlarge image */ + max-height: 80vmin; + width: 80vmin; +} +</style> diff --git a/aleksis/core/frontend/components/generic/BackButton.vue b/aleksis/core/frontend/components/generic/BackButton.vue new file mode 100644 index 0000000000000000000000000000000000000000..eaa305f7c3c8f2ca17f53f709870459e9cc790bd --- /dev/null +++ b/aleksis/core/frontend/components/generic/BackButton.vue @@ -0,0 +1,12 @@ +<template> + <v-btn color="secondary" v-bind="$attrs"> + <v-icon left>mdi-chevron-left</v-icon> + {{ $t("actions.back") }} + </v-btn> +</template> + +<script> +export default { + name: "BackButton", +}; +</script> diff --git a/aleksis/core/frontend/components/generic/ButtonMenu.vue b/aleksis/core/frontend/components/generic/ButtonMenu.vue new file mode 100644 index 0000000000000000000000000000000000000000..b105f84a8e1254f90bb1d78a2903c42f60cec29e --- /dev/null +++ b/aleksis/core/frontend/components/generic/ButtonMenu.vue @@ -0,0 +1,32 @@ +<template> + <v-menu transition="slide-y-transition" offset-y> + <template #activator="{ on, attrs }"> + <slot name="activator" v-bind="{ on, attrs }"> + <v-btn outlined text v-bind="attrs" v-on="on"> + <v-icon center> + {{ icon }} + </v-icon> + </v-btn> + </slot> + </template> + + <v-list> + <slot /> + </v-list> + </v-menu> +</template> + +<script> +export default { + name: "ButtonMenu", + props: { + icon: { + type: String, + required: false, + default: "mdi-dots-horizontal", + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/generic/DetailView.vue b/aleksis/core/frontend/components/generic/DetailView.vue new file mode 100644 index 0000000000000000000000000000000000000000..da921bbc8dc7dc4e77b05396a4582b4485db02ad --- /dev/null +++ b/aleksis/core/frontend/components/generic/DetailView.vue @@ -0,0 +1,54 @@ +<template> + <div> + <v-row class="align-center"> + <v-col + v-if="!noAvatar" + cols="5" + sm="4" + md="3" + lg="2" + xl="1" + order="first" + max-width="220px" + > + <slot name="avatarContent" /> + </v-col> + + <v-col order="last" order-sm="1" cols="12" sm=""> + <h1> + <slot name="title" /> + </h1> + + <div class="text-h5 grey--text text--darken-2"> + <slot name="subtitle" /> + </div> + </v-col> + + <v-col order="1" order-sm="last" class="ms-5"> + <slot + name="actions" + :classes="'d-flex gap justify-md-end flex-column-reverse flex-md-row align-end align-md-center'" + /> + </v-col> + </v-row> + <slot /> + </div> +</template> + +<script> +export default { + name: "DetailView", + props: { + noAvatar: { + type: Boolean, + required: false, + }, + }, +}; +</script> + +<style scoped> +.gap { + gap: 0.5rem; +} +</style> diff --git a/aleksis/core/frontend/components/generic/ListView.vue b/aleksis/core/frontend/components/generic/ListView.vue new file mode 100644 index 0000000000000000000000000000000000000000..bc68b2dbf9f5a5dea29a792cab497ffe74931b3e --- /dev/null +++ b/aleksis/core/frontend/components/generic/ListView.vue @@ -0,0 +1,26 @@ +<template> + <detail-view no-avatar> + <template #title> + <slot name="title" /> + </template> + + <template #actions> + <slot name="actions" /> + </template> + + <slot name="filter" /> + <slot /> + </detail-view> +</template> + +<script> +import DetailView from "./DetailView.vue"; +export default { + name: "ListView", + components: { + DetailView, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/generic/MessageBox.vue b/aleksis/core/frontend/components/generic/MessageBox.vue new file mode 100644 index 0000000000000000000000000000000000000000..62e00f314a4dccbf2f0de98286944a15f4b3e6f3 --- /dev/null +++ b/aleksis/core/frontend/components/generic/MessageBox.vue @@ -0,0 +1,12 @@ +<script> +export default { + name: "MessageBox", + // Due to this component being a wrapper to a v-alert, all props of this can be used (and overridden). +}; +</script> + +<template> + <v-alert border="left" text v-bind="$attrs"> + <slot></slot> + </v-alert> +</template> diff --git a/aleksis/core/frontend/components/generic/ObjectOverview.vue b/aleksis/core/frontend/components/generic/ObjectOverview.vue new file mode 100644 index 0000000000000000000000000000000000000000..d962243e988167f266cf003fd81b01c6e41a0454 --- /dev/null +++ b/aleksis/core/frontend/components/generic/ObjectOverview.vue @@ -0,0 +1,69 @@ +<template> + <div> + <slot name="loading" v-if="$apollo.queries.object.loading"></slot> + <slot v-else-if="object" v-bind="object"></slot> + <error-page + v-else + :short-error-message-key="shortErrorMessageKey" + :long-error-message-key="longErrorMessageKey" + /> + </div> +</template> + +<script> +export default { + name: "ObjectOverview", + props: { + titleAttr: { + type: String, + required: true, + }, + query: { + type: Object, + required: true, + }, + shortErrorMessageKey: { + type: String, + required: false, + default: "network_errors.error_404", + }, + longErrorMessageKey: { + type: String, + required: false, + default: "network_errors.page_not_found", + }, + }, + methods: { + getTitleAttr(obj) { + let tmpObj = obj; + this.titleAttr.split(".").forEach((attr) => { + tmpObj = tmpObj[attr]; + }); + return tmpObj; + }, + }, + apollo: { + object() { + return { + query: this.query, + variables() { + if (this.$route.params.id) { + return { + id: this.$route.params.id, + }; + } + return {}; + }, + result({ data }) { + if (data && data.object) { + this.$root.$setPageTitle(this.getTitleAttr(data.object)); + } + }, + error() {}, + }; + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/generic/SmallContainer.vue b/aleksis/core/frontend/components/generic/SmallContainer.vue new file mode 100644 index 0000000000000000000000000000000000000000..01d198ef7ac58b7ac1cb1f630b93c50f02644a77 --- /dev/null +++ b/aleksis/core/frontend/components/generic/SmallContainer.vue @@ -0,0 +1,15 @@ +<template> + <v-row> + <v-col sm="0" md="1" lg="2" xl="3" /> + <v-col sm="12" md="10" lg="8" xl="6"> + <slot></slot> + </v-col> + <v-col sm="0" md="1" lg="2" xl="3" /> + </v-row> +</template> + +<script> +export default { + name: "SmallContainer", +}; +</script> diff --git a/aleksis/core/frontend/components/group/GroupCollection.vue b/aleksis/core/frontend/components/group/GroupCollection.vue new file mode 100644 index 0000000000000000000000000000000000000000..05e7afb25c53722e565e142b82c06c02354eb6d6 --- /dev/null +++ b/aleksis/core/frontend/components/group/GroupCollection.vue @@ -0,0 +1,35 @@ +<template> + <v-list v-if="groups.length"> + <v-list-item + v-for="group in groups" + :key="group.id" + :to="{ name: 'core.group', params: { id: group.id } }" + > + <v-list-item-content> + <v-list-item-title> + {{ group.name }} + <span v-if="group.schoolTerm && group.schoolTerm.name"> + ({{ group.schoolTerm.name }}) + </span> + </v-list-item-title> + </v-list-item-content> + </v-list-item> + </v-list> + <p v-else> + {{ $t("person.no_persons") }} + </p> +</template> + +<script> +export default { + name: "GroupList", + props: { + groups: { + type: Array, + required: true, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/notifications/NotificationItem.vue b/aleksis/core/frontend/components/notifications/NotificationItem.vue new file mode 100644 index 0000000000000000000000000000000000000000..b1dea65c167df9417803a6e7c532309acce75325 --- /dev/null +++ b/aleksis/core/frontend/components/notifications/NotificationItem.vue @@ -0,0 +1,105 @@ +<template> + <ApolloMutation + :mutation="require('./markNotificationRead.graphql')" + :variables="{ id: this.notification.id }" + > + <template #default="{ mutate, loading, error }"> + <v-list-item :input-value="!notification.read"> + <v-list-item-avatar> + <v-icon + :class=" + notification.read ? 'grey lighten-1' : 'primary white--text' + " + dark + > + mdi-{{ notification.icon.toLowerCase().replaceAll("_", "-") }} + </v-icon> + </v-list-item-avatar> + <v-list-item-content> + <v-list-item-title> + {{ notification.title }} + </v-list-item-title> + + <v-list-item-subtitle class="font-weight-regular"> + {{ notification.description }} + </v-list-item-subtitle> + + <v-list-item-subtitle class="caption font-weight-regular"> + <v-chip x-small outlined>{{ notification.sender }}</v-chip> + · + <v-tooltip bottom> + <template #activator="{ on, attrs }"> + <span v-bind="attrs" v-on="on">{{ + $d( + new Date(notification.created), + dateFormat(new Date(notification.created)) + ) + }}</span> + </template> + <span>{{ $d(new Date(notification.created), "long") }}</span> + </v-tooltip> + </v-list-item-subtitle> + </v-list-item-content> + + <v-list-item-action> + <v-tooltip bottom> + <template #activator="{ on, attrs }"> + <v-btn + icon + color="secondary" + v-if="!notification.read" + @click="mutate" + v-bind="attrs" + v-on="on" + > + <v-icon>mdi-email-outline</v-icon> + </v-btn> + </template> + <span>{{ $t("notifications.mark_as_read") }}</span> + </v-tooltip> + + <v-tooltip bottom> + <template #activator="{ on, attrs }"> + <v-btn + icon + color="accent" + :href="notification.link" + v-if="notification.link" + v-bind="attrs" + v-on="on" + > + <v-icon>mdi-open-in-new</v-icon> + </v-btn> + </template> + <span>{{ $t("notifications.more_information") }}</span> + </v-tooltip> + </v-list-item-action> + </v-list-item> + </template> + </ApolloMutation> +</template> + +<script> +export default { + props: { + notification: { + type: Object, + required: true, + }, + }, + methods: { + dateFormat(date) { + let now = new Date(); + if ( + now.getFullYear() === date.getFullYear() && + now.getMonth() === date.getMonth() && + now.getDate() === date.getDate() + ) { + return "timeOnly"; + } else { + return "short"; + } + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/notifications/NotificationList.vue b/aleksis/core/frontend/components/notifications/NotificationList.vue new file mode 100644 index 0000000000000000000000000000000000000000..b64769cc6d3dacb130197a3efcea516ef3d89c83 --- /dev/null +++ b/aleksis/core/frontend/components/notifications/NotificationList.vue @@ -0,0 +1,90 @@ +<template> + <v-menu + offset-y + :close-on-content-click="false" + max-width="min(600px, 80vw)" + width="min-content" + max-height="90%" + > + <template #activator="{ on, attrs }"> + <v-btn + icon + color="primary" + v-bind="attrs" + v-on="on" + :loading="$apollo.queries.myNotifications.loading" + class="mx-2" + > + <v-icon + color="white" + v-if=" + myNotifications && + myNotifications.person && + myNotifications.person.unreadNotificationsCount > 0 + " + > + mdi-bell-badge-outline + </v-icon> + <v-icon color="white" v-else>mdi-bell-outline</v-icon> + </v-btn> + </template> + <v-skeleton-loader + v-if="$apollo.queries.myNotifications.loading" + class="mx-auto" + type="paragraph" + ></v-skeleton-loader> + <v-list v-else nav three-line dense class="overflow-y-auto"> + <template + v-if=" + myNotifications.person && + myNotifications.person.notifications && + myNotifications.person.notifications.length + " + > + <v-subheader>{{ $t("notifications.notifications") }}</v-subheader> + <template v-for="notification in myNotifications.person.notifications"> + <NotificationItem + :key="notification.id" + :notification="notification" + /> + <v-divider + v-if=" + notification !== + myNotifications.person.notifications[ + myNotifications.person.notifications.length - 1 + ] + " + :key="notification.id + '-divider'" + ></v-divider> + </template> + </template> + <template v-else> + <v-list-item> + <div class="d-flex justify-center align-center flex-column"> + <div class="mb-4"> + <v-icon large color="primary">mdi-bell-off-outline</v-icon> + </div> + <div>{{ $t("notifications.no_notifications") }}</div> + </div> + </v-list-item> + </template> + </v-list> + </v-menu> +</template> + +<script> +import NotificationItem from "./NotificationItem.vue"; +import gqlMyNotifications from "./myNotifications.graphql"; + +export default { + components: { + NotificationItem, + }, + apollo: { + myNotifications: { + query: gqlMyNotifications, + pollInterval: 1000, + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/notifications/markNotificationRead.graphql b/aleksis/core/frontend/components/notifications/markNotificationRead.graphql new file mode 100644 index 0000000000000000000000000000000000000000..8cc7bed4325857b3407701900a356150d3614b68 --- /dev/null +++ b/aleksis/core/frontend/components/notifications/markNotificationRead.graphql @@ -0,0 +1,8 @@ +mutation ($id: ID!) { + markNotificationRead(id: $id) { + notification { + id + read + } + } +} diff --git a/aleksis/core/frontend/components/notifications/myNotifications.graphql b/aleksis/core/frontend/components/notifications/myNotifications.graphql new file mode 100644 index 0000000000000000000000000000000000000000..b8287ea2f50664f556d82bdb58e4b508c7ece1d4 --- /dev/null +++ b/aleksis/core/frontend/components/notifications/myNotifications.graphql @@ -0,0 +1,17 @@ +{ + myNotifications: whoAmI { + person { + unreadNotificationsCount + notifications { + id + title + description + link + icon + created + sender + read + } + } + } +} diff --git a/aleksis/core/frontend/components/pdf/DownloadPDF.vue b/aleksis/core/frontend/components/pdf/DownloadPDF.vue new file mode 100644 index 0000000000000000000000000000000000000000..b8c2089042c6b2d684b10aff5ab85710111d7eef --- /dev/null +++ b/aleksis/core/frontend/components/pdf/DownloadPDF.vue @@ -0,0 +1,46 @@ +<template> + <small-container> + <v-card> + <v-card-title v-if="pdf">{{ $t("download_pdf.title") }}</v-card-title> + <v-card-text v-if="pdf" class="body-1"> + {{ $t("download_pdf.notice") }} + </v-card-text> + <v-card-actions v-if="pdf"> + <v-btn color="primary" text :href="pdf.file.url" download> + <v-icon left>mdi-download</v-icon> + {{ $t("download_pdf.download") }} + </v-btn> + </v-card-actions> + <v-skeleton-loader + type="article" + v-if="$apollo.queries.pdf.loading" + ></v-skeleton-loader> + </v-card> + </small-container> +</template> + +<script> +import gqlPdf from "./pdf.graphql"; + +export default { + name: "DownloadPDF", + apollo: { + pdf: { + query: gqlPdf, + variables() { + return { + id: this.$route.params.id, + }; + }, + }, + }, + watch: { + pdf(value) { + // Automatic redirect + if (value) { + window.location.href = value.file.url; + } + }, + }, +}; +</script> diff --git a/aleksis/core/frontend/components/pdf/pdf.graphql b/aleksis/core/frontend/components/pdf/pdf.graphql new file mode 100644 index 0000000000000000000000000000000000000000..aac3228d75c3c77ab131500b5e0d5e2ae1b8f503 --- /dev/null +++ b/aleksis/core/frontend/components/pdf/pdf.graphql @@ -0,0 +1,7 @@ +query ($id: ID!) { + pdf: pdfById(id: $id) { + file { + url + } + } +} diff --git a/aleksis/core/frontend/components/person/AdditionalImage.vue b/aleksis/core/frontend/components/person/AdditionalImage.vue new file mode 100644 index 0000000000000000000000000000000000000000..cdf7fdd6528cb7a669d8010fca491465d3e33957 --- /dev/null +++ b/aleksis/core/frontend/components/person/AdditionalImage.vue @@ -0,0 +1,60 @@ +<template> + <v-dialog v-model="popup" max-width="fit-content" v-if="src"> + <template #activator="{ on, attrs }"> + <v-card v-bind="attrs" v-on="on"> + <v-img + :src="src" + :alt="$t('person.additional_image')" + class="white--text align-end" + gradient="to bottom, rgba(0,0,0,.1), rgba(0,0,0,.5)" + > + <v-card-title>{{ $t("person.additional_image") }}</v-card-title> + </v-img> + </v-card> + </template> + <v-sheet + class="d-flex justify-center align-center flex-column text-center transparent" + > + <v-img + :src="src" + :alt="$t('person.additional_image')" + width="80vmin" + max-height="80vmin" + /> + </v-sheet> + </v-dialog> + <v-card v-else> + <v-list> + <v-list-item> + <v-list-item-icon> + <v-icon>mdi-image-off-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ $t("person.no_additional_image") }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + </v-list> + </v-card> +</template> + +<script> +export default { + name: "AdditionalImage", + props: { + src: { + required: true, + validator: (p) => { + return typeof p === "string" || p === null; + }, + }, + }, + data: () => ({ + popup: false, + }), +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/AvatarContent.vue b/aleksis/core/frontend/components/person/AvatarContent.vue new file mode 100644 index 0000000000000000000000000000000000000000..db9ab41d7588bfeef5029d3fb65d80e377003db8 --- /dev/null +++ b/aleksis/core/frontend/components/person/AvatarContent.vue @@ -0,0 +1,56 @@ +<template> + <div class="fullsize"> + <template v-if="$apollo.queries.person.loading"> + <v-row class="fill-height ma-0" align="center" justify="center"> + <v-progress-circular + indeterminate + color="grey lighten-5" + ></v-progress-circular> + </v-row> + </template> + <v-img + v-if="person && person.image" + :src="person.image" + :alt="$t('person.avatar')" + max-width="100%" + max-height="100%" + :contain="contain" + class="fullsize" + /> + <v-icon class="grey lighten-1" dark v-else>mdi-folder</v-icon> + </div> +</template> + +<script> +import gqlAvatarContent from "./avatarContent.graphql"; +export default { + name: "AvatarContent", + props: { + id: { + type: String, + required: false, + default: "", + }, + contain: { + type: Boolean, + required: false, + default: false, + }, + }, + apollo: { + person: { + query: gqlAvatarContent, + variables() { + return { + id: this.id, + }; + }, + skip() { + return !this.id; + }, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/PersonActions.vue b/aleksis/core/frontend/components/person/PersonActions.vue new file mode 100644 index 0000000000000000000000000000000000000000..f6368d4e37997ad2cd0d982dce91cd7f4cc11002 --- /dev/null +++ b/aleksis/core/frontend/components/person/PersonActions.vue @@ -0,0 +1,115 @@ +<template> + <div> + <v-skeleton-loader v-if="$apollo.queries.person.loading" type="actions" /> + <template v-else-if="person && person.id"> + <v-btn + v-if="person.canEditPerson" + color="primary" + :to="{ name: 'core.editPerson', params: { id: person.id } }" + > + <v-icon left>$edit</v-icon> + {{ $t("actions.edit") }} + </v-btn> + <v-btn + v-if="person.canChangePersonPreferences" + color="secondary" + outlined + text + :to="{ + name: 'core.preferencesPersonByPk', + params: { pk: person.id }, + }" + > + <v-icon left>$preferences</v-icon> + {{ $t("preferences.person.change_preferences") }} + </v-btn> + + <button-menu + v-if=" + person.canImpersonatePerson || + person.canInvitePerson || + person.canDeletePerson + " + > + <v-list-item + v-if="person.canImpersonatePerson" + :to="{ + name: 'impersonate.impersonateByUserPk', + params: { uid: person.userid }, + query: { next: $route.path }, + }" + > + <v-list-item-icon> + <v-icon>mdi-account-box-outline</v-icon> + </v-list-item-icon> + <v-list-item-content> + <v-list-item-title> + {{ $t("person.impersonation.impersonate") }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + + <v-list-item + v-if="person.canInvitePerson" + :to="{ + name: 'core.invitePerson', + params: { id: person.id }, + }" + > + <v-list-item-icon> + <v-icon>mdi-account-plus-outline</v-icon> + </v-list-item-icon> + <v-list-item-content> + <v-list-item-title> + {{ $t("person.invite") }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + + <v-list-item + v-if="person.canDeletePerson" + :to="{ + name: 'core.deletePerson', + params: { id: person.id }, + }" + class="error--text" + > + <v-list-item-icon> + <v-icon color="error">mdi-delete</v-icon> + </v-list-item-icon> + <v-list-item-content> + <v-list-item-title> + {{ $t("person.delete") }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + </button-menu> + </template> + </div> +</template> + +<script> +import gqlPersonActions from "./personActions.graphql"; + +export default { + name: "PersonActions", + props: { + id: { + type: String, + required: true, + }, + }, + apollo: { + person: { + query: gqlPersonActions, + variables() { + return { + id: this.id, + }; + }, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/PersonAvatarClickbox.vue b/aleksis/core/frontend/components/person/PersonAvatarClickbox.vue new file mode 100644 index 0000000000000000000000000000000000000000..1c9581a5cde65f3aeae0a038f313197e755bbc33 --- /dev/null +++ b/aleksis/core/frontend/components/person/PersonAvatarClickbox.vue @@ -0,0 +1,31 @@ +<template> + <avatar-clickbox> + <template #activator> + <avatar-content :id="id" class="rounded-circle" /> + </template> + <avatar-content :id="id" contain /> + </avatar-clickbox> +</template> + +<script> +import AvatarContent from "./AvatarContent.vue"; + +export default { + name: "PersonAvatarClickBox", + components: { + AvatarContent, + }, + data: () => ({ + overlay: false, + }), + props: { + id: { + type: String, + required: false, + default: "", + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/PersonCollection.vue b/aleksis/core/frontend/components/person/PersonCollection.vue new file mode 100644 index 0000000000000000000000000000000000000000..ad0e4ddad79be7becf6215d531bfdd211bdd9088 --- /dev/null +++ b/aleksis/core/frontend/components/person/PersonCollection.vue @@ -0,0 +1,37 @@ +<template> + <v-list v-if="persons.length"> + <v-list-item + v-for="person in persons" + :key="person.id" + :to="{ name: 'core.personById', params: { id: person.id } }" + > + <v-list-item-avatar> + <avatar-content :id="person.id" /> + </v-list-item-avatar> + + <v-list-item-content> + <v-list-item-title>{{ person.fullName }}</v-list-item-title> + </v-list-item-content> + </v-list-item> + </v-list> + <p v-else> + {{ $t("person.no_persons") }} + </p> +</template> + +<script> +import AvatarContent from "./AvatarContent.vue"; + +export default { + name: "PersonList", + components: { AvatarContent }, + props: { + persons: { + type: Array, + required: true, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/PersonOverview.vue b/aleksis/core/frontend/components/person/PersonOverview.vue new file mode 100644 index 0000000000000000000000000000000000000000..2bddfe2cba739e4f21d09cb265dcbfe5ee4cfdfe --- /dev/null +++ b/aleksis/core/frontend/components/person/PersonOverview.vue @@ -0,0 +1,230 @@ +<template> + <object-overview :query="query" title-attr="fullName"> + <template #loading> + <v-skeleton-loader type="article" /> + + <v-row> + <v-col cols="12" lg="4" v-for="idx in 3" :key="idx"> + <v-skeleton-loader type="card" /> + </v-col> + </v-row> + </template> + <template #default="person"> + <detail-view> + <template #avatarContent> + <person-avatar-clickbox :id="id" /> + </template> + + <template #title> + {{ person.firstName }} {{ person.lastName }} + </template> + + <template #subtitle> + {{ person.username }} + </template> + + <template #actions="{ classes }"> + <person-actions :class="classes" :id="person.id" /> + </template> + + <div class="text-center my-5" v-text="person.description"></div> + + <v-row> + <v-col cols="12" lg="4"> + <v-card class="mb-6"> + <v-card-title>{{ $t("person.details") }}</v-card-title> + + <v-list two-line> + <v-list-item> + <v-list-item-icon> + <v-icon> mdi-account-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ person.firstName }} + {{ person.additionalName }} + {{ person.lastName }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset /> + + <v-list-item> + <v-list-item-icon> + <v-icon> mdi-human-non-binary</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ person.sex || "–" }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset /> + + <v-list-item> + <v-list-item-icon> + <v-icon> mdi-map-marker-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title + >{{ person.street || "–" }} + {{ person.housenumber }} + </v-list-item-title> + <v-list-item-subtitle + >{{ person.postalCode }} + {{ person.place }} + </v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + <v-divider inset /> + + <v-list-item + :href="person.phoneNumber ? 'tel:' + person.phoneNumber : ''" + > + <v-list-item-icon> + <v-icon> mdi-phone-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ person.phoneNumber || "–" }} + </v-list-item-title> + <v-list-item-subtitle> + {{ $t("person.home") }} + </v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + + <v-list-item + :href=" + person.mobileNumber ? 'tel:' + person.mobileNumber : '' + " + > + <v-list-item-action></v-list-item-action> + + <v-list-item-content> + <v-list-item-title> + {{ person.mobileNumber || "–" }} + </v-list-item-title> + <v-list-item-subtitle> + {{ $t("person.mobile") }} + </v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + <v-divider inset /> + + <v-list-item + :href="person.email ? 'mailto:' + person.email : ''" + > + <v-list-item-icon> + <v-icon>mdi-email-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title> + {{ person.email || "–" }} + </v-list-item-title> + </v-list-item-content> + </v-list-item> + <v-divider inset /> + + <v-list-item> + <v-list-item-icon> + <v-icon> mdi-cake-variant-outline</v-icon> + </v-list-item-icon> + + <v-list-item-content> + <v-list-item-title + >{{ + !!person.dateOfBirth + ? $d(new Date(person.dateOfBirth), "short") + : "–" + }} + </v-list-item-title> + <v-list-item-subtitle + >{{ person.placeOfBirth }} + </v-list-item-subtitle> + </v-list-item-content> + </v-list-item> + </v-list> + </v-card> + + <additional-image :src="person.secondaryImageUrl" /> + </v-col> + + <v-col + cols="12" + md="6" + lg="4" + v-if="person.children.length || person.guardians.length" + > + <v-card v-if="person.children.length" class="mb-6"> + <v-card-title>{{ $t("person.children") }}</v-card-title> + <person-collection :persons="person.children" /> + </v-card> + <v-card v-if="person.guardians.length"> + <v-card-title>{{ $t("person.guardians") }}</v-card-title> + <person-collection :persons="person.guardians" /> + </v-card> + </v-col> + + <v-col + cols="12" + md="6" + lg="4" + v-if="person.memberOf.length || person.ownerOf.length" + > + <v-card v-if="person.memberOf.length" class="mb-6"> + <v-card-title>{{ $t("group.title_plural") }}</v-card-title> + <group-collection :groups="person.memberOf" /> + </v-card> + <v-card v-if="person.ownerOf.length"> + <v-card-title>{{ $t("group.ownership") }}</v-card-title> + <group-collection :groups="person.ownerOf" /> + </v-card> + </v-col> + </v-row> + </detail-view> + </template> + </object-overview> +</template> + +<script> +import AdditionalImage from "./AdditionalImage.vue"; +import GroupCollection from "../group/GroupCollection.vue"; +import ObjectOverview from "../generic/ObjectOverview.vue"; +import PersonActions from "./PersonActions.vue"; +import PersonAvatarClickbox from "./PersonAvatarClickbox.vue"; +import PersonCollection from "./PersonCollection.vue"; + +import gqlPersonOverview from "./personOverview.graphql"; + +export default { + name: "PersonOverview", + components: { + AdditionalImage, + GroupCollection, + ObjectOverview, + PersonActions, + PersonAvatarClickbox, + PersonCollection, + }, + data() { + return { + query: gqlPersonOverview, + }; + }, + props: { + id: { + type: String, + required: false, + default: null, + }, + }, +}; +</script> + +<style scoped></style> diff --git a/aleksis/core/frontend/components/person/avatarContent.graphql b/aleksis/core/frontend/components/person/avatarContent.graphql new file mode 100644 index 0000000000000000000000000000000000000000..19e23a33dcbfb3e2350cc18070d88871c5758bdd --- /dev/null +++ b/aleksis/core/frontend/components/person/avatarContent.graphql @@ -0,0 +1,6 @@ +query avatarContent($id: ID) { + person: personByIdOrMe(id: $id) { + id + image: avatarContentUrl + } +} diff --git a/aleksis/core/frontend/components/person/personActions.graphql b/aleksis/core/frontend/components/person/personActions.graphql new file mode 100644 index 0000000000000000000000000000000000000000..8bc316c3b567b0bf7673caba848c6b7186f85a74 --- /dev/null +++ b/aleksis/core/frontend/components/person/personActions.graphql @@ -0,0 +1,11 @@ +query actions($id: ID!) { + person: personById(id: $id) { + id + userid + canEditPerson + canDeletePerson + canChangePersonPreferences + canInvitePerson + canImpersonatePerson + } +} diff --git a/aleksis/core/frontend/components/person/personOverview.graphql b/aleksis/core/frontend/components/person/personOverview.graphql new file mode 100644 index 0000000000000000000000000000000000000000..8173f6a7d7d74842a267c4d5c0a47d7d3ed97634 --- /dev/null +++ b/aleksis/core/frontend/components/person/personOverview.graphql @@ -0,0 +1,48 @@ +query person($id: ID) { + object: personByIdOrMe(id: $id) { + id + username + firstName + additionalName + lastName + fullName + + description + + sex + street + housenumber + postalCode + place + phoneNumber + mobileNumber + email + dateOfBirth + placeOfBirth + + secondaryImageUrl + + guardians { + id + fullName + } + children { + id + fullName + } + memberOf { + id + name + schoolTerm { + name + } + } + ownerOf { + id + name + schoolTerm { + name + } + } + } +} diff --git a/aleksis/core/frontend/css/global.scss b/aleksis/core/frontend/css/global.scss new file mode 100644 index 0000000000000000000000000000000000000000..9998223dac0b97c1119c9ab8e33c9e460388b53d --- /dev/null +++ b/aleksis/core/frontend/css/global.scss @@ -0,0 +1,37 @@ +////////////// +// HEADINGS // +////////////// + +p, +h1, +h2, +h3, +h4, +h5, +h6, +.card-title { + overflow-wrap: break-word; + hyphens: auto; +} + +///////////// +// HELPERS // +///////////// + +[v-cloak] { + display: none; +} + +.v-card--reveal { + bottom: 0; + opacity: 1 !important; + position: absolute; + width: 100%; + height: 100%; + overflow-y: scroll; +} + +.fullsize { + width: 100%; + height: 100%; +} diff --git a/aleksis/core/frontend/index.js b/aleksis/core/frontend/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ef66ecf6576ed1d7d4581639a65b5607c7a75dc5 --- /dev/null +++ b/aleksis/core/frontend/index.js @@ -0,0 +1,65 @@ +/* + * Main entrypoint of AlekSIS0-Core. + * + * This script sets up all necessary Vue plugins and defines the Vue app. + */ + +import Vue from "vue"; +import Vuetify from "@/vuetify"; +import VueI18n from "@/vue-i18n"; +import VueRouter from "@/vue-router"; +import VueApollo from "@/vue-apollo"; + +import AleksisVue from "./plugins/aleksis.js"; + +console.info("🎒 Welcome to AlekSIS®, the Free School Information System!"); +console.info( + "AlekSIS® is Free Software, licenced under the EUPL, version 1.2 or later, by Teckids e.V. (Bonn, Germany)" +); + +// Install the AleksisVue plugin first and let it do early setup +Vue.use(AleksisVue); +Vue.$registerGlobalComponents(); + +// Third-party plugins +Vue.use(Vuetify); +Vue.use(VueI18n); +Vue.use(VueRouter); +Vue.use(VueApollo); + +// All of these imports yield config objects to be passed to the plugin constructors +import vuetifyOpts from "./app/vuetify.js"; +import i18nOpts from "./app/i18n.js"; +import routerOpts from "./app/router.js"; +import apolloOpts from "./app/apollo.js"; + +const i18n = new VueI18n(i18nOpts); +const vuetify = new Vuetify(vuetifyOpts); +const router = new VueRouter(routerOpts); +const apolloProvider = new VueApollo(apolloOpts); + +// Let AlekSIS plugin initialise Sentry +Vue.$configureSentry(router); + +// Parent component rendering the UI and all features outside the specific pages +import App from "./components/app/App.vue"; + +const app = new Vue({ + el: "#app", + apolloProvider, + vuetify: vuetify, + render: (h) => h(App), + data: () => ({ + showCacheAlert: false, + contentLoading: false, + offline: false, + backgroundActive: true, + snackbarItems: [], + }), + router, + i18n, +}); + +// Late setup for some plugins handed off to out ALeksisVue plugin +app.$loadAppMessages(); +app.$setupNavigationGuards(); diff --git a/aleksis/core/frontend/messages/de.json b/aleksis/core/frontend/messages/de.json new file mode 100644 index 0000000000000000000000000000000000000000..809b16585192d117427ae880bbfc90e18e4142c4 --- /dev/null +++ b/aleksis/core/frontend/messages/de.json @@ -0,0 +1,200 @@ +{ + "about": { + "about_aleksis": "Über AlekSIS®", + "about_aleksis_1": "Diese Plattform wird mit AlekSIS®, einem webbasierten Schulinformationssystem (SIS), welches für die Verwaltung und/oder Veröffentlichung von Bildungseinrichtungen verwendet werden kann. AlekSIS ist freie Software und kann von jedem benutzt werden.", + "about_aleksis_2": "AlekSIS® ist eine eingetragene Wortmarke des Open-Source-Projektes AlekSIS, vertreten durch den Teckids e.V.", + "free_open_source_licence": "Freie/Open Source Lizenz", + "free_software": "Freie Software", + "full_licence_text": "Kompletter Lizenztext", + "licence_consists_of": "Die Lizenz besteht aus", + "licence_information": "Lizenzinformationen", + "licence_information_1": "Der Core und die offiziellen Apps von AlekSIS sind unter der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der jeweiligen App weiter unten auf dieser Seite. Die Lizenzen sind wie folgt markiert:", + "licence_type": "Lizenztyp", + "licenced_under": "Lizensiert unter", + "more_information_eupl": "Weitere Informationen über die EUPL", + "open_source": "Open Source", + "other_licence": "Andere Lizenz", + "page_title": "Über AlekSIS®", + "proprietary": "Proprietär", + "show_copyright": "Copyright anzeigen", + "source_code": "Quellcode", + "website_of_aleksis": "Website von AlekSIS" + }, + "accounts": { + "change_password": { + "menu_title": "Passwort ändern" + }, + "invitation": { + "accept_invitation": { + "menu_title": "Einladung akzeptieren" + }, + "invite_person": { + "menu_title": "Person einladen" + } + }, + "login": { + "menu_title": "Anmelden" + }, + "logout": { + "menu_title": "Abmelden" + }, + "signup": { + "menu_title": "Registrieren" + }, + "social_connections": { + "menu_title": "Drittanbieter-Konten" + }, + "two_factor": { + "menu_title": "2FA" + } + }, + "actions": { + "back": "Zurück", + "close": "Schließen", + "edit": "Bearbeiten", + "search": "Suchen" + }, + "administration": { + "backend_admin": { + "menu_title": "Backend-Administration" + }, + "menu_title": "Administration", + "system_status": { + "menu_title": "System-Status" + } + }, + "alerts": { + "page_cached": "Diese Seite enthält vielleicht veraltete Informationen, da es keine Internetverbindung gibt." + }, + "announcement": { + "menu_title": "Ankündigungen", + "title": "Ankündigung", + "title_plural": "Ankündigungen" + }, + "base": { + "about_aleksis": "Über AlekSIS® — The Free School Information System", + "imprint": "Impressum", + "logo": "Logo", + "no_permission": "Sie haben nicht die nötigen Berechtigungen, um diese Seite aufzurufen. Bitte loggen Sie sich mit einem anderen Account ein.", + "person_is_dummy": "Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb wurde Ihr Konto mit einer Dummyperson verknüpft.", + "privacy_policy": "Datenschutzerklärung", + "user_not_linked_to_person": "Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an die Verwaltenden von AlekSIS an Ihrer Schule." + }, + "celery_progress": { + "error_message": "Der Vorgang konnte nicht erfolgreich beendet werden.", + "progress_title": "Wird geladen ...", + "running_tasks": "1 laufende Aufgabe | {number} laufende Aufgaben", + "success_message": "Der Vorgang wurde erfolgreich beendet." + }, + "dashboard": { + "dashboard_widget": { + "menu_title": "Dashboard-Widgets", + "title": "Dashboard-Widget", + "title_plural": "Dashboard-Widgets" + }, + "menu_title": "Dashboard" + }, + "data_check": { + "menu_title": "Datenprüfungen" + }, + "download_pdf": { + "download": "Herunterladen", + "notice": "Wenn der Download nicht automatisch beginnt, klicken Sie bitte auf den Button unten.", + "title": "PDF-Datei wird heruntergeladen ..." + }, + "graphql": { + "snackbar_error_message": "Beim Abrufen der Seitendaten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut." + }, + "group": { + "additional_field": { + "menu_title": "Zusätzliche Felder", + "title": "Zusätzliches Feld", + "title_plural": "Zusätzliche Felder" + }, + "group_type": { + "menu_title": "Gruppentypen", + "title": "Gruppentyp", + "title_plural": "Gruppentypen" + }, + "groups_and_child_groups": "Gruppen und Kindgruppen", + "menu_title": "Gruppen", + "ownership": "Gruppen-Eigentümerschaft", + "title": "Gruppe", + "title_plural": "Gruppen" + }, + "ical_feed": { + "menu_title": "Kalender-Feeds" + }, + "network_errors": { + "error_404": "404", + "offline_notification": "Sie sind offline. Einige Funktionen werden nicht funktionieren und einige Daten werden nicht aktuell sein.", + "page_not_found": "Die aufgerufene Seite oder Ressource konnte nicht gefunden werden.", + "snackbar_error_message": "Es ist ein Netzwerkfehler aufgetreten. Bitte versuchen Sie es erneut.", + "back_to_start": "Zurück zur Startseite" + }, + "notifications": { + "mark_as_read": "Als gelesen markieren", + "more_information": "Mehr Informationen", + "no_notifications": "Sie haben keine neuen Benachrichtigungen.", + "notifications": "Benachrichtigungen" + }, + "oauth": { + "application": { + "menu_title": "OAuth-Anwendungen", + "title": "OAuth-Anwendung", + "title_plural": "OAuth-Anwendungen" + }, + "authorized_token": { + "menu_title": "Autorisierte Anwendungen" + } + }, + "people": "Leute", + "permissions": { + "manage": { + "menu_title": "Berechtigungen verwalten" + } + }, + "person": { + "account_menu_title": "Konto", + "additional_image": "Weiteres Bild", + "avatar": "Avatar", + "children": "Kinder", + "delete": "Löschen", + "details": "Kontaktdaten", + "guardians": "Erziehungsberechtigte / Eltern", + "home": "Festnetz", + "impersonation": { + "impersonate": "Verkleiden", + "impersonating": "Verkleidet als", + "stop": "Verkleidung beenden" + }, + "invite": "Einladen", + "logged_in_as": "Angemeldet als", + "menu_title": "Personen", + "mobile": "Handy", + "no_additional_image": "Diese Person hat kein weiteres Bild hochgeladen", + "no_persons": "Keine Personen", + "page_title": "Person", + "title": "Person", + "title_plural": "Personen" + }, + "preferences": { + "person": { + "change_preferences": "Einstellungen", + "menu_title": "Einstellungen" + }, + "site": { + "menu_title": "Konfiguration" + } + }, + "school_term": { + "menu_title": "Schuljahre", + "title": "Schuljahr", + "title_plural": "Schuljahre" + }, + "service_worker": { + "dismiss": "Verwerfen", + "new_version_available": "Es ist eine neue Version der App verfügbar", + "update": "Aktualisieren" + } +} diff --git a/aleksis/core/frontend/messages/en.json b/aleksis/core/frontend/messages/en.json new file mode 100644 index 0000000000000000000000000000000000000000..13b8604861bdafec310801a15bb84a7b1babdccf --- /dev/null +++ b/aleksis/core/frontend/messages/en.json @@ -0,0 +1,200 @@ +{ + "about": { + "about_aleksis": "About AlekSIS®", + "page_title": "About AlekSIS®", + "about_aleksis_1": "This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and can be used by anyone.", + "about_aleksis_2": "AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.", + "free_open_source_licence": "Free/Open Source Licence", + "free_software": "Free Software", + "full_licence_text": "Full Licence Text", + "licence_consists_of": "The licence consists of", + "licence_information": "Licence Information", + "licence_information_1": "The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence information from third-party apps, if installed, refer to the respective components below. The licences are marked like this:", + "licence_type": "Licence Type", + "licenced_under": "Licenced under", + "more_information_eupl": "More information about the EUPL", + "open_source": "Open Source", + "other_licence": "Other Licence", + "proprietary": "Proprietary", + "source_code": "Source Code", + "website_of_aleksis": "Website of AlekSIS", + "show_copyright": "Show copyright" + }, + "accounts": { + "change_password": { + "menu_title": "Change Password" + }, + "invitation": { + "accept_invitation": { + "menu_title": "Accept Invitation" + }, + "invite_person": { + "menu_title": "Invite Person" + } + }, + "login": { + "menu_title": "Login" + }, + "logout": { + "menu_title": "Logout" + }, + "signup": { + "menu_title": "Sign Up" + }, + "social_connections": { + "menu_title": "Third-party Accounts" + }, + "two_factor": { + "menu_title": "2FA" + } + }, + "actions": { + "back": "Back", + "search": "Search", + "edit": "Edit", + "close": "Close" + }, + "administration": { + "backend_admin": { + "menu_title": "Backend Admin" + }, + "menu_title": "Administration", + "system_status": { + "menu_title": "System Status" + } + }, + "alerts": { + "page_cached": "This page may contain outdated information since there is no internet connection." + }, + "announcement": { + "menu_title": "Announcements", + "title": "Announcement", + "title_plural": "Announcements" + }, + "base": { + "about_aleksis": "About AlekSIS® — The Free School Information System", + "imprint": "Imprint", + "person_is_dummy": "Your administrator account is not linked to any person. Therefore, a dummy person has been linked to your account.", + "privacy_policy": "Privacy Policy", + "user_not_linked_to_person": "Your user account is not linked to a person. This means you cannot access any school-related information. Please contact the managers of AlekSIS at your school.", + "no_permission": "You have no permission to view this page. Please login with an other account.", + "logo": "Logo" + }, + "celery_progress": { + "error_message": "The operation couldn't be finished successfully.", + "progress_title": "Loading ...", + "running_tasks": "1 running task | {number} running tasks", + "success_message": "The operation has been finished successfully." + }, + "download_pdf": { + "title": "Downloading PDF file ...", + "download": "Download", + "notice": "If the download does not start automatically, please click the button below." + }, + "dashboard": { + "dashboard_widget": { + "menu_title": "Dashboard Widgets", + "title": "Dashboard Widget", + "title_plural": "Dashboard Widgets" + }, + "menu_title": "Dashboard" + }, + "data_check": { + "menu_title": "Data Checks" + }, + "group": { + "additional_field": { + "menu_title": "Additional Fields", + "title": "Additional Field", + "title_plural": "Additional Fields" + }, + "group_type": { + "menu_title": "Group Types", + "title": "Group Type", + "title_plural": "Group Types" + }, + "groups_and_child_groups": "Groups and Child Groups", + "menu_title": "Groups", + "title": "Group", + "title_plural": "Groups", + "ownership": "Group ownership" + }, + "ical_feed": { + "menu_title": "Calendar Feeds" + }, + "notifications": { + "mark_as_read": "Mark as read", + "more_information": "More information", + "no_notifications": "You have no new notifications.", + "notifications": "Notifications" + }, + "oauth": { + "application": { + "menu_title": "OAuth Applications", + "title": "OAuth Application", + "title_plural": "OAuth Applications" + }, + "authorized_token": { + "menu_title": "Authorized Applications" + } + }, + "people": "People", + "permissions": { + "manage": { + "menu_title": "Manage Permissions" + } + }, + "person": { + "account_menu_title": "Account", + "avatar": "Avatar", + "additional_image": "Additional Image", + "no_additional_image": "The person didn't upload an additional Image", + "logged_in_as": "Logged in as", + "menu_title": "Persons", + "page_title": "Person", + "title": "Person", + "title_plural": "Persons", + "mobile": "mobile phone", + "home": "home phone", + "details": "Contact details", + "children": "Children", + "guardians": "Guardians / Parents", + "no_persons": "No Persons", + "delete": "Delete", + "impersonation": { + "impersonate": "Impersonate", + "stop": "Stop Impersonation", + "impersonating": "Impersonating" + }, + "invite": "Invite" + }, + "preferences": { + "person": { + "menu_title": "Preferences", + "change_preferences": "Preferences" + }, + "site": { + "menu_title": "Configuration" + } + }, + "school_term": { + "menu_title": "School Terms", + "title": "School Term", + "title_plural": "School Terms" + }, + "network_errors": { + "error_404": "404", + "page_not_found": "The requested page or resource could not be found.", + "back_to_start": "Back to home page", + "snackbar_error_message": "A network error occurred. Please try again.", + "offline_notification": "You are offline. Some features may not work and some data may not be up to date." + }, + "service_worker": { + "new_version_available": "A new version of the app is available", + "update": "Update", + "dismiss": "Dismiss" + }, + "graphql": { + "snackbar_error_message": "There was an error retrieving the page data. Please try again." + } +} diff --git a/aleksis/core/frontend/messages/uk.json b/aleksis/core/frontend/messages/uk.json new file mode 100644 index 0000000000000000000000000000000000000000..3eecebdb3c98b4dc9d926407efed583919087ee9 --- /dev/null +++ b/aleksis/core/frontend/messages/uk.json @@ -0,0 +1,164 @@ +{ + "about": { + "about_aleksis": "Щодо AlekSIS®", + "about_aleksis_1": "Ð¦Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° базуєтьÑÑ Ð½Ð° AlekSIS®, веб-інÑтрументі інформаційної ÑиÑтеми Ð´Ð»Ñ Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ (SIS) за допомогою Ñкої\n можна керувати та/або виÑвітлювати організаційні елементи навчальних закладів. AlekSIS - безплатне ПЗ Ñ– ним може кориÑтуватиÑÑ Ð±ÑƒÐ´ÑŒ-хто.", + "about_aleksis_2": "AlekSIS® – зареєÑтрована торгова марка проекту з відкритим програмним кодом AlekSIS, що предÑтавлена Teckids e.V.", + "free_open_source_licence": "Безкоштовна або Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¾Ð³Ð¾ Коду (Open Source)", + "full_licence_text": "Повний текÑÑ‚ ліцензії", + "licence_information": "Ліцензійна інформаціÑ", + "licence_information_1": "Ядро та офіційні додатки AlekSIS ліцензовані EUPL, верÑÑ–Ñ— 1.2 та новіше. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—\n щодо додатків третіх Ñторін, Ñкщо такі вÑтановлені, перейдіть до відповідних компонентів нижче. Ці ліцензії мають таку позначку:", + "more_information_eupl": "Більше інформації щодо EUPL", + "other_licence": "Інша ліцензіÑ", + "page_title": "Щодо AlekSIS®", + "source_code": "Програмний код", + "website_of_aleksis": "Веб-Ñайт AlekSIS" + }, + "accounts": { + "change_password": { + "menu_title": "Змінити пароль" + }, + "invitation": { + "accept_invitation": { + "menu_title": "ПрийнÑти запрошеннÑ" + }, + "invite_person": { + "menu_title": "ЗапроÑити оÑобу" + } + }, + "login": { + "menu_title": "Увійти" + }, + "logout": { + "menu_title": "Вийти" + }, + "signup": { + "menu_title": "ЗареєÑтруватиÑÑ" + }, + "social_connections": { + "menu_title": "Обліковки третіх Ñторін" + }, + "two_factor": { + "menu_title": "2FA" + } + }, + "actions": { + "back": "Ðазад", + "close": "Закрити", + "edit": "Редагувати", + "search": "Пошук" + }, + "administration": { + "backend_admin": { + "menu_title": "ÐдмініÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐºÐµÐ½Ð´Ñƒ" + }, + "system_status": { + "menu_title": "Стан ÑиÑтеми" + } + }, + "alerts": { + "page_cached": "Через відÑутніÑть інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ†Ñ Ñторінка може міÑтити заÑтарілу інформацію." + }, + "announcement": { + "menu_title": "ОголошеннÑ", + "title": "ОголошеннÑ", + "title_plural": "ОголошеннÑ" + }, + "base": { + "about_aleksis": "Щодо AlekSIS® — The Free School Information System", + "imprint": "Відбиток", + "logo": "Логотип", + "no_permission": "Ви не маєте дозволу на переглÑд цієї Ñторінки. Увійдіть, будь лаÑка, з іншим обліковим запиÑом.", + "person_is_dummy": "Ваш адмініÑтративний обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ поєднаний з жодною оÑобою. Через це до Вашого облікового запиÑу приєднана фейкова оÑоба.", + "privacy_policy": "Політика приватноÑті", + "user_not_linked_to_person": "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ пов'Ñзаний з фізоÑобою. Це означає, що Ви не маєте жодного доÑтупу до навчальної інформації. ЗвернітьÑÑ, будь лаÑка, до адмініÑтраторів AlekSIS у Вашому навчальному закладі." + }, + "dashboard": { + "dashboard_widget": { + "menu_title": "Віджети інформпанелі", + "title": "Віджет інформпанелі", + "title_plural": "Віджети інформпанелі" + }, + "menu_title": "Інформпанель" + }, + "data_check": { + "menu_title": "Перевірки даних" + }, + "download_pdf": { + "download": "Звантажити" + }, + "group": { + "additional_field": { + "menu_title": "Додаткові полÑ", + "title": "Додаткові полÑ", + "title_plural": "Додаткові полÑ" + }, + "group_type": { + "menu_title": "Типи груп", + "title": "Тип групи", + "title_plural": "Типи груп" + }, + "groups_and_child_groups": "Групи та підлеглі групи", + "menu_title": "Групи", + "title": "Група", + "title_plural": "Групи" + }, + "ical_feed": { + "menu_title": "Канали календарів" + }, + "notifications": { + "more_information": "Більше інформаціЇ", + "notifications": "СповіщеннÑ" + }, + "oauth": { + "application": { + "menu_title": "Додатки OAuth2", + "title": "Додаток OAuth2", + "title_plural": "Додатки OAuth2" + }, + "authorized_token": { + "menu_title": "Ðвторизовані додатки" + } + }, + "people": "Люди", + "permissions": { + "manage": { + "menu_title": "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð°Ð¼Ð¸" + } + }, + "person": { + "account_menu_title": "Обліковий запиÑ", + "avatar": "Ðватар", + "children": "Діти", + "delete": "Видалити", + "details": "Контактні дані", + "guardians": "Опікуни / батьки", + "home": "Домашній телефон", + "impersonation": { + "impersonate": "МаÑкуваннÑ", + "stop": "Зупинити маÑкуваннÑ" + }, + "invite": "ЗапрошеннÑ", + "menu_title": "ОÑоби", + "mobile": "Мобільний телефон", + "page_title": "ОÑоба", + "title": "ОÑоба", + "title_plural": "ОÑоби" + }, + "preferences": { + "person": { + "change_preferences": "ВлаÑтивоÑті", + "menu_title": "ВлаÑтивоÑті" + }, + "site": { + "menu_title": "КонфігураціÑ" + } + }, + "school_term": { + "menu_title": "Ðавчальний рік", + "title": "Ðавчальний рік", + "title_plural": "Ðавчальний рік" + }, + "service_worker": { + "update": "Оновити" + } +} diff --git a/aleksis/core/frontend/mixins/aleksis.js b/aleksis/core/frontend/mixins/aleksis.js new file mode 100644 index 0000000000000000000000000000000000000000..036e2eac71db6304bba88e2a01c3cfbe33edca51 --- /dev/null +++ b/aleksis/core/frontend/mixins/aleksis.js @@ -0,0 +1,45 @@ +/** + * Mixin with utilities for AlekSIS view components. + */ +const aleksisMixin = { + data: () => { + return { + $_aleksis_safeTrackedEvents: new Array(), + }; + }, + methods: { + safeAddEventListener(target, event, handler) { + console.debug("Safely adding handler for %s on %o", event, target); + target.addEventListener(event, handler); + // Add to tracker so we can unregister the handler later + this.$data.$_aleksis_safeTrackedEvents.push({ + target: target, + event: event, + handler: handler, + }); + }, + }, + mounted() { + this.$root.contentLoading = false; + }, + beforeDestroy() { + // Unregister all safely added event listeners as to not leak them + for (let trackedEvent in this.$data.$_aleksis_safeTrackedEvents) { + if (trackedEvent.target) { + console.debug( + "Removing handler for %s on %o", + trackedEvent.event, + trackedEvent.target + ); + trackedEvent.target.removeEventListener( + trackedEvent.event, + trackedEvent.handler + ); + } else { + console.debug("Target already removed while removing event handler"); + } + } + }, +}; + +export default aleksisMixin; diff --git a/aleksis/core/frontend/mixins/menus.js b/aleksis/core/frontend/mixins/menus.js new file mode 100644 index 0000000000000000000000000000000000000000..8afed7f424ebf1bd4b33b316dc311f14831161fc --- /dev/null +++ b/aleksis/core/frontend/mixins/menus.js @@ -0,0 +1,135 @@ +import gqlCustomMenu from "../components/app/customMenu.graphql"; + +/** + * Vue mixin containing menu generation code. + * + * Only used by main App component, but factored out for readability. + */ +const menusMixin = { + data() { + return { + footerMenu: null, + permissionNames: [], + sideNavMenu: null, + accountMenu: null, + }; + }, + methods: { + getPermissionNames() { + let permArray = []; + + for (const route of this.$router.getRoutes()) { + if ( + route.meta && + route.meta["permission"] && + !(route.meta["permission"] in permArray) + ) { + permArray.push(route.meta["permission"]); + } + } + + this.permissionNames = permArray; + this.$apollo.queries.whoAmI.refetch(); + }, + buildMenu(routes, menuKey) { + let menu = {}; + + // Top-level entries + for (const route of routes) { + if ( + route.name && + route.meta && + route.meta[menuKey] && + !route.parent && + (route.meta.permission + ? this.checkPermission(route.meta.permission) + : true) && + (route.meta.validators + ? this.checkValidators(route.meta.validators) + : true) + ) { + let menuItem = { + ...route.meta, + name: route.name, + path: route.path, + subMenu: [], + }; + menu[menuItem.name] = menuItem; + } + } + + // Sub menu entries + for (const route of routes) { + if ( + route.name && + route.meta && + route.meta[menuKey] && + route.parent && + route.parent.name && + route.parent.name in menu && + (route.meta.permission + ? this.checkPermission(route.meta.permission) + : true) && + (route.meta.validators + ? this.checkValidators(route.meta.validators) + : true) + ) { + let menuItem = { + ...route.meta, + name: route.name, + path: route.path, + subMenu: [], + }; + menu[route.parent.name].subMenu.push(menuItem); + } + } + + return Object.values(menu); + }, + checkPermission(permissionName) { + return ( + this.whoAmI && + this.whoAmI.permissions && + this.whoAmI.permissions.find((p) => p.name === permissionName) && + this.whoAmI.permissions.find((p) => p.name === permissionName).result + ); + }, + checkValidators(validators) { + for (const validator of validators) { + if (!validator(this.whoAmI)) { + return false; + } + } + return true; + }, + buildMenus() { + this.accountMenu = this.buildMenu( + this.$router.getRoutes(), + "inAccountMenu", + this.whoAmI ? this.whoAmI.permissions : [] + ); + this.sideNavMenu = this.buildMenu( + this.$router.getRoutes(), + "inMenu", + this.whoAmI ? this.whoAmI.permissions : [] + ); + }, + }, + apollo: { + footerMenu: { + query: gqlCustomMenu, + variables() { + return { + name: "footer", + }; + }, + update: (data) => data.customMenuByName, + }, + }, + mounted() { + this.$router.onReady(this.getPermissionNames); + this.buildMenus(); + }, +}; + +export default menusMixin; diff --git a/aleksis/core/frontend/mixins/offline.js b/aleksis/core/frontend/mixins/offline.js new file mode 100644 index 0000000000000000000000000000000000000000..6b9aaeba0f3bee2c6596a69d1a3011a87aa6b901 --- /dev/null +++ b/aleksis/core/frontend/mixins/offline.js @@ -0,0 +1,72 @@ +import gqlPing from "../components/app/ping.graphql"; + +/** + * Mixin for handling of offline state / background queries. + * + * This handles three scenarios: + * - The navigator reports that it is in offline mode + * - The global offline flag was set due to network errors from queries + * - The navigator reports the page to be invisible + * + * The main goal is to save bandwidth, energy and server load in error + * conditions, or when the page is not in focus. This is achieved by a + * fallback strategy, where all background queries are stopped in offline + * state, and only a ping query is sent once the navigator reports itself + * as online and the app gets into focus. Once this ping query is successful, + * background activity is resumed. + */ +const offlineMixin = { + data() { + return { + ping: null, + }; + }, + mounted() { + this.safeAddEventListener(window, "online", () => { + console.info("Navigator changed status to online."); + this.checkOfflineState(); + }); + this.safeAddEventListener(window, "offline", () => { + console.info("Navigator changed status to offline."); + this.checkOfflineState(); + }); + this.safeAddEventListener(document, "visibilitychange", () => { + console.info("Visibility changed status to", document.visibilityState); + this.checkOfflineState(); + }); + }, + methods: { + checkOfflineState() { + if (navigator.onLine && document.visibilityState === "visible") { + console.info("Resuming background activity"); + this.$root.backgroundActive = true; + } else { + console.info("Pausing background activity"); + this.$root.backgroundActive = false; + } + }, + }, + apollo: { + ping: { + query: gqlPing, + variables: () => { + return { + payload: Date.now().toString(), + }; + }, + pollInterval: 1000, + skip: (component) => { + // We only want to run this query when background activity is on and we are reported offline + return !(component.$root.backgroundActive && component.$root.offline); + }, + }, + }, + watch: { + ping() { + console.info("Pong received, clearing offline state"); + this.$root.offline = false; + }, + }, +}; + +export default offlineMixin; diff --git a/aleksis/core/frontend/mixins/useRegisterSW.js b/aleksis/core/frontend/mixins/useRegisterSW.js new file mode 100644 index 0000000000000000000000000000000000000000..e7659fca1f28c41f0ca1ee7feb4c6aeef458e525 --- /dev/null +++ b/aleksis/core/frontend/mixins/useRegisterSW.js @@ -0,0 +1,63 @@ +/** + * Vue mixin to register the PWA service worker once the main + * component gets ready. + */ +const useRegisterSWMixin = { + name: "useRegisterSW", + data() { + return { + updateSW: undefined, + offlineReady: false, + needRefresh: false, + refreshDismissed: false, + }; + }, + async mounted() { + try { + const { registerSW } = await import("virtual:pwa-register"); + const vm = this; + this.updateSW = registerSW({ + onOfflineReady() { + vm.offlineReady = true; + console.log("PWA is offline-ready."); + }, + onNeedRefresh() { + vm.needRefresh = true; + console.log("PWA needs to be refreshed."); + }, + onRegisteredSW(swUrl, r) { + r && + setInterval(async () => { + if (!(!r.installing && navigator)) return; + + if ("connection" in navigator && !navigator.onLine) return; + + const resp = await fetch(swUrl, { + cache: "no-store", + headers: { + cache: "no-store", + "cache-control": "no-cache", + }, + }); + + if (resp?.status === 200) await r.update(); + }, 60 * 60 * 1000); + }, + onRegisterError(e) { + console.log("Error while installing PWA: " + e); + }, + }); + } catch { + console.log("PWA disabled."); + } + }, + methods: { + updateServiceWorker() { + this.offlineReady = false; + this.needRefresh = false; + this.updateSW && this.updateSW(true); + }, + }, +}; + +export default useRegisterSWMixin; diff --git a/aleksis/core/frontend/plugins/aleksis.js b/aleksis/core/frontend/plugins/aleksis.js new file mode 100644 index 0000000000000000000000000000000000000000..8c221c6d62953206b501aa7c7d949e808d2e63cd --- /dev/null +++ b/aleksis/core/frontend/plugins/aleksis.js @@ -0,0 +1,176 @@ +/* + * Plugin to collect AlekSIS-specific Vue utilities. + */ + +// aleksisAppImporter is a virtual module defined in Vite config +import { appMessages } from "aleksisAppImporter"; +import aleksisMixin from "../mixins/aleksis.js"; + +console.debug("Defining AleksisVue plugin"); +const AleksisVue = {}; + +AleksisVue.install = function (Vue) { + /* + * The browser title when the app was loaded. + * + * Thus, it is injected from Django in the vue_index template. + */ + Vue.$pageBaseTitle = document.title; + + Vue.$aleksisFrontendSettings = JSON.parse( + document.getElementById("frontend_settings").textContent + ); + + /** + * Configure Sentry if desired. + * + * It depends on Sentry settings being passed as a DOM object by Django + * in the vue_index template. + */ + Vue.$configureSentry = function (router) { + if (Vue.$aleksisFrontendSettings.sentry.enabled) { + import("../app/sentry.js").then((mod) => { + mod.default.Sentry.init({ + Vue, + dsn: Vue.$aleksisFrontendSettings.sentry.dsn, + environment: Vue.$aleksisFrontendSettings.sentry.environment, + tracesSampleRate: + Vue.$aleksisFrontendSettings.sentry.traces_sample_rate, + logError: true, + integrations: [ + new mod.default.BrowserTracing({ + routingInstrumentation: + mod.default.Sentry.vueRouterInstrumentation(router), + }), + ], + }); + }); + } + }; + + /** + * Register all global components that shall be reusable by apps. + */ + Vue.$registerGlobalComponents = function () { + Vue.component("MessageBox", () => + import("../components/generic/MessageBox.vue") + ); + Vue.component("SmallContainer", () => + import("../components/generic/SmallContainer.vue") + ); + Vue.component("BackButton", () => + import("../components/generic/BackButton.vue") + ); + Vue.component("AvatarClickbox", () => + import("../components/generic/AvatarClickbox.vue") + ); + Vue.component("DetailView", () => + import("../components/generic/DetailView.vue") + ); + Vue.component("ListView", () => + import("../components/generic/ListView.vue") + ); + Vue.component("ButtonMenu", () => + import("../components/generic/ButtonMenu.vue") + ); + Vue.component("ErrorPage", () => import("../components/app/ErrorPage.vue")); + }; + + /** + * Set the page title. + * + * This will automatically add the base title discovered at app loading time. + * + * @param {string} title Specific title to set, or null. + * @param {Object} route Route to discover title from, or null. + */ + Vue.prototype.$setPageTitle = function (title, route) { + let titleParts = []; + + if (title) { + titleParts.push(title); + } else { + if (!route) { + route = this.$route; + } + if (route.meta.titleKey) { + titleParts.push(this.$t(route.meta.titleKey)); + } + } + + titleParts.push(Vue.$pageBaseTitle); + const newTitle = titleParts.join(" – "); + console.debug(`Setting page title: ${newTitle}`); + document.title = newTitle; + }; + + /** + * Load i18n messages from all known AlekSIS apps. + */ + Vue.prototype.$loadAppMessages = function () { + for (const messages of Object.values(appMessages)) { + for (let locale in messages) { + this.$i18n.mergeLocaleMessage(locale, messages[locale]); + } + } + }; + + /** + * Invalidate state and force reload from server. + * + * Mostly useful after the user context changes by login/logout/impersonate. + */ + Vue.prototype.$invalidateState = function () { + console.info("Invalidating application state"); + + this.$apollo + .getClient() + .resetStore() + .then( + function () { + console.info("GraphQL cache cleared"); + }, + function (error) { + console.error("Could not clear GraphQL cache:", error); + } + ); + }; + + /** + * Add navigation guards to account for global loading state and page titles. + */ + Vue.prototype.$setupNavigationGuards = function () { + const vm = this; + + // eslint-disable-next-line no-unused-vars + this.$router.afterEach((to, from, next) => { + console.debug("Setting new page title due to route change"); + vm.$setPageTitle(null, to); + }); + + // eslint-disable-next-line no-unused-vars + this.$router.beforeEach((to, from, next) => { + vm.contentLoading = true; + next(); + }); + + // eslint-disable-next-line no-unused-vars + this.$router.afterEach((to, from) => { + vm.contentLoading = false; + }); + + // eslint-disable-next-line no-unused-vars + this.$router.beforeEach((to, from, next) => { + if (from.meta.invalidate === "leave" || to.meta.invalidate === "enter") { + console.debug("Route requests to invalidate state"); + vm.$invalidateState(); + } + next(); + }); + }; + + // Add default behaviour for all components + Vue.mixin(aleksisMixin); +}; + +export default AleksisVue; diff --git a/aleksis/core/frontend/routeValidators.js b/aleksis/core/frontend/routeValidators.js new file mode 100644 index 0000000000000000000000000000000000000000..87a046c1dab01e0be4a8c9a65fddf3495e794623 --- /dev/null +++ b/aleksis/core/frontend/routeValidators.js @@ -0,0 +1,15 @@ +/** + * Check whether the user is logged in on the AlekSIS server. + * + * @param {Object} whoAmI The person object as returned by the whoAmI query + * @returns true if the user is logged in, false if not + */ +const notLoggedInValidator = (whoAmI) => { + return !whoAmI || whoAmI.isAnonymous; +}; + +const hasPersonValidator = (whoAmI) => { + return whoAmI && whoAmI.person && !whoAmI.person.isDummy; +}; + +export { notLoggedInValidator, hasPersonValidator }; diff --git a/aleksis/core/frontend/routes.js b/aleksis/core/frontend/routes.js new file mode 100644 index 0000000000000000000000000000000000000000..f3ef5d9955c234c9009e74e023662f4aed002632 --- /dev/null +++ b/aleksis/core/frontend/routes.js @@ -0,0 +1,772 @@ +/* + * Vue router definitions for all of AlekSIS. + * + * This module defines the routes of AlekSIS-Core and also loads + * and adds all routes from known apps. + */ + +// aleksisAppImporter is a virtual module defined in Vite config +import { appObjects } from "aleksisAppImporter"; + +import { notLoggedInValidator } from "./routeValidators"; + +const routes = [ + { + path: "/account/login/", + name: "core.account.login", + component: () => import("./components/LegacyBaseTemplate.vue"), + meta: { + inMenu: true, + icon: "mdi-login-variant", + titleKey: "accounts.login.menu_title", + validators: [notLoggedInValidator], + invalidate: "leave", + }, + }, + { + path: "/accounts/signup/", + name: "core.accounts.signup", + component: () => import("./components/LegacyBaseTemplate.vue"), + meta: { + inMenu: true, + icon: "mdi-account-plus-outline", + titleKey: "accounts.signup.menu_title", + validators: [notLoggedInValidator], + invalidate: "leave", + }, + }, + { + path: "/invitations/code/enter/", + name: "core.invitations.enterCode", + component: () => import("./components/LegacyBaseTemplate.vue"), + meta: { + inMenu: true, + icon: "mdi-key-outline", + titleKey: "accounts.invitation.accept_invitation.menu_title", + validators: [notLoggedInValidator], + }, + }, + { + path: "", + name: "dashboard", + component: () => import("./components/LegacyBaseTemplate.vue"), + meta: { + inMenu: true, + icon: "mdi-home-outline", + titleKey: "dashboard.menu_title", + permission: "core.view_dashboard_rule", + }, + }, + { + path: "/people", + name: "core.people", + component: () => import("./components/Parent.vue"), + meta: { + inMenu: true, + titleKey: "people", + icon: "mdi-account-group-outline", + permission: "core.view_people_menu_rule", + }, + children: [ + { + path: "/persons", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.persons", + meta: { + inMenu: true, + titleKey: "person.menu_title", + icon: "mdi-account-outline", + permission: "core.view_persons_rule", + }, + }, + { + path: "/persons/create/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.createPerson", + }, + { + path: "/persons/:id(\\d+)/", + component: () => import("./components/person/PersonOverview.vue"), + name: "core.personById", + props: true, + meta: { + titleKey: "person.page_title", + }, + }, + { + path: "/persons/:id(\\d+)/edit/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editPerson", + }, + { + path: "/persons/:id(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deletePerson", + }, + { + path: "/persons/:id(\\d+)/invite/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.invitePerson", + }, + { + path: "/groups", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.groups", + meta: { + inMenu: true, + titleKey: "group.menu_title", + icon: "mdi-account-multiple-outline", + permission: "core.view_groups_rule", + }, + }, + { + path: "/groups/create", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.createGroup", + }, + { + path: "/groups/:id(\\d+)", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.group", + }, + { + path: "/groups/:id(\\d+)/edit", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editGroup", + }, + { + path: "/groups/:id(\\d+)/delete", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteGroup", + }, + { + path: "/groups/group_types", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.groupTypes", + meta: { + inMenu: true, + titleKey: "group.group_type.menu_title", + icon: "mdi-shape-outline", + permission: "core.view_grouptypes_rule", + }, + }, + { + path: "/groups/group_types/create", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.createGroupType", + }, + { + path: "/groups/group_types/:id(\\d+)/delete", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteGroupType,", + }, + { + path: "/groups/group_types/:id(\\d+)/edit", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editGroupType", + }, + + { + path: "/groups/child_groups/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.groupsChildGroups", + meta: { + inMenu: true, + titleKey: "group.groups_and_child_groups", + icon: "mdi-account-multiple-plus-outline", + permission: "core.assign_child_groups_to_groups_rule", + }, + }, + { + path: "/groups/additional_fields", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.additionalFields", + meta: { + inMenu: true, + titleKey: "group.additional_field.menu_title", + icon: "mdi-palette-swatch-outline", + permission: "core.view_additionalfields_rule", + }, + }, + { + path: "/groups/additional_fields/:id(\\d+)/edit", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editAdditionalField,", + }, + { + path: "/groups/additional_fields/create", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.createAdditionalField", + }, + { + path: "/groups/additional_fields/:id(\\d+)/delete", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteAdditionalField", + }, + { + path: "/invitations/send-invite", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.invite_person", + meta: { + inMenu: true, + titleKey: "accounts.invitation.invite_person.menu_title", + icon: "mdi-account-plus-outline", + permission: "core.invite_rule", + }, + }, + ], + }, + { + path: "#", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.administration", + meta: { + inMenu: true, + titleKey: "administration.menu_title", + icon: "mdi-security", + permission: "core.view_admin_menu_rule", + }, + children: [ + { + path: "/announcements/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.announcements", + meta: { + inMenu: true, + titleKey: "announcement.menu_title", + icon: "mdi-message-alert-outline", + permission: "core.view_announcements_rule", + }, + }, + { + path: "/announcements/create/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.addAnnouncement", + }, + { + path: "/announcements/edit/:id(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editAnnouncement", + }, + { + path: "/announcements/delete/:id(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteAnnouncement", + }, + { + path: "/school_terms/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.school_terms", + meta: { + inMenu: true, + titleKey: "school_term.menu_title", + icon: "mdi-calendar-range-outline", + permission: "core.view_schoolterm_rule", + }, + }, + { + path: "/school_terms/create/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.create_school_term", + }, + { + path: "/school_terms/:pk(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editSchoolTerm", + }, + { + path: "/dashboard_widgets/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.dashboardWidgets", + meta: { + inMenu: true, + titleKey: "dashboard.dashboard_widget.menu_title", + icon: "mdi-view-dashboard-outline", + permission: "core.view_dashboardwidget_rule", + }, + }, + { + path: "/dashboard_widgets/:pk(\\d+)/edit/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editDashboardWidget", + }, + { + path: "/dashboard_widgets/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteDashboardWidget", + }, + { + path: "/dashboard_widgets/:app/:model/new/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.createDashboardWidget", + }, + { + path: "/dashboard_widgets/default/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editDefaultDashboard", + }, + { + path: "/status/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.system_status", + meta: { + inMenu: true, + titleKey: "administration.system_status.menu_title", + icon: "mdi-power-settings", + permission: "core.view_system_status_rule", + }, + }, + { + path: "/preferences/site/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesSite", + meta: { + inMenu: true, + titleKey: "preferences.site.menu_title", + icon: "mdi-tune", + permission: "core.change_site_preferences_rule", + }, + }, + { + path: "/preferences/site/:pk(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesSiteByPk", + }, + { + path: "/preferences/site/:pk(\\d+)/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesSiteByPkSection", + }, + { + path: "/preferences/site/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesSiteSection", + }, + { + path: "/data_checks/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.checkData", + meta: { + inMenu: true, + titleKey: "data_check.menu_title", + icon: "mdi-list-status", + permission: "core.view_datacheckresults_rule", + }, + }, + { + path: "/data_checks/run/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.runDataChecks", + }, + { + path: "/data_checks/:pk(\\d+)/:solve_option/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.solveDataCheck", + }, + + { + path: "/permissions/global/user/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.managerUserGlobalPermissions", + meta: { + inMenu: true, + titleKey: "permissions.manage.menu_title", + icon: "mdi-shield-outline", + permission: "core.manage_permissions_rule", + }, + }, + { + path: "/permissions/global/group/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.manageGroupGlobalPermissions", + }, + { + path: "/permissions/object/user/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.manageUserObjectPermissions", + }, + { + path: "/permissions/object/group/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.manageGroupObjectPermissions", + }, + { + path: "/permissions/global/user/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteUserGlobalPermission,", + }, + { + path: "/permissions/global/group/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteGroupGlobalPermission", + }, + { + path: "/permissions/object/user/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteUserObjectPermission", + }, + { + path: "/permissions/object/group/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.deleteGroupObjectPermission", + }, + { + path: "/permissions/assign/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.selectPermissionforAssign", + }, + { + path: "/permissions/:pk(\\d+)/assign/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.assignPermission", + }, + + { + path: "/oauth/applications/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.oauthApplications", + meta: { + inMenu: true, + titleKey: "oauth.application.menu_title", + icon: "mdi-gesture-tap-hold", + permission: "core.view_oauthapplications_rule", + }, + }, + { + path: "/oauth/applications/register/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.registerOauthApplication,", + }, + { + path: "/oauth/applications/:pk(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.oauthApplication", + }, + { + path: "/oauth/applications/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.delete_oauth2_application,", + }, + { + path: "/oauth/applications/:pk(\\d+)/edit/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editOauthApplication", + }, + { + path: "/admin/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.admin", + meta: { + inMenu: true, + titleKey: "administration.backend_admin.menu_title", + icon: "mdi-database-cog-outline", + permission: "core.view_django_admin_rule", + newTab: true, + }, + }, + ], + }, + { + path: "/impersonate/:uid(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "impersonate.impersonateByUserPk", + meta: { + invalidate: "leave", + }, + }, + + // ACCOUNT MENU + + { + path: "/impersonate/stop/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "impersonate.stop", + meta: { + invalidate: "leave", + }, + }, + { + path: "/person/", + component: () => import("./components/person/PersonOverview.vue"), + name: "core.person", + meta: { + inAccountMenu: true, + titleKey: "person.account_menu_title", + icon: "mdi-account-outline", + permission: "core.view_account_rule", + }, + }, + { + path: "/preferences/person/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesPerson", + meta: { + inAccountMenu: true, + titleKey: "preferences.person.menu_title", + icon: "$preferences", + permission: "core.change_account_preferences_rule", + }, + }, + { + path: "/preferences/person/:pk(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesPersonByPk", + }, + { + path: "/preferences/person/:pk(\\d+)/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesPersonByPkSection", + }, + { + path: "/preferences/person/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesPersonSection", + }, + { + path: "/account/two_factor/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor", + meta: { + inAccountMenu: true, + titleKey: "accounts.two_factor.menu_title", + icon: "mdi-two-factor-authentication", + permission: "core.manage_2fa_rule", + }, + }, + { + path: "/account/two_factor/setup/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.setup", + }, + { + path: "/account/two_factor/qrcode/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.qrcode", + }, + { + path: "/account/two_factor/setup/complete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.setupComplete", + }, + { + path: "/account/two_factor/backup/tokens/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.backupTokens", + }, + { + path: "/account/two_factor/backup/phone/register", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.registerBackupPhone", + }, + { + path: "/account/two_factor/disable/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.twoFactor.disable", + }, + { + path: "/accounts/password/change/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.changePassword", + meta: { + inAccountMenu: true, + titleKey: "accounts.change_password.menu_title", + icon: "mdi-form-textbox-password", + permission: "core.change_password_rule", + }, + }, + { + path: "/accounts/password/set/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.setPassword", + }, + { + path: "/accounts/password/reset/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.resetPassword", + }, + { + path: "/accounts/password/reset/done/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.resetPasswordDone", + }, + { + path: "/accounts/password/reset/key/:key/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.resetPasswordConfirm", + }, + { + path: "/accounts/password/reset/key/done/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.resetPasswordConfirmDone", + }, + { + path: "/accounts/inactive/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.inactive", + }, + { + path: "/accounts/email/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.email", + }, + { + path: "/accounts/confirm-email/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.confirmEmail", + }, + { + path: "/accounts/confirm-email/:key/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.confirmEmailKey", + }, + { + path: "/accounts/social/login/cancelled/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.socialLoginCancelled", + }, + { + path: "/accounts/social/login/error/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.socialLoginError", + }, + { + path: "/accounts/social/signup/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.socialSignup", + }, + { + path: "/accounts/social/connections/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.socialConnections", + meta: { + inAccountMenu: true, + titleKey: "accounts.social_connections.menu_title", + icon: "mdi-earth", + permission: "core.manage_social_connections_rule", + }, + }, + { + path: "/oauth/authorized_tokens/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.oauth.authorizedTokens", + meta: { + inAccountMenu: true, + titleKey: "oauth.authorized_token.menu_title", + icon: "mdi-gesture-tap-hold", + permission: "core.manage_authorized_tokens_rule", + }, + }, + { + path: "/oauth/authorized_tokens/:pk(\\d+)/delete/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.oauth.deleteAuthorizedToken", + }, + { + path: "/accounts/logout/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.accounts.logout", + meta: { + inAccountMenu: true, + titleKey: "accounts.logout.menu_title", + icon: "mdi-logout-variant", + permission: "core.logout_rule", + divider: true, + invalidate: "leave", + }, + }, + { + path: "/invitations/code/enter", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.enter_invitation_code", + }, + { + path: "/invitations/code/generate", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.generate_invitation_code", + }, + { + path: "/invitations/disabled", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.invite_disabled", + }, + { + path: "/dashboard/edit/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.editDashboard", + }, + { + path: "/preferences/group/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesGroup", + }, + { + path: "/preferences/group/:pk(\\d+)/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesGroupByPk", + }, + { + path: "/preferences/group/:pk(\\d+)/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesGroupByPkSection", + }, + { + path: "/preferences/group/:section/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.preferencesGroupSection", + }, + { + path: "/health/pdf/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.testPdf", + }, + { + path: "/pdfs/:id", + component: () => import("./components/pdf/DownloadPDF.vue"), + name: "core.redirectToPdfUrl", + }, + { + path: "/search/", + component: () => import("./components/LegacyBaseTemplate.vue"), + name: "core.haystack_search", + }, + { + path: "/celery_progress/:taskId", + component: () => import("./components/celery_progress/CeleryProgress.vue"), + props: true, + name: "core.celery_progress", + }, + { + path: "/about", + component: () => import("./components/about/About.vue"), + name: "core.about", + meta: { + titleKey: "about.page_title", + }, + }, +]; + +// This imports all known AlekSIS app entrypoints +// The list is generated by util/frontent_helpers.py and passed to Vite, +// which aliases the app package names into virtual JavaScript modules +// and generates importing code at bundle time. +for (const [appName, appRoutes] of Object.entries(appObjects)) { + routes.push({ + ...appRoutes, + path: `/app/${appName}`, + component: () => import("./components/Parent.vue"), + name: `${appName}`, + }); +} + +// Fallback route defined last to ensure 404 view works +routes.push({ + path: "/*", + component: () => import("./components/app/ErrorPage.vue"), + name: "core.error404", + props: { + shortErrorMessageKey: "network_errors.error_404", + longErrorMessageKey: "network_errors.page_not_found", + }, +}); + +export default routes; diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po index a382635f245835c9c747b72cb4b661bd39eb7e04..7601d361668f068f942d130014ca1897f000d92b 100644 --- a/aleksis/core/locale/ar/LC_MESSAGES/django.po +++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -18,57 +18,64 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:157 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:158 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:159 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 msgid "Groups" msgstr "" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:284 msgid "Deactivate DashboardWidget" msgstr "" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "" -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "" -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 -#: aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "" + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 #: aleksis/core/templates/search/search.html:22 @@ -91,11 +98,11 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 msgid "Group" msgstr "" @@ -103,7 +110,7 @@ msgstr "" msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 msgid "Address" msgstr "" @@ -131,7 +138,7 @@ msgstr "" msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 msgid "School term" msgstr "" @@ -140,8 +147,7 @@ msgid "Common data" msgstr "" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 -#: aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" @@ -150,18 +156,18 @@ msgstr "" msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:84 msgid "Date" msgstr "" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:92 msgid "Time" msgstr "" @@ -197,11 +203,11 @@ msgstr "" msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "Last name" msgstr "" @@ -230,11 +236,11 @@ msgid "You must select at least one group or person which should get the permiss msgstr "" #: aleksis/core/forms.py:499 -msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." msgstr "" #: aleksis/core/forms.py:586 -msgid "Adress data" +msgid "Address data" msgstr "" #: aleksis/core/forms.py:598 @@ -249,7 +255,15 @@ msgstr "" msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "" + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" + +#: aleksis/core/forms.py:828 msgid "No valid selection." msgstr "" @@ -273,700 +287,665 @@ msgstr "" msgid "No backup result found!" msgstr "" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:32 -#: aleksis/core/templates/two_factor/core/login.html:95 -msgid "Login" -msgstr "" - -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 -#: aleksis/core/templates/socialaccount/signup.html:23 -msgid "Sign up" -msgstr "" - -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 -msgid "Accept invitation" -msgstr "" - -#: aleksis/core/menus.py:33 -msgid "Dashboard" -msgstr "" - -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "" - -#: aleksis/core/menus.py:113 -msgid "Third-party accounts" -msgstr "" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/menus.py:133 -msgid "Admin" -msgstr "" - -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 -#: aleksis/core/templates/core/announcement/list.html:7 -#: aleksis/core/templates/core/announcement/list.html:8 -msgid "Announcements" -msgstr "" - -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 -#: aleksis/core/templates/core/school_term/list.html:8 -#: aleksis/core/templates/core/school_term/list.html:9 -msgid "School terms" -msgstr "" - -#: aleksis/core/menus.py:163 -#: aleksis/core/templates/core/dashboard_widget/list.html:8 -#: aleksis/core/templates/core/dashboard_widget/list.html:9 -msgid "Dashboard widgets" -msgstr "" - -#: aleksis/core/menus.py:174 -#: aleksis/core/templates/core/management/data_management.html:6 -#: aleksis/core/templates/core/management/data_management.html:7 -msgid "Data management" -msgstr "" - -#: aleksis/core/menus.py:185 -#: aleksis/core/templates/core/pages/system_status.html:5 -#: aleksis/core/templates/core/pages/system_status.html:7 -msgid "System status" -msgstr "" - -#: aleksis/core/menus.py:196 -msgid "Configuration" -msgstr "" - -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 -#: aleksis/core/templates/core/data_check/list.html:10 -msgid "Data checks" -msgstr "" - -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 -#: aleksis/core/templates/core/perms/list.html:14 -msgid "Manage permissions" -msgstr "" - -#: aleksis/core/menus.py:224 -msgid "Backend Admin" -msgstr "" - -#: aleksis/core/menus.py:232 -#: aleksis/core/templates/oauth2_provider/application/list.html:5 -#: aleksis/core/templates/oauth2_provider/application/list.html:6 -msgid "OAuth2 Applications" -msgstr "" - -#: aleksis/core/menus.py:245 -msgid "People" -msgstr "" - -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 -#: aleksis/core/templates/core/group_type/list.html:8 -#: aleksis/core/templates/core/group_type/list.html:9 -msgid "Group types" -msgstr "" - -#: aleksis/core/menus.py:287 -msgid "Groups and child groups" -msgstr "" - -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 -#: aleksis/core/templates/core/additional_field/list.html:8 -#: aleksis/core/templates/core/additional_field/list.html:9 -msgid "Additional fields" -msgstr "" - -#: aleksis/core/menus.py:309 -msgid "Invite person" -msgstr "" - -#: aleksis/core/menus.py:322 -#: aleksis/core/templates/core/group/child_groups.html:7 -#: aleksis/core/templates/core/group/child_groups.html:9 -msgid "Assign child groups to groups" -msgstr "" - #: aleksis/core/mixins.py:511 msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:83 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:85 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:86 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:88 msgid "Integer" msgstr "" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:89 msgid "IP address" msgstr "" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:93 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 msgid "Name" msgstr "" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:107 msgid "Start date" msgstr "" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:108 msgid "End date" msgstr "" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 msgid "Person" msgstr "" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:166 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:167 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:168 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:169 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:170 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:171 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "female" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:181 +msgid "other" +msgstr "" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 msgid "Short name" msgstr "" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:202 msgid "Street" msgstr "" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:203 msgid "Street number" msgstr "" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:204 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:205 msgid "Place" msgstr "" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:212 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:213 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:214 msgid "Sex" msgstr "" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:241 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 msgid "Description" msgstr "" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:464 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:466 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "" + +#: aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "" + +#: aleksis/core/models.py:475 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:476 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:497 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 msgid "Long name" msgstr "" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:537 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:726 msgid "Application" msgstr "" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:732 msgid "Activity" msgstr "" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:733 msgid "Activities" msgstr "" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:739 msgid "Sender" msgstr "" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:744 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "" + +#: aleksis/core/models.py:757 msgid "Read" msgstr "" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:775 msgid "Notification" msgstr "" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "" + +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:875 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "" + +#: aleksis/core/models.py:913 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:914 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:934 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:936 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:989 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:990 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:991 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:997 msgid "URL" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:998 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "" + +#: aleksis/core/models.py:1023 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1044 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1045 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1075 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 -#: aleksis/core/templates/oauth2_provider/application/detail.html:26 -msgid "Icon" -msgstr "" - -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1103 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +msgid "Group types" +msgstr "" + +#: aleksis/core/models.py:1124 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1125 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1126 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1127 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1132 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1168 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1176 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1177 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1190 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1191 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1201 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1233 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1237 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1263 +msgid "Back URL" +msgstr "" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "" + +#: aleksis/core/models.py:1269 +msgid "Additional button title" +msgstr "" + +#: aleksis/core/models.py:1271 +msgid "Additional button URL" +msgstr "" + +#: aleksis/core/models.py:1273 +msgid "Additional button icon" +msgstr "" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "" + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1348 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1268 +#: aleksis/core/models.py:1386 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1278 +#: aleksis/core/models.py:1396 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" +#: aleksis/core/models.py:1441 +msgid "Can view room timetable" +msgstr "" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + #: aleksis/core/preferences.py:25 msgid "General" msgstr "" @@ -1055,148 +1034,163 @@ msgstr "" msgid "Channels to use for notifications" msgstr "" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:208 +msgid "Select Design" +msgstr "" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" msgstr "" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "" -#: aleksis/core/preferences.py:241 +#: aleksis/core/preferences.py:256 msgid "Automatically link existing persons to new users by their e-mail address" msgstr "" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "" + +#: aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "" + +#: aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:345 msgid "Allowed Grant Flows for OAuth applications" msgstr "" -#: aleksis/core/preferences.py:328 -msgid "Available languages" -msgstr "" - -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "" -#: aleksis/core/preferences.py:407 +#: aleksis/core/preferences.py:424 msgid "Editable fields on person model which should trigger a notification on change" msgstr "" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "" + +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" msgstr "" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:539 msgid "English" msgstr "" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:540 msgid "German" msgstr "" -#: aleksis/core/tables.py:24 +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "" + +#: aleksis/core/tables.py:25 #: aleksis/core/templates/core/announcement/list.html:36 -#: aleksis/core/templates/core/group/full.html:24 -#: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/group/full.html:26 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 msgid "Edit" msgstr "" -#: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:138 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" -#: aleksis/core/tables.py:61 aleksis/core/tables.py:62 -#: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:136 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 #: aleksis/core/templates/core/announcement/list.html:42 -#: aleksis/core/templates/core/group/full.html:31 +#: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 -#: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 msgid "Delete" msgstr "" #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 #: aleksis/core/templates/oauth2_provider/authorize.html:54 -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:24 msgid "Error" msgstr "" @@ -1225,7 +1219,7 @@ msgstr "" #: aleksis/core/templates/500.html:10 msgid "" "An unexpected error has\n" -" occured." +" occurred." msgstr "" #: aleksis/core/templates/500.html:13 @@ -1236,6 +1230,10 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1291,6 +1289,17 @@ msgstr "" msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "" + #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" msgstr "" @@ -1404,6 +1413,11 @@ msgstr "" msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "" + #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 msgid "Signup closed" @@ -1475,7 +1489,7 @@ msgid "Publish new announcement" msgstr "" #: aleksis/core/templates/core/announcement/form.html:34 -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1494,22 +1508,6 @@ msgstr "" msgid "There are no announcements." msgstr "" -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "" - -#: aleksis/core/templates/core/base.html:179 -msgid "About AlekSIS® — The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/base.html:187 -msgid "Imprint" -msgstr "" - -#: aleksis/core/templates/core/base.html:195 -msgid "Privacy Policy" -msgstr "" - #: aleksis/core/templates/core/base_print.html:74 msgid "Powered by AlekSIS®" msgstr "" @@ -1539,6 +1537,11 @@ msgstr "" msgid "Edit %(widget)s" msgstr "" +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "" + #: aleksis/core/templates/core/dashboard_widget/list.html:15 msgid "Create dashboard widget" msgstr "" @@ -1554,6 +1557,11 @@ msgstr "" msgid "Edit default dashboard" msgstr "" +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "" + #: aleksis/core/templates/core/data_check/list.html:15 msgid "Check data again" msgstr "" @@ -1647,6 +1655,11 @@ msgstr "" msgid "Default dashboard" msgstr "" +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "" + #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" @@ -1725,34 +1738,32 @@ msgstr "" msgid "Edit group" msgstr "" -#: aleksis/core/templates/core/group/full.html:38 -#: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "" -#: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 msgid "Statistics" msgstr "" -#: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "" -#: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 -msgid "years to" -msgstr "" - -#: aleksis/core/templates/core/group/full.html:76 -msgid "years " +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " msgstr "" #: aleksis/core/templates/core/group/list.html:14 @@ -1785,7 +1796,7 @@ msgstr "" msgid "Home" msgstr "" -#: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" " You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" @@ -1793,101 +1804,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "" -#: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "" -#: aleksis/core/templates/core/index.html:82 -msgid "Recent notifications" -msgstr "" - -#: aleksis/core/templates/core/index.html:98 -#: aleksis/core/templates/core/notifications.html:23 -msgid "More information →" -msgstr "" - -#: aleksis/core/templates/core/index.html:105 -#: aleksis/core/templates/core/notifications.html:30 -msgid "No notifications available yet." -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:6 -msgid "About AlekSIS®" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:7 -msgid "AlekSIS® – The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:15 -msgid "About AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:17 -msgid "" -"\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" -" can be used by anyone.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:24 -msgid "" -"\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:30 -msgid "Website of AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:31 -msgid "Source code" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:40 -msgid "Licence information" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:42 -msgid "" -"\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" -" licences are marked like this:\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:50 -msgid "Free/Open Source Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:51 -msgid "Other Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:55 -msgid "Full licence text" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:56 -msgid "More information about the EUPL" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:95 -#, python-format -msgid "" -"\n" -" This app is licenced under %(licence)s.\n" -" " -msgstr "" - #: aleksis/core/templates/core/pages/delete.html:6 #, python-format msgid "Delete %(object_name)s" @@ -1901,99 +1825,92 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/pages/progress.html:27 -msgid "" -"\n" -" Without activated JavaScript the progress status can't be updated.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/progress.html:47 -#: aleksis/core/templates/two_factor/core/otp_required.html:19 -msgid "Go back" +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" msgstr "" #: aleksis/core/templates/core/pages/system_status.html:12 msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access the site.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 msgid "Date done" msgstr "" @@ -2034,37 +1951,29 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Changed by" -msgstr "" - -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Unknown" +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:15 -msgid "Language" +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:27 -msgid "Select language" +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:12 -msgid "" -"\n" -" Your administrator account is not linked to any person. Therefore,\n" -" a dummy person has been linked to your account.\n" -" " +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:19 +#: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " msgstr "" #: aleksis/core/templates/core/perms/assign.html:12 @@ -2080,6 +1989,11 @@ msgstr "" msgid "Assign" msgstr "" +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "" + #: aleksis/core/templates/core/perms/list.html:21 msgid "Assign a new permission" msgstr "" @@ -2123,28 +2037,6 @@ msgstr "" msgid "Edit person" msgstr "" -#: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 -msgid "Impersonate" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 -msgid "Invite user" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:133 -msgid "Contact details" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:224 -msgid "This person didn't upload a personal photo." -msgstr "" - -#: aleksis/core/templates/core/person/full.html:232 -msgid "Children" -msgstr "" - #: aleksis/core/templates/core/person/list.html:21 msgid "Filter persons" msgstr "" @@ -2164,6 +2056,10 @@ msgstr "" msgid "Edit school term" msgstr "" +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "" + #: aleksis/core/templates/dynamic_preferences/form.html:9 msgid "Site preferences" msgstr "" @@ -2197,6 +2093,10 @@ msgstr "" msgid "site preferences page" msgstr "" +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2285,6 +2185,11 @@ msgstr "" msgid "Edit OAuth2 Application" msgstr "" +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/application/list.html:11 msgid "Register new application" msgstr "" @@ -2316,14 +2221,6 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:12 -msgid "Success!" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 -msgid "Please return to your application and enter this code:" -msgstr "" - #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 @@ -2338,6 +2235,11 @@ msgstr "" msgid "Revoke" msgstr "" +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 msgid "No authorized applications." msgstr "" @@ -2346,16 +2248,14 @@ msgstr "" msgid "Network error" msgstr "" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." msgstr "" -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" " administrators:\n" " " @@ -2596,7 +2496,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "" @@ -2636,6 +2536,12 @@ msgstr "" msgid "Generate Tokens" msgstr "" +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "" + #: aleksis/core/templates/two_factor/core/login.html:27 #, python-format msgid "Login for %(name)s" @@ -2700,15 +2606,15 @@ msgstr "" msgid "Or, alternatively, use one of your backup phones:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "" @@ -2730,6 +2636,10 @@ msgid "" " security." msgstr "" +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + #: aleksis/core/templates/two_factor/core/phone_register.html:5 #: aleksis/core/templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" @@ -2949,184 +2859,176 @@ msgid "" " " msgstr "" -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "" -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "" -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:766 -msgid "The additional_field has been saved." +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:857 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1337 -msgid "The requested PDF file does not exist" -msgstr "" - -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 -msgid "The requested task does not exist or is not accessible" -msgstr "" - -#: aleksis/core/views.py:1388 +#: aleksis/core/views.py:1349 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1466 +#: aleksis/core/views.py:1432 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1443 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po index 8a53fc2fc168227f37f344c17ae359b5d5764596..0d39d4eb6ab12b04ed1f7a3313c6a214e2b8e291 100644 --- a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -29,7 +29,3 @@ msgstr "" #: aleksis/core/static/js/main.js:68 msgid "OK" msgstr "" - -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po index 56ff3ab652cb345ae714d6b1eb8b54e7ae5f27a2..d1d1ddf4e3ee080bbf511bf335169806a26fce5f 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po @@ -7,68 +7,90 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" -"PO-Revision-Date: 2022-02-08 23:24+0000\n" -"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n" -"Language-Team: German <https://translate.edugit.org/projects/aleksis/" -"aleksis-core/de/>\n" +"POT-Creation-Date: 2022-05-24 19:37+0200\n" +"PO-Revision-Date: 2023-01-22 20:05+0000\n" +"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" +"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core/de/>\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8\n" +"X-Generator: Weblate 4.12.1\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:166 aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "OpenID-Connect-Scope" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:167 aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden." -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:168 aleksis/core/apps.py:157 msgid "Full home postal address" msgstr "Vollständige Postanschrift" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:169 aleksis/core/apps.py:158 msgid "Email address" msgstr "E-Mail-Adresse" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:170 aleksis/core/apps.py:159 msgid "Home and mobile phone" msgstr "Festnetz- und Mobilfunknummer" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:171 +#: aleksis/core/models.py:489 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 +#: aleksis/core/templates/core/person/full.html:246 aleksis/core/models.py:494 +#: aleksis/core/apps.py:160 msgid "Groups" msgstr "Gruppen" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:56 aleksis/core/data_checks.py:59 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "Problem ignorieren" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:185 aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "Lösungsoption \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:291 aleksis/core/data_checks.py:294 +#: aleksis/core/data_checks.py:284 msgid "Deactivate DashboardWidget" msgstr "Dashboard-Widget deaktivieren" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:303 aleksis/core/data_checks.py:306 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "Sicherstellen, dass es keine kaputten Dashboard-Widgets gibt." -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:304 aleksis/core/data_checks.py:307 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "Das Dashboard-Widget wurde automatisch als kaputt gemeldet." -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 +#: aleksis/core/feeds.py:52 +msgid "Birthday Calendar" +msgstr "Geburtstagskalender" + +#: aleksis/core/feeds.py:53 +msgid "A Calendar of Birthdays" +msgstr "Ein Kalender mit Geburtstagen" + +#: aleksis/core/feeds.py:66 +#, python-format +msgid "%(name)s's birthday" +msgstr "%(name)ss Geburtstag" + +#: aleksis/core/feeds.py:71 +#, python-format +msgid "%(name)s was born on %(birthday)s" +msgstr "%(name)s wurde am %(birthday)s geboren" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:139 +#: aleksis/core/templates/core/base.html:140 #: aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 @@ -92,11 +114,13 @@ msgstr "Berechtigung" msgid "Content type" msgstr "Inhaltstyp" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:715 +#: aleksis/core/models.py:720 msgid "User" msgstr "Benutzer" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:488 +#: aleksis/core/models.py:493 msgid "Group" msgstr "Gruppe" @@ -104,7 +128,7 @@ msgstr "Gruppe" msgid "Base data" msgstr "Basisdaten" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 msgid "Address" msgstr "Adresse" @@ -126,13 +150,16 @@ msgstr "Neues Benutzerkonto erstellen" #: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." -msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen." +msgstr "" +"Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen " +"existierenden Benutzer auswählen." #: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "Dieser Benutzername wird bereits genutzt." -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:136 +#: aleksis/core/models.py:141 msgid "School term" msgstr "Schuljahr" @@ -141,28 +168,29 @@ msgid "Common data" msgstr "Allgemeine Daten" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 +#: aleksis/core/menus.py:160 aleksis/core/models.py:159 #: aleksis/core/templates/core/person/list.html:8 -#: aleksis/core/templates/core/person/list.html:9 +#: aleksis/core/templates/core/person/list.html:9 aleksis/core/models.py:164 msgid "Persons" msgstr "Personen" #: aleksis/core/forms.py:156 aleksis/core/forms.py:592 msgid "Additional data" -msgstr "Zusätzliche Datne" +msgstr "Zusätzliche Daten" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:212 +#: aleksis/core/models.py:541 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "Foto" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:79 aleksis/core/models.py:84 msgid "Date" msgstr "Datum" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:87 aleksis/core/models.py:92 msgid "Time" msgstr "Zeit" @@ -179,12 +207,17 @@ msgid "Write your announcement:" msgstr "Schreiben Sie ihre Ankündigung:" #: aleksis/core/forms.py:276 -msgid "You are not allowed to create announcements which are only valid in the past." -msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind." +msgid "" +"You are not allowed to create announcements which are only valid in the past." +msgstr "" +"Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit " +"gültig sind." #: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." -msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein." +msgstr "" +"Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit " +"sein." #: aleksis/core/forms.py:289 msgid "You need at least one recipient." @@ -198,11 +231,13 @@ msgstr "Einladungscode" msgid "Please enter your invitation code." msgstr "Bitte geben Sie Ihren Einladungscode ein." -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:187 +#: aleksis/core/models.py:192 msgid "First name" msgstr "Vorname" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:188 +#: aleksis/core/models.py:193 msgid "Last name" msgstr "Nachname" @@ -220,22 +255,28 @@ msgstr "Auf was?" #: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" -msgstr "Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:" +msgstr "" +"Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:" #: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "Vergebe die Berechtigung für alle Objekte" #: aleksis/core/forms.py:494 -msgid "You must select at least one group or person which should get the permission." -msgstr "Sie müssen mindestens eine Gruppe oder Person auswählen, welche die Berechtigung erhalten soll." +msgid "" +"You must select at least one group or person which should get the permission." +msgstr "" +"Sie müssen mindestens eine Gruppe oder Person auswählen, welche die " +"Berechtigung erhalten soll." #: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." -msgstr "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte vergeben." +msgstr "" +"Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte " +"vergeben." #: aleksis/core/forms.py:586 -msgid "Adress data" +msgid "Address data" msgstr "Adressdaten" #: aleksis/core/forms.py:598 @@ -250,7 +291,17 @@ msgstr "Passwort" msgid "Password (again)" msgstr "Passwort wiederholen" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:728 aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "Die ausgewählte Aktion existiert nicht." + +#: aleksis/core/forms.py:739 aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" +"Sie haben nicht die Berechtigung, {} auf alle ausgewählten Objekte " +"auszuführen." + +#: aleksis/core/forms.py:795 aleksis/core/forms.py:828 msgid "No valid selection." msgstr "Keine gültige Auswahl." @@ -274,699 +325,833 @@ msgstr "Kein Backup gefunden!" msgid "No backup result found!" msgstr "Kein Backupergebnis gefunden!" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/menus.py:7 aleksis/core/templates/two_factor/core/login.html:6 #: aleksis/core/templates/two_factor/core/login.html:32 #: aleksis/core/templates/two_factor/core/login.html:95 msgid "Login" msgstr "Anmelden" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 +#: aleksis/core/menus.py:13 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "Registrieren" -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 +#: aleksis/core/menus.py:22 aleksis/core/templates/invitations/enter.html:7 msgid "Accept invitation" msgstr "Einladung akzeptieren" -#: aleksis/core/menus.py:33 +#: aleksis/core/menus.py:31 msgid "Dashboard" msgstr "Dashboard" -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "Benachrichtigungen" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "Konto" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "Verkleidung beenden" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "Abmelden" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "2FA" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "Passwort ändern" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "Ich" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "Einstellungen" - -#: aleksis/core/menus.py:113 -msgid "Third-party accounts" -msgstr "Drittanbieter-Konten" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "Autorisierte Anwendungen" - -#: aleksis/core/menus.py:133 +#: aleksis/core/menus.py:39 msgid "Admin" msgstr "Admin" -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 +#: aleksis/core/menus.py:47 aleksis/core/models.py:867 #: aleksis/core/templates/core/announcement/list.html:7 #: aleksis/core/templates/core/announcement/list.html:8 +#: aleksis/core/models.py:872 aleksis/core/models.py:876 msgid "Announcements" msgstr "Ankündigungen" -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 +#: aleksis/core/menus.py:58 aleksis/core/models.py:137 #: aleksis/core/templates/core/school_term/list.html:8 #: aleksis/core/templates/core/school_term/list.html:9 +#: aleksis/core/models.py:142 msgid "School terms" msgstr "Schuljahre" -#: aleksis/core/menus.py:163 +#: aleksis/core/menus.py:69 #: aleksis/core/templates/core/dashboard_widget/list.html:8 #: aleksis/core/templates/core/dashboard_widget/list.html:9 msgid "Dashboard widgets" msgstr "Dashboard-Widgets" -#: aleksis/core/menus.py:174 +#: aleksis/core/menus.py:80 #: aleksis/core/templates/core/management/data_management.html:6 #: aleksis/core/templates/core/management/data_management.html:7 msgid "Data management" msgstr "Datenverwaltung" -#: aleksis/core/menus.py:185 +#: aleksis/core/menus.py:91 #: aleksis/core/templates/core/pages/system_status.html:5 #: aleksis/core/templates/core/pages/system_status.html:7 msgid "System status" msgstr "Systemstatus" -#: aleksis/core/menus.py:196 +#: aleksis/core/menus.py:102 msgid "Configuration" msgstr "Konfiguration" -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/menus.py:113 aleksis/core/templates/core/data_check/list.html:9 #: aleksis/core/templates/core/data_check/list.html:10 msgid "Data checks" msgstr "Datenprüfungen" -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/menus.py:119 aleksis/core/templates/core/perms/list.html:13 #: aleksis/core/templates/core/perms/list.html:14 msgid "Manage permissions" msgstr "Berechtigungen verwalten" -#: aleksis/core/menus.py:224 +#: aleksis/core/menus.py:130 msgid "Backend Admin" msgstr "Backend-Administration" -#: aleksis/core/menus.py:232 +#: aleksis/core/menus.py:138 #: aleksis/core/templates/oauth2_provider/application/list.html:5 #: aleksis/core/templates/oauth2_provider/application/list.html:6 msgid "OAuth2 Applications" msgstr "OAuth2-Anwendungen" -#: aleksis/core/menus.py:245 +#: aleksis/core/menus.py:151 msgid "People" msgstr "Leute" -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 +#: aleksis/core/menus.py:182 aleksis/core/models.py:1101 #: aleksis/core/templates/core/group_type/list.html:8 #: aleksis/core/templates/core/group_type/list.html:9 +#: aleksis/core/models.py:1111 msgid "Group types" msgstr "Gruppentypen" -#: aleksis/core/menus.py:287 +#: aleksis/core/menus.py:193 msgid "Groups and child groups" msgstr "Gruppen und Kindgruppen" -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 +#: aleksis/core/menus.py:204 aleksis/core/models.py:537 #: aleksis/core/templates/core/additional_field/list.html:8 #: aleksis/core/templates/core/additional_field/list.html:9 +#: aleksis/core/models.py:542 msgid "Additional fields" msgstr "Zusätzliche Felder" -#: aleksis/core/menus.py:309 +#: aleksis/core/menus.py:215 msgid "Invite person" msgstr "Person einladen" -#: aleksis/core/menus.py:322 +#: aleksis/core/menus.py:228 #: aleksis/core/templates/core/group/child_groups.html:7 #: aleksis/core/templates/core/group/child_groups.html:9 msgid "Assign child groups to groups" msgstr "Kindgruppen zu Gruppen zuordnen" +#: aleksis/core/menus.py:240 +msgid "Stop impersonation" +msgstr "Verkleidung beenden" + +#: aleksis/core/menus.py:249 +msgid "Account" +msgstr "Konto" + +#: aleksis/core/menus.py:258 +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "Einstellungen" + +#: aleksis/core/menus.py:267 +msgid "2FA" +msgstr "2FA" + +#: aleksis/core/menus.py:275 +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "Passwort ändern" + +#: aleksis/core/menus.py:287 +msgid "Third-party accounts" +msgstr "Drittanbieter-Konten" + +#: aleksis/core/menus.py:296 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "Autorisierte Anwendungen" + +#: aleksis/core/menus.py:305 +msgid "Calendar Feeds" +msgstr "Kalender-Feeds" + +#: aleksis/core/menus.py:318 +msgid "Logout" +msgstr "Abmelden" + #: aleksis/core/mixins.py:511 msgid "Linked school term" msgstr "Zugeordnetes Schuljahr" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:77 aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "Boolean (Ja/Nein)" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:78 aleksis/core/models.py:83 msgid "Text (one line)" msgstr "Text (eine Zeile)" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:80 aleksis/core/models.py:85 msgid "Date and time" msgstr "Datum und Uhrzeit" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:81 aleksis/core/models.py:86 msgid "Decimal number" msgstr "Dezimalzahl" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:82 aleksis/core/models.py:205 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:83 aleksis/core/models.py:88 msgid "Integer" msgstr "Ganze Zahl" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:84 aleksis/core/models.py:89 msgid "IP address" msgstr "IP-Adresse" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:85 aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "Boolean oder leer (Ja/Nein/weder)" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:86 aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "Text (mehrzeilig)" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:88 aleksis/core/models.py:93 msgid "URL / Link" msgstr "URL / Link" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:100 aleksis/core/models.py:1070 +#: aleksis/core/models.py:1374 aleksis/core/models.py:105 +#: aleksis/core/models.py:1077 aleksis/core/models.py:1384 msgid "Name" msgstr "Name" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:102 aleksis/core/models.py:107 msgid "Start date" msgstr "Startdatum" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:103 aleksis/core/models.py:108 msgid "End date" msgstr "Enddatum" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:122 aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "Das Startdatum muss vor dem Enddatum liegen." -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:129 aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." -msgstr "Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum." +msgstr "" +"Es gibt bereits ein Schuljahr für diesen Zeitraum oder einen Teilzeitraum." -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:158 aleksis/core/models.py:1019 +#: aleksis/core/models.py:1371 aleksis/core/models.py:163 +#: aleksis/core/models.py:1024 aleksis/core/models.py:1381 +#: aleksis/core/models.py:1026 msgid "Person" msgstr "Person" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:161 aleksis/core/models.py:166 msgid "Can view address" msgstr "Kann Adresse sehen" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:162 aleksis/core/models.py:167 msgid "Can view contact details" msgstr "Kann Kontaktdetails sehen" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:163 aleksis/core/models.py:168 msgid "Can view photo" msgstr "Kann Foto sehen" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:164 aleksis/core/models.py:169 msgid "Can view avatar image" msgstr "Kann Avatar-Bild sehen" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:165 aleksis/core/models.py:170 msgid "Can view persons groups" msgstr "Kann Gruppen einer Person sehen" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:166 aleksis/core/models.py:171 msgid "Can view personal details" msgstr "Kann persönliche Daten sehen" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:176 aleksis/core/models.py:181 msgid "female" msgstr "weiblich" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:176 aleksis/core/models.py:181 msgid "male" msgstr "männlich" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:184 aleksis/core/models.py:1273 +#: aleksis/core/models.py:189 aleksis/core/models.py:1283 +#: aleksis/core/models.py:1345 msgid "Linked user" msgstr "Verknüpfter Benutzer" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:190 aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "Zusätzliche Namen" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:194 aleksis/core/models.py:506 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 msgid "Short name" msgstr "Kurzname" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:197 aleksis/core/models.py:202 msgid "Street" msgstr "Straße" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:198 aleksis/core/models.py:203 msgid "Street number" msgstr "Hausnummer" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:199 aleksis/core/models.py:204 msgid "Postal code" msgstr "Postleitzahl" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:200 aleksis/core/models.py:205 msgid "Place" msgstr "Ort" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:202 aleksis/core/templates/core/person/full.html:160 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "Festnetz" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:203 aleksis/core/templates/core/person/full.html:170 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "Handy" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:207 aleksis/core/models.py:212 msgid "Date of birth" msgstr "Geburtsdatum" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:208 aleksis/core/models.py:213 msgid "Place of birth" msgstr "Geburtsort" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:209 aleksis/core/models.py:214 msgid "Sex" msgstr "Geschlecht" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 -msgid "This is an official photo, used for official documents and for internal use cases." -msgstr "Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne Zwecke." +#: aleksis/core/models.py:216 aleksis/core/models.py:545 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 +msgid "" +"This is an official photo, used for official documents and for internal use " +"cases." +msgstr "" +"Dies ist ein offizielles Foto, genutzt für offizielle Dokumente und interne " +"Zwecke." -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:221 aleksis/core/models.py:549 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "Bild/Avatar anzeigen" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:224 aleksis/core/models.py:552 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "Dies ist ein Bild oder ein Avatar für die öffentliche Darstellung." -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:229 aleksis/core/templates/core/person/full.html:235 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "Erziehungsberechtigte / Eltern" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:236 aleksis/core/models.py:241 msgid "Primary group" msgstr "Primärgruppe" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:239 aleksis/core/models.py:719 +#: aleksis/core/models.py:743 aleksis/core/models.py:834 +#: aleksis/core/models.py:1094 aleksis/core/models.py:244 +#: aleksis/core/models.py:724 aleksis/core/models.py:748 +#: aleksis/core/models.py:839 aleksis/core/models.py:1104 +#: aleksis/core/models.py:843 msgid "Description" msgstr "Beschreibung" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:459 aleksis/core/models.py:464 msgid "Title of field" msgstr "Feldtitel" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:461 aleksis/core/models.py:466 msgid "Type of field" msgstr "Feldtyp" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:463 aleksis/core/models.py:468 +msgid "Required" +msgstr "Pflichtfeld" + +#: aleksis/core/models.py:464 aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "Hilfetext/Beschreibung" + +#: aleksis/core/models.py:470 aleksis/core/models.py:475 msgid "Addtitional field for groups" msgstr "Zusätzliche Felder für Gruppen" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:471 aleksis/core/models.py:476 msgid "Addtitional fields for groups" msgstr "Zusätzliche Felder für Gruppen" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:491 aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "Kann Kindgruppen zu Gruppen zuordnen" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:492 aleksis/core/models.py:497 msgid "Can view statistics about group." msgstr "Kann Statistiken über Gruppen sehen." -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:504 aleksis/core/models.py:509 +#: aleksis/core/models.py:1432 msgid "Long name" msgstr "Langname" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:514 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "Mitglieder" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:517 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "Leiter/-innen" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:524 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "Übergeordnete Gruppen" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:532 aleksis/core/models.py:537 msgid "Type of group" msgstr "Gruppentyp" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:718 aleksis/core/models.py:742 +#: aleksis/core/models.py:833 #: aleksis/core/templates/core/announcement/list.html:18 +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:838 aleksis/core/models.py:842 +#: aleksis/core/models.py:1262 msgid "Title" msgstr "Titel" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:721 aleksis/core/models.py:726 msgid "Application" msgstr "Anwendung" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:727 aleksis/core/models.py:732 msgid "Activity" msgstr "Aktivität" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:728 aleksis/core/models.py:733 msgid "Activities" msgstr "Aktivitäten" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:734 aleksis/core/models.py:739 msgid "Sender" msgstr "Absender" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:739 aleksis/core/models.py:744 msgid "Recipient" msgstr "Empfänger" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:744 aleksis/core/models.py:1071 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "Link" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:746 aleksis/core/models.py:751 +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "Benachrichtigung schicken am" + +#: aleksis/core/models.py:748 aleksis/core/models.py:753 +#: aleksis/core/models.py:757 msgid "Read" msgstr "Gelesen" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:749 aleksis/core/models.py:754 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "Versandt" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:766 aleksis/core/models.py:771 +#: aleksis/core/models.py:775 msgid "Notification" msgstr "Benachrichtigung" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:767 aleksis/core/preferences.py:29 +#: aleksis/core/templates/core/base.html:81 +#: aleksis/core/templates/core/notifications.html:4 +#: aleksis/core/templates/core/notifications.html:5 aleksis/core/models.py:772 +#: aleksis/core/models.py:776 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: aleksis/core/models.py:835 aleksis/core/models.py:840 +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "Link zur detaillierten Ansicht" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:838 aleksis/core/models.py:843 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "Datum und Uhrzeit des Anzeigestarts" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:841 aleksis/core/models.py:846 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "Anzeigezeitraum" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:866 aleksis/core/models.py:871 +#: aleksis/core/models.py:875 msgid "Announcement" msgstr "Ankündigung" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:904 aleksis/core/models.py:909 +#: aleksis/core/models.py:913 msgid "Announcement recipient" msgstr "Empfänger der Ankündigung" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:905 aleksis/core/models.py:910 +#: aleksis/core/models.py:914 msgid "Announcement recipients" msgstr "Empfänger der Ankündigung" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:927 aleksis/core/models.py:932 +#: aleksis/core/models.py:934 msgid "Widget Title" msgstr "Widget-Titel" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:928 aleksis/core/models.py:933 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "Widget aktivieren" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:929 aleksis/core/models.py:934 +#: aleksis/core/models.py:936 msgid "Widget is broken" msgstr "Widget ist kaputt" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:932 aleksis/core/models.py:937 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "Größe auf Mobilgeräten" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:933 aleksis/core/models.py:938 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "<= 600 px, 12 Spalten" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:938 aleksis/core/models.py:943 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "Größe auf Tablets" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:939 aleksis/core/models.py:944 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "> 600px, 12 Spalten" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:944 aleksis/core/models.py:949 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "Größe auf Desktopgeräten" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:945 aleksis/core/models.py:950 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "> 992 px, 12 Spalten" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:950 aleksis/core/models.py:955 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "Größe auf großen Desktopgeräten" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:951 aleksis/core/models.py:956 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "> 1200 px, 12 Spalten" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:982 aleksis/core/models.py:987 +#: aleksis/core/models.py:989 msgid "Can edit default dashboard" msgstr "Kann Standarddashboard bearbeiten" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:983 aleksis/core/models.py:988 +#: aleksis/core/models.py:990 msgid "Dashboard Widget" msgstr "Dashboard-Widget" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:984 aleksis/core/models.py:989 +#: aleksis/core/models.py:991 msgid "Dashboard Widgets" msgstr "Dashboard-Widgets" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:990 aleksis/core/models.py:995 +#: aleksis/core/models.py:997 msgid "URL" msgstr "URL" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:991 aleksis/core/models.py:996 +#: aleksis/core/models.py:998 msgid "Icon URL" msgstr "Symbol-URL" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:997 aleksis/core/models.py:1002 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "Externer-Link-Widget" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:998 aleksis/core/models.py:1003 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "Externer-Link-Widgets" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1004 aleksis/core/models.py:1009 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "Inhalt" + +#: aleksis/core/models.py:1010 aleksis/core/models.py:1015 +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "Statischer-Inhalt-Widget" + +#: aleksis/core/models.py:1011 aleksis/core/models.py:1016 +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "Statischer-Inhalt-Widgets" + +#: aleksis/core/models.py:1016 aleksis/core/models.py:1021 +#: aleksis/core/models.py:1023 msgid "Dashboard widget" msgstr "Dashboard-Widget" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1021 aleksis/core/models.py:1026 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "Reihenfolge" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1022 aleksis/core/models.py:1027 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "Teil des Standarddashboards" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1037 aleksis/core/models.py:1042 +#: aleksis/core/models.py:1044 msgid "Dashboard widget order" msgstr "Reihenfolge der Dashboard-Widgets" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1038 aleksis/core/models.py:1043 +#: aleksis/core/models.py:1045 msgid "Dashboard widget orders" msgstr "Reihenfolgen der Dashboard-Widgets" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1044 aleksis/core/models.py:1049 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "Menü-ID" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1057 aleksis/core/models.py:1062 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "Benutzerdefiniertes Menü" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1058 aleksis/core/models.py:1063 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "Benutzerdefinierte Menüs" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1068 aleksis/core/models.py:1075 msgid "Menu" msgstr "Menü" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 +#: aleksis/core/models.py:1072 aleksis/core/models.py:1320 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 +#: aleksis/core/models.py:1079 aleksis/core/models.py:1330 +#: aleksis/core/models.py:752 aleksis/core/models.py:1392 msgid "Icon" msgstr "Symbol" -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1078 aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "Benutzerdefiniertes Menüelement" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1079 aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "Benutzerdefinierte Menüelemente" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1093 aleksis/core/models.py:1103 msgid "Title of type" msgstr "Titel des Typs" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1100 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "Gruppentyp" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1114 aleksis/core/models.py:1124 msgid "Can view system status" msgstr "Kann Systemstatus sehen" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1115 aleksis/core/models.py:1125 msgid "Can manage data" msgstr "Kann Daten verwalten" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1116 aleksis/core/models.py:1126 msgid "Can impersonate" msgstr "Kann sich verkleiden" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1117 aleksis/core/models.py:1127 msgid "Can use search" msgstr "Kann Suche benutzen" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1118 aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "Kann Konfiguration ändern" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1119 aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "Kann Einstellungen einer Person verändern" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1120 aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "Kann Einstellungen einer Gruppe verändern" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1121 aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "Kann die PDF-Generierung testen" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1122 aleksis/core/models.py:1132 msgid "Can invite persons" msgstr "Kann Personen einladen" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1158 aleksis/core/models.py:1168 msgid "Related data check task" msgstr "Zugehörige Datenprüfungsaufgabe" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1166 aleksis/core/models.py:1176 msgid "Issue solved" msgstr "Problem gelöst" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1167 aleksis/core/models.py:1177 msgid "Notification sent" msgstr "Benachrichtigung gesendet" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1180 aleksis/core/models.py:1190 msgid "Data check result" msgstr "Datenprüfungsergebnis" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1181 aleksis/core/models.py:1191 msgid "Data check results" msgstr "Datenprüfungsergebnisse" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1183 aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "Kann Datenprüfungen ausführen" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1184 aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "Kann Datenprüfungsprobleme lösen" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1191 aleksis/core/models.py:1201 msgid "E-Mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1223 aleksis/core/models.py:1233 msgid "Owner" msgstr "Leiter" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1227 aleksis/core/models.py:1237 msgid "File expires at" msgstr "Datei abgelaufen am" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1229 aleksis/core/models.py:1239 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "Generierte HTML-Datei" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1231 aleksis/core/models.py:1241 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "Generierte PDF-Datei" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1238 aleksis/core/models.py:1248 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "PDF-Datei" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1239 aleksis/core/models.py:1249 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "PDF-Dateien" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1244 aleksis/core/models.py:1254 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "Task-Ergebnis" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1247 aleksis/core/models.py:1257 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "Task-Benutzer" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1259 aleksis/core/models.py:1269 +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "Task-Benutzer-Zuordnung" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1260 aleksis/core/models.py:1270 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "Task-Benutzer-Zuordnungen" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1276 aleksis/core/models.py:1286 +#: aleksis/core/models.py:1348 msgid "Additional attributes" msgstr "Zusätzliche Attribute" -#: aleksis/core/models.py:1268 +#: aleksis/core/models.py:1314 aleksis/core/models.py:1324 +#: aleksis/core/models.py:1386 msgid "Allowed scopes that clients can request" msgstr "Erlaubte Scopes, die ein Client anfordern kann" -#: aleksis/core/models.py:1278 -msgid "This image will be shown as icon in the authorization flow. It should be squared." -msgstr "Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es sollte rechteckig sein." +#: aleksis/core/models.py:1324 aleksis/core/models.py:1334 +#: aleksis/core/models.py:1396 +msgid "" +"This image will be shown as icon in the authorization flow. It should be " +"squared." +msgstr "" +"Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es " +"sollte rechteckig sein." + +#: aleksis/core/models.py:1373 aleksis/core/models.py:1383 +msgid "UUID" +msgstr "UUID" + +#: aleksis/core/models.py:1377 aleksis/core/models.py:1387 +msgid "Selected ICal feed" +msgstr "Ausgewählter iCal-Feed" + +#: aleksis/core/models.py:1386 aleksis/core/models.py:1396 +msgid "Personal Calendar URL" +msgstr "Persönliche Kalender-URL" + +#: aleksis/core/models.py:1387 aleksis/core/models.py:1397 +msgid "Personal Calendar URLs" +msgstr "Persönliche Kalender-URLs" #: aleksis/core/preferences.py:25 msgid "General" @@ -1056,115 +1241,152 @@ msgstr "Namensformat für Anreden" msgid "Channels to use for notifications" msgstr "Aktivierte Benachrichtungskanäle" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:209 aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" -msgstr "Regulärer Ausdruck um Primärgruppen zu finden, z. B. '^Class .*'" +msgstr "Regulärer Ausdruck um Primärgruppen zu finden, z.B. '^Class .*'" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:220 aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "Feld um Primärgruppen zu finden" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:232 aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "Erstelle automatisch neue Personen für neue Benutzer" -#: aleksis/core/preferences.py:241 -msgid "Automatically link existing persons to new users by their e-mail address" -msgstr "Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer E-Mail-Adresse" +#: aleksis/core/preferences.py:241 aleksis/core/preferences.py:256 +msgid "" +"Automatically link existing persons to new users by their e-mail address" +msgstr "" +"Verknüpfe existierende Personen automatisch mit neuen Personen anhand ihrer " +"E-Mail-Adresse" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:252 aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "Sichtbarer Name der Schule" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:263 aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" -msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" +msgstr "" +"Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:271 aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "Erlaube Benutzern, ihr Passwort zu ändern" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:279 aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "Erlaube Benutzern, ihr Passwort zurückzusetzen" + +#: aleksis/core/preferences.py:287 aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "Registrierung aktivieren" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:295 aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "Regulärer Ausdruck für erlaubte Benutzernamen" + +#: aleksis/core/preferences.py:303 aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "Einladungen aktivieren" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:311 aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "Länge des Einladungscodes. (Standard: 3: abcde-acbde-abcde)" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:319 aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "Größe der Pakete. (Standard 5: abcde)" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:330 aleksis/core/preferences.py:345 msgid "Allowed Grant Flows for OAuth applications" msgstr "Erlaubte Grant Flows für OAuth-Anwendungen" -#: aleksis/core/preferences.py:328 +#: aleksis/core/preferences.py:344 msgid "Available languages" msgstr "Verfügbare Sprachen" -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:357 aleksis/core/preferences.py:343 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "E-Mails versenden, wenn Datenprüfungen Probleme finden" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:368 aleksis/core/preferences.py:354 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "E-Mailempfänger für Datenprüfungsproblem-E-Mails" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:379 aleksis/core/preferences.py:365 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "E-Mail-Empfängergruppen für Datenprüfungsproblem-E-Mails" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:388 aleksis/core/preferences.py:374 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "Zeige Dashboard für Benutzer ohne Login" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:397 aleksis/core/preferences.py:383 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "Erlaube Benutzern, ihr Dashboard zu bearbeiten" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:408 aleksis/core/preferences.py:394 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "Felder des Personen-Models welche von ihnen selbst editierbar sind." -#: aleksis/core/preferences.py:407 -msgid "Editable fields on person model which should trigger a notification on change" -msgstr "Editierbare Felder des Personen-Models welche eine Benachrichtigung für Änderungen auslösen soll" +#: aleksis/core/preferences.py:423 aleksis/core/preferences.py:409 +#: aleksis/core/preferences.py:424 +msgid "" +"Editable fields on person model which should trigger a notification on change" +msgstr "" +"Editierbare Felder des Personen-Models welche eine Benachrichtigung für " +"Änderungen auslösen soll" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:437 aleksis/core/preferences.py:423 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "Kontakt für Benachrichtigung, wenn eine Person ihre Daten ändert" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:448 aleksis/core/preferences.py:434 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "Persönliche Fotos Avataren vorziehen" + +#: aleksis/core/preferences.py:458 aleksis/core/preferences.py:444 +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "PDF-Datei-Ablaufdauer" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:459 aleksis/core/preferences.py:445 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "in Minuten" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:469 aleksis/core/preferences.py:455 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "Automatisch das Dashboard und seine Widgets aktualisieren" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:479 aleksis/core/preferences.py:465 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" -msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen Seite)" +msgstr "" +"Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganzen " +"Seite)" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:489 aleksis/core/preferences.py:475 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "Land für das Einlesen von Telefonnummern" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:540 aleksis/core/settings.py:541 +#: aleksis/core/settings.py:539 msgid "English" msgstr "Englisch" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:541 aleksis/core/settings.py:542 +#: aleksis/core/settings.py:540 msgid "German" msgstr "Deutsch" @@ -1172,14 +1394,17 @@ msgstr "Deutsch" #: aleksis/core/templates/core/announcement/list.html:36 #: aleksis/core/templates/core/group/full.html:24 #: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/person/full.html:86 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 +#: aleksis/core/tables.py:25 aleksis/core/templates/core/group/full.html:26 msgid "Edit" msgstr "Bearbeiten" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 #: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 msgid "Actions" msgstr "Aktionen" @@ -1190,8 +1415,11 @@ msgstr "Aktionen" #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 #: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 +#: aleksis/core/templates/core/person/full.html:93 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 aleksis/core/templates/core/group/full.html:33 msgid "Delete" msgstr "Löschen" @@ -1212,12 +1440,14 @@ msgstr "" #: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16 msgid "" "\n" -" If you think this is an error in AlekSIS, please contact your site\n" +" If you think this is an error in AlekSIS, please contact your " +"site\n" " administrators:\n" " " msgstr "" "\n" -" Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" +" Wenn Sie der Meinung sind, dass es sich um einen Fehler in " +"AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" " Systemadministratoren:\n" " " @@ -1229,7 +1459,8 @@ msgid "" " " msgstr "" "\n" -" Wenn Sie über einen Link auf einer externen Seite hierher gelangt sind,\n" +" Wenn Sie über einen Link auf einer externen Seite hierher " +"gelangt sind,\n" " ist es möglich, dass dieser veraltet war.\n" " " @@ -1244,15 +1475,21 @@ msgstr "" #: aleksis/core/templates/500.html:13 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" +" Your site administrators will automatically be notified about " +"this\n" " error. You can also contact them directly:\n" " " msgstr "" "\n" -" Ihre Administratoren werden automatisch über diesen Fehler informiert.\n" +" Ihre Administratoren werden automatisch über diesen Fehler " +"informiert.\n" " Sie können diese auch direkt kontaktieren:\n" " " +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "Wiederholen" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1264,11 +1501,13 @@ msgstr "" #: aleksis/core/templates/503.html:13 msgid "" "\n" -" This page is currently unavailable. If this error persists, contact your site administrators:\n" +" This page is currently unavailable. If this error persists, " +"contact your site administrators:\n" " " msgstr "" "\n" -" Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler bestehen bleibt, kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n" +" Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler " +"bestehen bleibt, kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n" " " #: aleksis/core/templates/account/account_inactive.html:5 @@ -1309,17 +1548,27 @@ msgstr "Bestätigen" #: aleksis/core/templates/account/email_confirm.html:12 #, python-format -msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s." -msgstr "Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-Mail-Adresse für den Benutzer %(user_display)s ist." +msgid "" +"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail " +"address for user %(user_display)s." +msgstr "" +"Bitte bestätigen Sie, dass <a href=\"mailto:%(email)s\">%(email)s</a> eine E-" +"Mail-Adresse für den Benutzer %(user_display)s ist." #: aleksis/core/templates/account/email_confirm.html:25 #, python-format -msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." -msgstr "Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>." +msgid "" +"This e-mail confirmation link expired or is invalid. Please <a href=" +"\"%(email_url)s\">issue a new e-mail confirmation request</a>." +msgstr "" +"Dieser E-Mail-Bestätigungslink ist abgelaufen oder nicht gültig. Bitte <a " +"href=\"%(email_url)s\">fragen Sie eine neue E-Mail-Bestätigung an</a>." #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" -msgstr "Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es zurückzusetzen:" +msgstr "" +"Haben Sie Ihr aktuelles Passwort vergessen? Klicken Sie hier, um es " +"zurückzusetzen:" #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot Password?" @@ -1338,11 +1587,13 @@ msgstr "Passwortänderung deaktiviert." msgid "" "\n" " Users are not allowed to edit their own passwords. If you think\n" -" this is an error please contact one of your site administrators.\n" +" this is an error please contact one of your site " +"administrators.\n" " " msgstr "" "\n" -" Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie denken, \n" +" Benutzer dürfen ihre eigenen Passwörter nicht ändern. Wenn Sie " +"denken, \n" "dass dies ein Fehler ist, kontaktieren Sie bitte einen der Administratoren:\n" " " @@ -1357,8 +1608,12 @@ msgid "Reset password" msgstr "Passwort zurücksetzen" #: aleksis/core/templates/account/password_reset.html:17 -msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." -msgstr "Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken." +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll send you " +"an e-mail allowing you to reset it." +msgstr "" +"Passwort vergessen? Geben Sie Ihre E-Mail-Adresse hier ein und wir werden " +"Ihnen eine E-Mail zum Zurücksetzen des Passwortes schicken." #: aleksis/core/templates/account/password_reset.html:30 msgid "" @@ -1381,7 +1636,8 @@ msgid "" " " msgstr "" "\n" -" Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie einen der Administratoren,\n" +" Wir haben Ihnen eine E-Mail gesendet. Bitte kontaktieren Sie " +"einen der Administratoren,\n" "wenn Sie diese nicht innerhalb weniger Minuten erhalten.\n" " " @@ -1393,12 +1649,16 @@ msgstr "Ungültiges Token" #, python-format msgid "" "\n" -" The password reset link was invalid, possibly because it has already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" +" The password reset link was invalid, possibly because it has " +"already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" " class=\"blue-text text-lighten-2\">new password reset</a>.\n" " " msgstr "" "\n" -" Der Link zum Zurücksetzen des Passwortes war falsch, wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue Anfrage <a href=\"%(passwd_reset_url)s\" class=\"blue-text text-lighten-2\">zum Zurücksetzen des Passwortes</a>.\n" +" Der Link zum Zurücksetzen des Passwortes war falsch, " +"wahrscheinlich, weil er bereits benutzt wurde. Bitte starten Sie eine neue " +"Anfrage <a href=\"%(passwd_reset_url)s\" class=\"blue-text text-" +"lighten-2\">zum Zurücksetzen des Passwortes</a>.\n" " " #: aleksis/core/templates/account/password_reset_from_key.html:25 @@ -1447,8 +1707,11 @@ msgstr "Registrierung" #: aleksis/core/templates/account/signup.html:12 #, python-format -msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." -msgstr "Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich bitte an</a>." +msgid "" +"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." +msgstr "" +"Haben Sie bereits ein Konto? Dann <a href=\"%(login_url)s\">melden Sie sich " +"bitte an</a>." #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 @@ -1467,7 +1730,8 @@ msgid "" " " msgstr "" "\n" -" Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass dies ein Fehler ist,\n" +" Die Registrierung ist aktuell geschlossen. Wenn Sie denken, dass " +"dies ein Fehler ist,\n" " kontaktieren Sie bitte einen Ihrer Systemadministratoren.\n" " " @@ -1487,13 +1751,17 @@ msgstr "Verifizieren Sie Ihre E-Mail!" #: aleksis/core/templates/account/verification_sent.html:16 msgid "" "\n" -" This part of the site requires us to verify that you are who you claim to be.\n" -" For this purpose, we require that you verify ownership of your e-mail address.\n" +" This part of the site requires us to verify that you are who you " +"claim to be.\n" +" For this purpose, we require that you verify ownership of your e-" +"mail address.\n" " " msgstr "" "\n" -" Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, dass Sie die Person sind, die sie vorgeben, zu sein.\n" -"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-Adresse bestätigen.\n" +" Dieser Teil der Anwendung setzt voraus, dass wir verifizieren, " +"dass Sie die Person sind, die sie vorgeben, zu sein.\n" +"Zu diesem Zweck setzen wir voraus, dass Sie die Inhaberschaft Ihrer E-Mail-" +"Adresse bestätigen.\n" " " #: aleksis/core/templates/account/verification_sent.html:22 @@ -1507,7 +1775,8 @@ msgstr "" "\n" " Wir haben Ihnen eine E-Mail zur Verifizierung geschickt.\n" "Bitte klicken Sie auf den Link in dieser E-Mail.\n" -"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten erhalten.\n" +"Bitte kontaktieren Sie uns, wenn Sie diese nicht binnen weniger Minuten " +"erhalten.\n" " " #: aleksis/core/templates/core/additional_field/edit.html:6 @@ -1534,7 +1803,7 @@ msgid "Publish new announcement" msgstr "Neue Ankündigung veröffentlichen" #: aleksis/core/templates/core/announcement/form.html:34 -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "Ankündigung speichern und veröffentlichen" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1553,19 +1822,15 @@ msgstr "Empfänger" msgid "There are no announcements." msgstr "Es gibt aktuell keine Ankündigungen." -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "Angemeldet als" - -#: aleksis/core/templates/core/base.html:179 +#: aleksis/core/templates/core/base.html:213 msgid "About AlekSIS® — The Free School Information System" msgstr "Über AlekSIS® — The Free School Information System" -#: aleksis/core/templates/core/base.html:187 +#: aleksis/core/templates/core/base.html:221 msgid "Imprint" msgstr "Impressum" -#: aleksis/core/templates/core/base.html:195 +#: aleksis/core/templates/core/base.html:229 msgid "Privacy Policy" msgstr "Datenschutzerklärung" @@ -1592,7 +1857,8 @@ msgid "" " " msgstr "" "\n" -" Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" zu laden.\n" +" Es ist ein Problem dabei aufgetreten, das Widget \"%(title)s\" " +"zu laden.\n" "Sie brauchen nichts weiter machen.\n" " " @@ -1688,29 +1954,42 @@ msgstr "Dashboard bearbeiten" #: aleksis/core/templates/core/edit_dashboard.html:24 msgid "" "\n" -" On this page you can arrange your personal dashboard. You can drag any items from \"Available widgets\" to \"Your\n" -" Dashboard\" or change the order by moving the widgets. After you have finished, please don't forget to click on\n" +" On this page you can arrange your personal dashboard. You can drag " +"any items from \"Available widgets\" to \"Your\n" +" Dashboard\" or change the order by moving the widgets. After you " +"have finished, please don't forget to click on\n" " \"Save\".\n" " " msgstr "" "\n" -" Auf dieser Seite können Sie Ihr persönliches Dashboard zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren Widgets\" \n" -"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n" +" Auf dieser Seite können Sie Ihr persönliches Dashboard " +"zusammenstallen. Sie können beliebige Elemente von den \"Verfügbaren Widgets" +"\" \n" +"in \"Ihr Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die " +"Widgets bewegen. Wenn Sie fertig sind, vergessen Sie bitte nicht, \n" "auf \"Speichern\" zu drücken.\n" " " #: aleksis/core/templates/core/edit_dashboard.html:30 msgid "" "\n" -" On this page you can arrange the default dashboard which is shown when a user doesn't arrange his own\n" -" dashboard. You can drag any items from \"Available widgets\" to \"Default Dashboard\" or change the order\n" -" by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n" +" On this page you can arrange the default dashboard which is shown " +"when a user doesn't arrange his own\n" +" dashboard. You can drag any items from \"Available widgets\" to " +"\"Default Dashboard\" or change the order\n" +" by moving the widgets. After you have finished, please don't " +"forget to click on \"Save\".\n" " " msgstr "" "\n" -" Auf dieser Seite können Sie Ihr das Standard-Dashboard zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes definiert. \n" -"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets bewegen. \n" -"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu drücken.\n" +" Auf dieser Seite können Sie Ihr das Standard-Dashboard " +"zusammenstallen, welches angezeigt wird, wenn ein Benutzer kein eigenes " +"definiert. \n" +"Sie können beliebige Elemente von den \"Verfügbaren Widgets\" in \"Standard-" +"Dashboard\" ziehen oder die Reihenfolge verändern, indem Sie die Widgets " +"bewegen. \n" +"Wenn Sie fertig sind, vergessen Sie bitte nicht, auf \"Speichern\" zu " +"drücken.\n" " " #: aleksis/core/templates/core/edit_dashboard.html:48 @@ -1728,12 +2007,15 @@ msgstr "Standard-Dashboard" #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" -" You can use this to assign child groups to groups. Please use the filters below to select groups you want to\n" +" You can use this to assign child groups to groups. Please use the " +"filters below to select groups you want to\n" " change and click \"Next\".\n" " " msgstr "" "\n" -" Sie können diese Seite verwenden, um Kindgruppen zu Gruppen zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen auszuwählen, die Sie \n" +" Sie können diese Seite verwenden, um Kindgruppen zu Gruppen " +"zuzuordnen. Bitte nutzen Sie die folgenden Filter, um die Gruppen " +"auszuwählen, die Sie \n" " ändern möchten und klicken auf \"Weiter\".\n" " " @@ -1774,14 +2056,18 @@ msgstr "Bitte seien Sie vorsichtig!" #: aleksis/core/templates/core/group/child_groups.html:79 msgid "" "\n" -" If you click \"Back\" or \"Next\" the current group assignments are not saved.\n" -" If you click \"Save\", you will overwrite all existing child group relations for this group with what you\n" +" If you click \"Back\" or \"Next\" the current group assignments " +"are not saved.\n" +" If you click \"Save\", you will overwrite all existing child " +"group relations for this group with what you\n" " selected on this page.\n" " " msgstr "" "\n" -" Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die aktuellen Gruppenzuordnungen nicht gespeichert.\n" -"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen von Kindgruppen für diese Gruppe\n" +" Wenn Sie auf \"Zurück\" oder \"Weiter\" klicken, werden die " +"aktuellen Gruppenzuordnungen nicht gespeichert.\n" +"Wenn Sie auf \"Speichern\" klicken, werden alle existierenden Zuordnungen " +"von Kindgruppen für diese Gruppe\n" "mit dem überschrieben, was Sie auf dieser Seite ausgewählt haben.\n" " " @@ -1817,23 +2103,28 @@ msgstr "Gruppe editieren" #: aleksis/core/templates/core/group/full.html:38 #: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/person/full.html:100 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "Einstellungen ändern" #: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 msgid "Statistics" msgstr "Statistiken" #: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "Anzahl der Mitglieder" #: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "Durchschnittsalter" #: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "Altersbereich" @@ -1871,27 +2162,72 @@ msgstr "Gruppentyp editieren" msgid "Create group type" msgstr "Gruppentyp erstellen" +#: aleksis/core/templates/core/ical/ical_create.html:4 +#: aleksis/core/templates/core/ical/ical_create.html:5 +#: aleksis/core/templates/core/ical/ical_list.html:12 +msgid "Create iCal URL" +msgstr "iCal-URL erstellen" + +#: aleksis/core/templates/core/ical/ical_create.html:16 +#: aleksis/core/templates/core/ical/ical_edit.html:16 +#: aleksis/core/templates/oauth2_provider/application/create.html:14 +#: aleksis/core/templates/oauth2_provider/application/edit.html:14 +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 +#: aleksis/core/templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "Abbrechen" + +#: aleksis/core/templates/core/ical/ical_edit.html:4 +#: aleksis/core/templates/core/ical/ical_edit.html:5 +#, python-format +msgid "Edit iCal URL %(object)s" +msgstr "iCal-URL %(object)s bearbeiten" + +#: aleksis/core/templates/core/ical/ical_list.html:4 +#: aleksis/core/templates/core/ical/ical_list.html:5 +msgid "ICal Feeds" +msgstr "iCal-Feeds" + +#: aleksis/core/templates/core/ical/ical_list.html:8 +msgid "" +"These are URLs for different Calendar Feeds in the iCal (.ics) format. You " +"can create as many as you want and import them in your calendar software." +msgstr "" +"Dies sind URLs für verschiedene Kalender-Feeds im iCal-Format (.ics). Sie " +"können so viele erstellen, wie sie wollen, und in Ihre Kalender-Software " +"importieren." + +#: aleksis/core/templates/core/ical/ical_list.html:14 +msgid "Your iCal URLs" +msgstr "Deine iCal-URLs" + #: aleksis/core/templates/core/index.html:4 msgid "Home" msgstr "Startseite" #: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" -" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" +" You didn't customise your dashboard so that you see the system " +"default. Please click on \"Edit dashboard\" to\n" " customise your personal dashboard.\n" " " msgstr "" "\n" -" Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-Dashboard sehen.\n" -"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches Dashboard anzupassen.\n" +" Sie haben Ihr Dashboard nicht angepasst, sodass Sie das Standard-" +"Dashboard sehen.\n" +"Bitte klicken Sie auf \"Dashboard bearbeiten\", um Ihr persönliches " +"Dashboard anzupassen.\n" " " #: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "Letzte Aktivitäten" #: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "Aktuell keine Aktivitäten verfügbar." @@ -1924,25 +2260,31 @@ msgstr "Über AlekSIS" #: aleksis/core/templates/core/pages/about.html:17 msgid "" "\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" +" This platform is powered by AlekSIS®, a web-based school " +"information system (SIS) which can be used\n" +" to manage and/or publish organisational artifacts of " +"educational institutions. AlekSIS is free software and\n" " can be used by anyone.\n" " " msgstr "" "\n" -" Diese Plattform wird mit AlekSIS®, einem webbasierten Schulinformationssystem (SIS), \n" -"welches für die Verwaltung und/oder Veröffentlichung von Bildungseinrichtungen verwendet werden kann.\n" +" Diese Plattform wird mit AlekSIS®, einem webbasierten " +"Schulinformationssystem (SIS), \n" +"welches für die Verwaltung und/oder Veröffentlichung von " +"Bildungseinrichtungen verwendet werden kann.\n" "AlekSIS ist freie Software und kann von jedem benutzt werden.\n" " " #: aleksis/core/templates/core/pages/about.html:24 msgid "" "\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" +" AlekSIS® is a registered trademark of the AlekSIS open source " +"project, represented by Teckids e.V.\n" " " msgstr "" "\n" -" AlekSIS® ist eine eingetragene Wortmarke des Open-Source-Projektes AlekSIS, vertreten durch den Teckids e.V.\n" +" AlekSIS® ist eine eingetragene Wortmarke des Open-Source-" +"Projektes AlekSIS, vertreten durch den Teckids e.V.\n" " " #: aleksis/core/templates/core/pages/about.html:30 @@ -1960,14 +2302,18 @@ msgstr "Lizenzinformationen" #: aleksis/core/templates/core/pages/about.html:42 msgid "" "\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" +" The core and the official apps of AlekSIS are licenced under " +"the EUPL, version 1.2 or later. For licence\n" +" information from third-party apps, if installed, refer to the " +"respective components below. The\n" " licences are marked like this:\n" " " msgstr "" "\n" -" Der Core und die offiziellen Apps von AlekSIS sind unter der EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n" -"zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n" +" Der Core und die offiziellen Apps von AlekSIS sind unter der " +"EUPL, Version 1.2 oder später, lizenziert. Für Lizenzinformationen\n" +"zu Apps von Drittanbietern, wenn installiert, siehe direkt bei der " +"jeweiligen App weiter unten auf dieser Seite. Die Lizenzen\n" "sind wie folgt markiert:\n" " " @@ -2017,11 +2363,13 @@ msgstr "" #: aleksis/core/templates/core/pages/progress.html:27 msgid "" "\n" -" Without activated JavaScript the progress status can't be updated.\n" +" Without activated JavaScript the progress status can't be " +"updated.\n" " " msgstr "" "\n" -" Ohne aktiviertes JavaScript kann der Fortschritt leider nicht aktualisiert werden.\n" +" Ohne aktiviertes JavaScript kann der Fortschritt leider nicht " +"aktualisiert werden.\n" " " #: aleksis/core/templates/core/pages/progress.html:47 @@ -2033,92 +2381,98 @@ msgstr "Zurück" msgid "System checks" msgstr "Systemprüfungen" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "Wartungsmodus aktiviert" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access " +"thesite.\n" " " msgstr "" "\n" -" Nur Administratoren und Besucher von internen IP-Adressen können die Seite aufrufen.\n" +" Nur Administratoren und Besucher von internen IP-Adressen " +"können die Seite aufrufen.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "Wartungsmodus deaktiviert" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "Jeder kann die Seite aufrufen." -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "Debug-Modus aktiviert" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" -" The web server throws back debug information on errors. Do not use in production!\n" +" The web server throws back debug information on errors. Do " +"not use in production!\n" " " msgstr "" "\n" -" Der Server gibt Debug-Informationen bei Fehlern zurück. Nicht im Produktivbetrieb nutzen!\n" +" Der Server gibt Debug-Informationen bei Fehlern zurück. " +"Nicht im Produktivbetrieb nutzen!\n" " " -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "Debug-Modus deaktivert" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" -" Debug mode is disabled. Default error pages are displayed on errors.\n" +" Debug mode is disabled. Default error pages are displayed on " +"errors.\n" " " msgstr "" "\n" -" Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden bei Fehlern angezeigt.\n" +" Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden " +"bei Fehlern angezeigt.\n" " " -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 msgid "System health checks" msgstr "Systemprüfungen" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "Dienst" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 msgid "Status" msgstr "Status" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "Dauer" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "Sekunden" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "Celery Task-Ergebnisse" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "Task" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "ID" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 msgid "Date done" msgstr "Erledigungszeitpunkt" @@ -2130,11 +2484,13 @@ msgstr "PDF-Generierung testen" #: aleksis/core/templates/core/pages/test_pdf.html:14 msgid "" "\n" -" This simple view can be used to ensure the correct function of the built-in PDF generation system.\n" +" This simple view can be used to ensure the correct function of the " +"built-in PDF generation system.\n" " " msgstr "" "\n" -" Diese einfache Seite kann genutzt werden, um die korrekte Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n" +" Diese einfache Seite kann genutzt werden, um die korrekte " +"Funktionalität des eingebauten PDF-Generierungssystem zu testen.\n" " " #: aleksis/core/templates/core/partials/announcements.html:8 @@ -2171,6 +2527,19 @@ msgstr "" " Gültig von %(from)s – %(until)s\n" " " +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +#: aleksis/core/templates/core/person/full.html:213 +#: aleksis/core/templates/core/person/full.html:214 +msgid "Avatar" +msgstr "Avatar" + +#: aleksis/core/templates/core/partials/avatar_content.html:19 +#: aleksis/core/templates/core/partials/avatar_content.html:20 +#: aleksis/core/templates/core/partials/avatar_content.html:18 +msgid "Identicon" +msgstr "Identicon" + #: aleksis/core/templates/core/partials/crud_events.html:15 msgid "Changed by" msgstr "Verändert von" @@ -2180,22 +2549,26 @@ msgid "Unknown" msgstr "Unbekannt" #: aleksis/core/templates/core/partials/language_form.html:15 +#: aleksis/core/templates/core/partials/language_form.html:17 msgid "Language" msgstr "Sprache" #: aleksis/core/templates/core/partials/language_form.html:27 +#: aleksis/core/templates/core/partials/language_form.html:29 msgid "Select language" msgstr "Sprache auswählen" #: aleksis/core/templates/core/partials/no_person.html:12 msgid "" "\n" -" Your administrator account is not linked to any person. Therefore,\n" +" Your administrator account is not linked to any person. " +"Therefore,\n" " a dummy person has been linked to your account.\n" " " msgstr "" "\n" -" Ihr Administratorenkonto ist mit keiner Person verknüpft. Deshalb\n" +" Ihr Administratorenkonto ist mit keiner Person verknüpft. " +"Deshalb\n" " wurde Ihr Konto mit einer Dummyperson verknüpft.\n" " " @@ -2208,8 +2581,10 @@ msgid "" " " msgstr "" "\n" -" Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das bedeutet, dass Sie\n" -" keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie sich an\n" +" Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das " +"bedeutet, dass Sie\n" +" keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie " +"sich an\n" " die Verwaltenden von AlekSIS an Ihrer Schule.\n" " " @@ -2270,24 +2645,24 @@ msgid "Edit person" msgstr "Person editieren" #: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 +#: aleksis/core/templates/core/person/full.html:107 msgid "Impersonate" msgstr "Verkleiden" #: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 +#: aleksis/core/templates/core/person/full.html:114 msgid "Invite user" msgstr "Benutzer einladen" -#: aleksis/core/templates/core/person/full.html:133 +#: aleksis/core/templates/core/person/full.html:121 msgid "Contact details" msgstr "Kontaktdetails" -#: aleksis/core/templates/core/person/full.html:224 +#: aleksis/core/templates/core/person/full.html:220 msgid "This person didn't upload a personal photo." msgstr "Diese Person hat kein persönliches Foto hochgeladen." -#: aleksis/core/templates/core/person/full.html:232 +#: aleksis/core/templates/core/person/full.html:228 msgid "Children" msgstr "Kinder" @@ -2336,7 +2711,9 @@ msgid "The invite feature is disabled." msgstr "Die Einladungsfunktion ist deaktiviert." #: aleksis/core/templates/invitations/disabled.html:15 -msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgid "" +"To enable it, switch on the corresponding checkbox in the authentication " +"section of the " msgstr "" "Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt \"Authentifikation" "\" der " @@ -2397,13 +2774,6 @@ msgstr "Die Einladung für %(email)s wurde akzeptiert." msgid "Register OAuth2 Application" msgstr "OAuth2-Anwendung registrieren" -#: aleksis/core/templates/oauth2_provider/application/create.html:14 -#: aleksis/core/templates/oauth2_provider/application/edit.html:14 -#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 -#: aleksis/core/templates/two_factor/_wizard_actions.html:6 -msgid "Cancel" -msgstr "Abbrechen" - #: aleksis/core/templates/oauth2_provider/application/detail.html:5 msgid "OAuth2 Application" msgstr "OAuth2-Anwendung" @@ -2474,7 +2844,8 @@ msgstr "Erfolg!" #: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 msgid "Please return to your application and enter this code:" -msgstr "Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:" +msgstr "" +"Bitte gehen Sie zurück in Ihre Anwendung und geben Sie diesen Code ein:" #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 @@ -2484,7 +2855,9 @@ msgstr "Zugriff zurückziehen" #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 msgid "Are you sure to revoke the access for this application?" -msgstr "Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen möchten?" +msgstr "" +"Sind Sie sicher, dass Sie den Zugriff für diese Anwendung zurückziehen " +"möchten?" #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 msgid "Revoke" @@ -2498,25 +2871,26 @@ msgstr "Keine autorisierten Anwendungen." msgid "Network error" msgstr "Netzwerkfehler" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." -msgstr "" -"Keine\n" -" Internetverbindung." +#: aleksis/core/templates/offline.html:10 +msgid "No internet connection." +msgstr "Keine Internetverbindung." -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" -" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +" There was an error accessing this page. You probably don't have an " +"internet connection. Check to see if your WiFi\n" +" or mobile data is turned on and try again. If you think you are " +"connected, please contact the system\n" " administrators:\n" " " msgstr "" "\n" -" Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile Daten aktiv sind, \n" -" und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n" +" Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell haben " +"Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile Daten " +"aktiv sind, \n" +" und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie mit " +"dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer \n" " Systemadministratoren:\n" " " @@ -2552,12 +2926,14 @@ msgstr "Anmeldung über Drittanbieter-Konto fehlgeschlagen." #: aleksis/core/templates/socialaccount/authentication_error.html:15 msgid "" "\n" -" An error occurred while attempting to login via your third-party account.\n" +" An error occurred while attempting to login via your third-party " +"account.\n" " Please contact one of your site administrators.\n" " " msgstr "" "\n" -" Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto durchzuführen, ist ein Fehler aufgetreten.\n" +" Beim dem Versuch, die Anmeldung über Ihr Drittanbieter-Konto " +"durchzuführen, ist ein Fehler aufgetreten.\n" " Kontaktieren Sie bitte einen Ihrer Systemadministratoren:\n" " " @@ -2572,7 +2948,8 @@ msgstr "Löschen" #: aleksis/core/templates/socialaccount/connections.html:34 msgid "You currently have no third-party accounts connected to this account." -msgstr "Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden." +msgstr "" +"Sie haben aktuell keine Drittanbieter-Konten mit Ihrem Konto verbunden." #: aleksis/core/templates/socialaccount/connections.html:37 msgid "Add a Third-party Account" @@ -2581,12 +2958,15 @@ msgstr "Ein Drittanbieter-Konto hinzufügen" #: aleksis/core/templates/socialaccount/login.html:12 #, python-format msgid "You are about to connect a new third party account from %(provider)s." -msgstr "Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden." +msgstr "" +"Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden." #: aleksis/core/templates/socialaccount/login.html:23 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." -msgstr "Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s anzumelden." +msgstr "" +"Sie sind dabei, sich mit einem Drittanbieterkonto von %(provider)s " +"anzumelden." #: aleksis/core/templates/socialaccount/login.html:28 msgid "Continue" @@ -2602,11 +2982,15 @@ msgstr "Login abgebrochen" #, python-format msgid "" "\n" -" You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n" +" You decided to cancel logging in to our site using one of your " +"existing accounts. If this was a mistake, please proceed to <a href=" +"\"%(login_url)s\">sign in</a>.\n" " " msgstr "" "\n" -" Sie haben sich entschieden, die Anmeldung mit einem Ihrer bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a href=\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n" +" Sie haben sich entschieden, die Anmeldung mit einem Ihrer " +"bestehenden Konten bei uns abzubrechen. Wenn dies ein Fehler war, <a href=" +"\"%(login_url)s\">fahren Sie bitte mit dem Login fort</a>.\n" " " #: aleksis/core/templates/socialaccount/signup.html:12 @@ -2615,7 +2999,8 @@ msgid "" "You are about to use your %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" -"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s zu nutzen. \n" +"Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung bei %(site_name)s " +"zu nutzen. \n" "Als ein letzter Schritt vervollständigen Sie bitte das folgende Formular:" #: aleksis/core/templates/socialaccount/snippets/provider_list.html:12 @@ -2663,7 +3048,8 @@ msgstr "Celery-Task %(task_name)s fehlgeschlagen!" #: aleksis/core/templates/templated_email/celery_failure.email:7 #, python-format msgid "the celery task %(task_name)s failed with following information:" -msgstr "der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:" +msgstr "" +"der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:" #: aleksis/core/templates/templated_email/celery_failure.email:10 #: aleksis/core/templates/templated_email/celery_failure.email:29 @@ -2693,7 +3079,8 @@ msgid "" " " msgstr "" "\n" -" der Celery-Task %(task_name)s ist mit folgenden Informationen fehlgeschlagen:\n" +" der Celery-Task %(task_name)s ist mit folgenden Informationen " +"fehlgeschlagen:\n" " " #: aleksis/core/templates/templated_email/data_checks.email:3 @@ -2703,21 +3090,25 @@ msgstr "Das System hat einige neue Probleme mit Ihren Daten entdeckt." #: aleksis/core/templates/templated_email/data_checks.email:6 msgid "" "the system detected some new problems with your data.\n" -"Please take some time to inspect them and solve the issues or mark them as ignored." +"Please take some time to inspect them and solve the issues or mark them as " +"ignored." msgstr "" "das System hat einige neue Probleme mit Ihren Daten entdeckt.\n" -"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren." +"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder " +"als ignoriert zu markieren." #: aleksis/core/templates/templated_email/data_checks.email:15 msgid "" "\n" " the system detected some new problems with your data.\n" -" Please take some time to inspect them and solve the issues or mark them as ignored.\n" +" Please take some time to inspect them and solve the issues or mark them " +"as ignored.\n" " " msgstr "" "\n" " das System hat einige neue Probleme mit Ihren Daten entdeckt.\n" -"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder als ignoriert zu markieren.\n" +"Bitte nehmen Sie sich etwas Zeit, diese zu überprüfen und sie zu lösen oder " +"als ignoriert zu markieren.\n" " " #: aleksis/core/templates/templated_email/data_checks.email:23 @@ -2788,7 +3179,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "Zwei-Faktor-Authentifizierung aktivieren" @@ -2803,16 +3194,21 @@ msgid "" "\n" " Backup tokens can be used when your primary and backup\n" " phone numbers aren't available. The backup tokens below can be used\n" -" for login verification. If you've used up all your backup tokens, you\n" -" can generate a new set of backup tokens. Only the backup tokens shown\n" +" for login verification. If you've used up all your backup tokens, " +"you\n" +" can generate a new set of backup tokens. Only the backup tokens " +"shown\n" " below will be valid.\n" " " msgstr "" "\n" " Backup-Token können genutzt werden, wenn Ihre primären und Backup-\n" -" Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können für\n" -" die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-Tokens genutzt haben,\n" -" müssen Sie neue generieren. Nur gültige Backup-Tokens werden angezeigt.\n" +" Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können " +"für\n" +" die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-" +"Tokens genutzt haben,\n" +" müssen Sie neue generieren. Nur gültige Backup-Tokens werden " +"angezeigt.\n" " " #: aleksis/core/templates/two_factor/core/backup_tokens.html:33 @@ -2856,7 +3252,9 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:47 msgid "Please login with your account to use the external application." -msgstr "Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu benutzen." +msgstr "" +"Bitte melden Sie sich mit Ihrem Konto an, um die externe Anwendung zu " +"benutzen." #: aleksis/core/templates/two_factor/core/login.html:54 msgid "Please login to see this page." @@ -2865,7 +3263,8 @@ msgstr "Bitte melden Sie sich an, um diese Seite zu sehen." #: aleksis/core/templates/two_factor/core/login.html:65 msgid "" "\n" -" We are calling your phone right now, please enter the\n" +" We are calling your phone right now, please enter " +"the\n" " digits you hear.\n" " " msgstr "" @@ -2877,7 +3276,8 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:70 msgid "" "\n" -" We sent you a text message, please enter the tokens we\n" +" We sent you a text message, please enter the tokens " +"we\n" " sent.\n" " " msgstr "" @@ -2901,14 +3301,19 @@ msgstr "" #: aleksis/core/templates/two_factor/core/login.html:81 msgid "" "\n" -" Use this form for entering backup tokens for logging in.\n" -" These tokens have been generated for you to print and keep safe. Please\n" -" enter one of these backup tokens to login to your account.\n" +" Use this form for entering backup tokens for logging " +"in.\n" +" These tokens have been generated for you to print and " +"keep safe. Please\n" +" enter one of these backup tokens to login to your " +"account.\n" " " msgstr "" "\n" -" Nutzen Sie dieses Formular um Ihre Backup-Tokens zum Anmelden einzugeben.\n" -" Diese Tokens wurden für Sie generiert, um diese gut aufzubewahren. Bitte\n" +" Nutzen Sie dieses Formular um Ihre Backup-Tokens zum " +"Anmelden einzugeben.\n" +" Diese Tokens wurden für Sie generiert, um diese gut " +"aufzubewahren. Bitte\n" " geben Sie einen dieser Tokens ein, um sich einzuloggen.\n" " " @@ -2920,15 +3325,15 @@ msgstr "Gerät aktuell nicht verfügbar?" msgid "Or, alternatively, use one of your backup phones:" msgstr "Oder, alternativ, nutzen Sie eins Ihrer Backup-Telefone:" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "Als letzte Möglichkeit können Sie einen Backup-Token nutzen:" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "Backup-Token nutzen" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "Alternative Anmeldemöglichkeiten nutzen" @@ -2939,11 +3344,13 @@ msgstr "Zugriff verwehrt" #: aleksis/core/templates/two_factor/core/otp_required.html:10 msgid "" "The page you requested, enforces users to verify using\n" -" two-factor authentication for security reasons. You need to enable these\n" +" two-factor authentication for security reasons. You need to enable " +"these\n" " security features in order to access this page." msgstr "" "Die von Ihnen gewünschte Seite erfordert aus Sicherheitsgründen\n" -" eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen diese\n" +" eine Verifizierung durch Zwei-Faktor-Authentifizierung. Sie müssen " +"diese\n" " Sicherheitsfunktion aktivieren, um diese Seite aufzurufen." #: aleksis/core/templates/two_factor/core/otp_required.html:14 @@ -2988,9 +3395,10 @@ msgid "" " " msgstr "" "\n" -" Sie sind dabei, Ihre Accountsicherheit auf das\n" -" nächste Level zu erhöhen. Bitte folgen Sie den Schritten im Wizard um die\n" -" Zwei-Faktor-Authentifizierug zu aktivieren.\n" +" Sie sind dabei, Ihre Account-Sicherheit auf das\n" +" nächste Level zu erhöhen. Bitte folgen Sie den Schritten im " +"Assistenten, um die\n" +" Zwei-Faktor-Authentifizierung zu aktivieren.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:17 @@ -3000,14 +3408,16 @@ msgid "" " " msgstr "" "\n" -" Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen wollen:\n" +" Bitte wählen Sie aus, welche Authentifikationsmethode Sie nutzen " +"wollen:\n" " " #: aleksis/core/templates/two_factor/core/setup.html:23 msgid "" "\n" " To start using a token generator, please use your\n" -" favourite two factor authentication (TOTP) app to scan the QR code below.\n" +" favourite two factor authentication (TOTP) app to scan the QR code " +"below.\n" " Then, enter the token generated by the app.\n" " " msgstr "" @@ -3026,7 +3436,8 @@ msgid "" msgstr "" "\n" " Bitte geben Sie die Telefonnummer des Gerätes an,\n" -" an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer wird im nächsten Schritt überprüft.\n" +" an die die SMS-Nachrichten geschickt werden sollen. Diese Nummer " +"wird im nächsten Schritt überprüft.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:41 @@ -3044,11 +3455,13 @@ msgstr "" #: aleksis/core/templates/two_factor/core/setup.html:50 msgid "" "\n" -" We are calling your phone right now, please enter the digits you hear.\n" +" We are calling your phone right now, please enter the digits you " +"hear.\n" " " msgstr "" "\n" -" Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, die Sie hören.\n" +" Wir rufen Ihr Telefon jetzt an, bitte geben Sie die Zahlen ein, " +"die Sie hören.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:56 @@ -3058,23 +3471,30 @@ msgid "" " " msgstr "" "\n" -" Wir haben Ihnen eine SMS geschickt, bitte geben Sie die Tokens ein, die wir geschickt haben.\n" +" Wir haben Ihnen eine SMS geschickt, bitte geben Sie die Tokens " +"ein, die wir geschickt haben.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:63 msgid "" "\n" -" We've encountered an issue with the selected authentication method. Please\n" -" go back and verify that you entered your information correctly, try\n" -" again, or use a different authentication method instead. If the issue\n" +" We've encountered an issue with the selected authentication " +"method. Please\n" +" go back and verify that you entered your information correctly, " +"try\n" +" again, or use a different authentication method instead. If the " +"issue\n" " persists, contact the site administrator.\n" " " msgstr "" "\n" -" Mit der ausgewählten Authentifizierungsmethode ist ein Fehler aufgetreten. \n" -"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt eingegeben haben, versuchen Sie es erneut,\n" +" Mit der ausgewählten Authentifizierungsmethode ist ein Fehler " +"aufgetreten. \n" +"Bitte gehen Sie zurück und überprüfen, dass Sie die Informationen korrekt " +"eingegeben haben, versuchen Sie es erneut,\n" "oder benutzen Sie stattdessen eine andere Authentifizierungsmethode. \n" -"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der Administratoren.\n" +"Wenn der Fehler bestehen bleibt, kontaktieren Sie bitte einen der " +"Administratoren.\n" " " #: aleksis/core/templates/two_factor/core/setup.html:73 @@ -3099,11 +3519,13 @@ msgstr "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" #: aleksis/core/templates/two_factor/core/setup_complete.html:14 msgid "" "\n" -" Congratulations, you've successfully enabled two-factor authentication.\n" +" Congratulations, you've successfully enabled two-factor " +"authentication.\n" " " msgstr "" "\n" -" Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich aktiviert.\n" +" Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich " +"aktiviert.\n" " " #: aleksis/core/templates/two_factor/core/setup_complete.html:24 @@ -3120,12 +3542,14 @@ msgstr "Backup-Codes generieren" msgid "" "\n" " However, it might happen that you don't have access to\n" -" your primary token device. To enable account recovery, generate backup codes\n" +" your primary token device. To enable account recovery, generate " +"backup codes\n" " or add a phone number.\n" " " msgstr "" "\n" -" Es kann passieren, dass Sie keinen Zugriff auf Ihren Tokengenerator haben. \n" +" Es kann passieren, dass Sie keinen Zugriff auf Ihren " +"Tokengenerator haben. \n" "Um die Wiederherstellung zu aktivieren,\n" "generieren Sie Backupcodes oder fügen eine Telefonnummer hinzu.\n" " " @@ -3143,8 +3567,12 @@ msgid "Disable Two-Factor Authentication" msgstr "Zwei-Faktor-Authentifizierung deaktiveren" #: aleksis/core/templates/two_factor/profile/disable.html:12 -msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" -msgstr "Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das verschlechtert Ihre Kontosicherheit. Sind Sie sicher?" +msgid "" +"You are about to disable two-factor authentication. This weakens your " +"account security, are you sure?" +msgstr "" +"Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das " +"verschlechtert Ihre Kontosicherheit. Sind Sie sicher?" #: aleksis/core/templates/two_factor/profile/disable.html:26 msgid "Disable" @@ -3224,7 +3652,8 @@ msgid "" msgstr "" "\n" " Wir raten Ihnen jedoch dringend davon ab.\n" -" Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr Konto deaktivieren.\n" +" Sie können jedoch auch die Zwei-Faktor-Authentifizierung für Ihr " +"Konto deaktivieren.\n" " " #: aleksis/core/templates/two_factor/profile/profile.html:78 @@ -3236,197 +3665,439 @@ msgid "" " " msgstr "" "\n" -" Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account aktiviert.\n" +" Die Zwei-Faktor-Authentifizierung ist nicht für Ihren Account " +"aktiviert.\n" " Aktivieren Sie Zwei-Faktor-Authentifizierung für eine verbesserte\n" " Accountsicherheit.\n" " " -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "E-Mail" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "SMS" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:118 aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "Fortschritt: PDF-Datei generieren" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:119 aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "PDF-Datei wird generiert …" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:120 aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "Die PDF-Datei wurde erfolgreich generiert." -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:121 aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "Es ist ein Fehler beim Generieren der PDF-Datei aufgetreten." -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:124 aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "PDF herunterladen" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:292 aleksis/core/views.py:294 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "Das Schuljahr wurde erstellt." -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:304 aleksis/core/views.py:306 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "Das Schuljahr wurde gespeichert." -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:424 aleksis/core/views.py:426 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "Die Untergruppen wurden gespeichert." -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:443 aleksis/core/views.py:453 +#: aleksis/core/views.py:445 aleksis/core/views.py:455 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "Die Person wurde gespeichert." -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:503 aleksis/core/views.py:505 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "Die Gruppe wurde gespeichert." -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:600 aleksis/core/views.py:602 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "Die Ankündigung wurde gespeichert." -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:616 aleksis/core/views.py:618 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "Ankündigung wurde gelöscht." -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:684 aleksis/core/views.py:686 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "Das angeforderte Einstellungsregister existiert nicht" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:703 aleksis/core/views.py:705 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "Die Einstellungen wurde gespeichert." -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:727 aleksis/core/views.py:729 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "Die Person wurde gelöscht." -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:741 aleksis/core/views.py:743 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "Die Gruppe wurde gelöscht." -#: aleksis/core/views.py:766 +#: aleksis/core/views.py:773 msgid "The additional_field has been saved." msgstr "Das zusätzliche Feld wurde gespeichert." -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:807 aleksis/core/views.py:809 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "Das zusätzliche Feld wurde gelöscht." -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:832 aleksis/core/views.py:834 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "Der Gruppentyp wurde gespeichert." -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:862 aleksis/core/views.py:864 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "Der Gruppentyp wurde gelöscht." -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:895 aleksis/core/views.py:897 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "Fortschritt: Datenprüfungen ausführen" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:896 aleksis/core/views.py:898 +#: aleksis/core/views.py:857 msgid "Run data checks …" msgstr "Datenprüfungen laufen …" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:897 aleksis/core/views.py:899 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt." -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:898 aleksis/core/views.py:900 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen." -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:914 aleksis/core/views.py:916 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:924 aleksis/core/views.py:926 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "Die angeforderte Lösungsoption existiert nicht" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:956 aleksis/core/views.py:958 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "Das Dashboard-Widget wurde gespeichert." -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:986 aleksis/core/views.py:988 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "Das Dashboard-Widget wurde erstellt." -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:996 aleksis/core/views.py:998 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "Das Dashboard-Widget wurde gelöscht." -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1067 aleksis/core/views.py:1069 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1069 aleksis/core/views.py:1071 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." -msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert." +msgstr "" +"Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1145 aleksis/core/views.py:1147 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" -msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}" +msgstr "" +"Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1236 aleksis/core/views.py:1238 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen." -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1246 aleksis/core/views.py:1248 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "Die globale Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1256 aleksis/core/views.py:1258 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "Die globale Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1266 aleksis/core/views.py:1268 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1276 aleksis/core/views.py:1278 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1337 +#: aleksis/core/views.py:1344 aleksis/core/views.py:1346 msgid "The requested PDF file does not exist" msgstr "Die angeforderte PDF-Datei existiert nicht" -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 +#: aleksis/core/views.py:1353 aleksis/core/views.py:1357 +#: aleksis/core/views.py:1355 aleksis/core/views.py:1359 msgid "The requested task does not exist or is not accessible" msgstr "Der angeforderte Task existiert nicht oder ist nicht abrufbar" -#: aleksis/core/views.py:1388 -msgid "The third-party account could not be disconnected because it is the only login method available." -msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist." +#: aleksis/core/views.py:1409 aleksis/core/views.py:1411 +#: aleksis/core/views.py:1349 +msgid "" +"The third-party account could not be disconnected because it is the only " +"login method available." +msgstr "" +"Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige " +"verfügbare Anmeldeoption ist." -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1416 aleksis/core/views.py:1418 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt." -#: aleksis/core/views.py:1466 -msgid "Person was invited successfully and an email with further instructions has been send to them." +#: aleksis/core/views.py:1487 aleksis/core/views.py:1489 +#: aleksis/core/views.py:1432 +msgid "" +"Person was invited successfully and an email with further instructions has " +"been send to them." msgstr "" "Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren " "Anweisungen wurde an sie verschickt." -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1498 aleksis/core/views.py:1500 +#: aleksis/core/views.py:1443 msgid "Person was already invited." msgstr "Person wurde bereits eingeladen." -#~ msgid "Person was invited successfully." -#~ msgstr "Person wurde erfolgreich eingeladen." +#: aleksis/core/views.py:1598 +msgid "ICal feed updated successfully" +msgstr "Der iCal-Feed wurde erfolgreich aktualisiert" + +#: aleksis/core/views.py:1608 +msgid "ICal feed deleted successfully" +msgstr "Der iCal-Feed wurde erfolgreich gelöscht" + +#: aleksis/core/views.py:1616 +msgid "ICal feed created successfully" +msgstr "Der iCal-Feed wurde erfolgreich erstellt" + +#: aleksis/core/data_checks.py:330 aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "Feld %s von Model %s validieren." + +#: aleksis/core/data_checks.py:332 aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "Das Feld %s konnte nicht erfolgreich validiert werden." + +#: aleksis/core/models.py:181 +msgid "other" +msgstr "andere" + +#: aleksis/core/settings.py:543 aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "Ukrainisch" + +#: aleksis/core/templates/500.html:10 +msgid "" +"An unexpected error has\n" +" occurred." +msgstr "" +"Ein unerwarteter Fehler ist\n" +" aufgetreten." + +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " +msgstr "" +"\n" +" %(min)s Jahre bis %(max)s Jahre\n" +" " + +#: aleksis/core/templates/core/ical/ical_list.html:4 +#: aleksis/core/templates/core/ical/ical_list.html:5 +msgid "iCal Feeds" +msgstr "iCal-Feeds" + +#: aleksis/core/views.py:775 aleksis/core/views.py:730 +msgid "The additional field has been saved." +msgstr "Das zusätzliche Feld wurde gespeichert." + +#: aleksis/core/views.py:1600 +msgid "iCal feed updated successfully" +msgstr "Der iCal-Feed wurde erfolgreich aktualisiert" + +#: aleksis/core/views.py:1610 +msgid "iCal feed deleted successfully" +msgstr "Der iCal-Feed wurde erfolgreich gelöscht" + +#: aleksis/core/views.py:1618 +msgid "iCal feed created successfully" +msgstr "Der iCal-Feed wurde erfolgreich erstellt" + +#: aleksis/core/templates/core/pages/system_status.html:24 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access the " +"site.\n" +" " +msgstr "" +"\n" +" Nur Administratoren und Besucher von internen IP-Adressen " +"können die Seite aufrufen.\n" +" " + +#: aleksis/core/forms.py:499 +msgid "You must grant the permission to all objects or to specific objects." +msgstr "Sie müssen die Berechtigung auf alle Objekte oder für spezifische Objekte vergeben." + +#: aleksis/core/models.py:1263 +msgid "Back URL" +msgstr "Zurück-URL" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "Fortschritt-Titel" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "Fehlernachricht" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "Erfolgsnachricht" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "URL, auf die bei Erfolg weitergeleitet wird" + +#: aleksis/core/models.py:1269 +msgid "Additional button title" +msgstr "Titel des zusätzlichen Buttons" + +#: aleksis/core/models.py:1271 +msgid "Additional button URL" +msgstr "URL des zusätzlichen Buttons" + +#: aleksis/core/models.py:1273 +msgid "Additional button icon" +msgstr "Symbol des zusätzlichen Buttons" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "Ergebnis abgerufen" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "Hintergrundaufgabe erfolgreich fertiggestellt" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "Die Hintergrundaufgabe '{}' wurde erfolgreich fertiggestellt." + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "Hintergrundaufgabe fehlgeschlagen" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "Die Hintergrundaufgabe '{}' ist fehlgeschlagen." + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "Hintergrundaufgabe" + +#: aleksis/core/models.py:1441 +msgid "Can view room timetable" +msgstr "Kann Raum-Stundenplan sehen" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "Raum" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "Räume" + +#: aleksis/core/preferences.py:208 +msgid "Select Design" +msgstr "Design auswählen" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "Heller Modus" + +#: aleksis/core/templates/core/partials/splash_screen.html:11 +msgid "" +"\n" +" This webbrowser doesn't support JavaScript, or its execution is " +"blocked. Please use another browser to continue.\n" +" " +msgstr "" +"\n" +" Dieser Webbrowser unterstützt kein JavaScript oder die Ausführung wurde blockiert. Bitte nutzen Sie einen anderen Browser, um fortzufahren.\n" +" " + +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." +msgstr "Seite nicht offline verfügbar." + +#: aleksis/core/templates/offline.html:14 +msgid "" +"\n" +" This page is not available offline. Since you probably don't have an " +"internet connection, check to see if your WiFi\n" +" or mobile data is turned on and try again. If you think you are " +"connected, please contact the system\n" +" administrators:\n" +" " +msgstr "" +"\n" +" Diese Seite ist offline nicht verfügbar. Da Sie vermutliche keine Internetverbindung haben, prüfen Sie, ob Ihr WLAN oder mobile Daten angeschaltet sind, \n" +" und probieren Sie es erneut. Wenn Sie der Meinung sind, dass Sie verbunden sind, kontaktieren Sie bitte die \n" +" Systemadministratoren:\n" +" " + +#~ msgid "Me" +#~ msgstr "Ich" + +#~ msgid "Logged in as" +#~ msgstr "Angemeldet als" #, python-brace-format #~ msgid "Last backup {time_gone_since_backup}!" @@ -3484,7 +4155,8 @@ msgstr "Person wurde bereits eingeladen." #~ " <li>ID des Tasks: %(task_id)s</li>\n" #~ " <li>Aufgetretene Exception: %(exception)s</li>\n" #~ " <li>Argumente, mit denen der Task aufgerufen wurde: %(args)s</li>\n" -#~ " <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: %(kwargs)s</li>\n" +#~ " <li>Keyword-Argumente, mit denen der Task aufgerufen wurde: " +#~ "%(kwargs)s</li>\n" #~ " <li>Stacktrace: %(traceback)s</li>\n" #~ " </ul>\n" #~ " " @@ -3503,8 +4175,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Zustimmungen" #, python-brace-format -#~ msgid "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree with them." -#~ msgstr "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen und stimme ihr zu." +#~ msgid "" +#~ "I have read the <a href='{privacy_policy}'>Privacy policy</a> and agree " +#~ "with them." +#~ msgstr "" +#~ "Ich habe die <a href='{privacy_policy}'>Datenschutzerklärung</a> gelesen " +#~ "und stimme ihr zu." #~ msgid "You must type the same password each time." #~ msgstr "Sie müssen zweimal das gleiche Passwort eingeben." @@ -3513,8 +4189,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Verkleidung" #, python-format -#~ msgid "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your e-mail address</a>" -#~ msgstr "<strong>Hinweis:</strong> Sie können immer noch <a href=\"%(email_url)s\"> Ihre E-Mail-Adresse ändern</a>" +#~ msgid "" +#~ "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change " +#~ "your e-mail address</a>" +#~ msgstr "" +#~ "<strong>Hinweis:</strong> Sie können immer noch <a href=\"%(email_url)s" +#~ "\"> Ihre E-Mail-Adresse ändern</a>" #~ msgid "Impress" #~ msgstr "Impressum" @@ -3536,7 +4216,9 @@ msgstr "Person wurde bereits eingeladen." #, python-format #~ msgid "Are you sure to delete the application %(application_name)s?" -#~ msgstr "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen möchten?" +#~ msgstr "" +#~ "Sind Sie sicher, dass Sie die Anwendung %(application_name)s löschen " +#~ "möchten?" #~ msgid "Authorization Grant Type" #~ msgstr "Authorization Grant-Typ" @@ -3561,17 +4243,23 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "" #~ "\n" -#~ " You can use this form to assign user accounts to persons. Use the\n" -#~ " dropdowns to select existing accounts; use the text fields to create new\n" -#~ " accounts on-the-fly. The latter will create a new account with the\n" +#~ " You can use this form to assign user accounts to persons. Use " +#~ "the\n" +#~ " dropdowns to select existing accounts; use the text fields to " +#~ "create new\n" +#~ " accounts on-the-fly. The latter will create a new account with " +#~ "the\n" #~ " entered username and copy all other details from the person.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n" -#~ " Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n" +#~ " Sie können dieses Formular nutzen, um Benutzerkonten Personen " +#~ "zuzuweisen. Nutzen Sie das\n" +#~ " Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen " +#~ "Sie das Textfeld, um einen neuen Benutzer zu\n" #~ " erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n" -#~ " eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n" +#~ " eingegebenen Benutzernamen und kopiert alle anderen Daten der " +#~ "Person.\n" #~ " " #~ msgid "Existing account" @@ -3597,7 +4285,8 @@ msgstr "Person wurde bereits eingeladen." #~ "We sent you a text message, please enter the tokens we\n" #~ " sent." #~ msgstr "" -#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens ein,\n" +#~ "Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens " +#~ "ein,\n" #~ " die wir Ihnen geschickt haben." #~ msgid "French" @@ -3606,8 +4295,12 @@ msgstr "Person wurde bereits eingeladen." #~ msgid "Norwegian (bokmÃ¥l)" #~ msgstr "Norwegisch (bokmÃ¥l)" -#~ msgid "The data check has been started. Please note that it may take a while before you are able to fetch the data on this page." -#~ msgstr "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können." +#~ msgid "" +#~ "The data check has been started. Please note that it may take a while " +#~ "before you are able to fetch the data on this page." +#~ msgstr "" +#~ "Die Datenüberprüfung wurde gestartet. Bitte beachten Sie, dass es eine " +#~ "Weile dauern kann, bevor Sie auf dieser Seite Ergebnisse abrufen können." #~ msgid "The data check has finished." #~ msgstr "Die Datenüberprüfung wurde beendet." @@ -3661,7 +4354,8 @@ msgstr "Person wurde bereits eingeladen." #~ " " #~ msgstr "" #~ "\n" -#~ " Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS handelt, kontaktieren Sie bitte einen Ihrer\n" +#~ " Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS " +#~ "handelt, kontaktieren Sie bitte einen Ihrer\n" #~ " Systemadministratoren:\n" #~ " " @@ -3735,10 +4429,11 @@ msgstr "Person wurde bereits eingeladen." #~ msgstr "Markdown-Anleitung (Hilfe)" #~ msgid "You are not allowed to mark notifications from other users as read!" -#~ msgstr "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als gelesen zu markieren!" +#~ msgstr "" +#~ "Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als " +#~ "gelesen zu markieren!" #, fuzzy -#~| msgid "School management" #~ msgid "School name" #~ msgstr "Schulverwaltung" @@ -3796,7 +4491,8 @@ msgstr "Person wurde bereits eingeladen." #~ " " #~ msgstr "" #~ "\n" -#~ " Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später erneut.\n" +#~ " Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es " +#~ "später erneut.\n" #~ " " #~ msgid "Details" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po index 376788f8a7ea941b89dff0620fdbc78a40c106a5..dd4d47c2a6946e7f14ede5b29ef3d37e5d8c85a4 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: 2021-10-28 14:37+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core-js/de/>\n" @@ -30,6 +30,5 @@ msgstr "Abbrechen" msgid "OK" msgstr "OK" -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "Diese Seite enthält vielleicht veraltete Informationen, da es keine Internetverbindung gibt." +#~ msgid "This page may contain outdated information since there is no internet connection." +#~ msgstr "Diese Seite enthält vielleicht veraltete Informationen, da es keine Internetverbindung gibt." diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po index ac9b5f99c721e75f4dd0e5bf94368eaee2c7867f..a37c9697651fb7c32c8af41a4631bce4f84d83b7 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/django.po +++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: 2021-06-16 12:00+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n" @@ -18,61 +18,68 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.4\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:157 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:158 #, fuzzy #| msgid "Contact details" msgid "Email address" msgstr "Détails de contact" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:159 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 #, fuzzy #| msgid "Group" msgid "Groups" msgstr "Groupe" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:284 msgid "Deactivate DashboardWidget" msgstr "" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "" -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "" -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 -#: aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "" + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 #: aleksis/core/templates/search/search.html:22 @@ -97,11 +104,11 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 msgid "Group" msgstr "groupe" @@ -109,7 +116,7 @@ msgstr "groupe" msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 msgid "Address" msgstr "" @@ -141,7 +148,7 @@ msgstr "" msgid "This username is already in use." msgstr "Cet nom est deja en utilisation." -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 msgid "School term" msgstr "" @@ -152,8 +159,7 @@ msgid "Common data" msgstr "Détails de contact" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 -#: aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 #, fuzzy #| msgid "Person" @@ -166,18 +172,18 @@ msgstr "Personne" msgid "Additional data" msgstr "Détails de contact" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:84 msgid "Date" msgstr "Date" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:92 msgid "Time" msgstr "" @@ -213,11 +219,11 @@ msgstr "" msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 msgid "First name" msgstr "Prénom" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "Last name" msgstr "Nom de famille" @@ -246,11 +252,11 @@ msgid "You must select at least one group or person which should get the permiss msgstr "" #: aleksis/core/forms.py:499 -msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." msgstr "" #: aleksis/core/forms.py:586 -msgid "Adress data" +msgid "Address data" msgstr "" #: aleksis/core/forms.py:598 @@ -267,7 +273,15 @@ msgstr "" msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "" + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" + +#: aleksis/core/forms.py:828 msgid "No valid selection." msgstr "" @@ -291,740 +305,713 @@ msgstr "" msgid "No backup result found!" msgstr "" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:32 -#: aleksis/core/templates/two_factor/core/login.html:95 -msgid "Login" -msgstr "" - -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 -#: aleksis/core/templates/socialaccount/signup.html:23 -msgid "Sign up" -msgstr "" - -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 -msgid "Accept invitation" -msgstr "" - -#: aleksis/core/menus.py:33 -msgid "Dashboard" -msgstr "" - -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "" - -#: aleksis/core/menus.py:113 -msgid "Third-party accounts" -msgstr "" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/menus.py:133 -msgid "Admin" -msgstr "" - -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 -#: aleksis/core/templates/core/announcement/list.html:7 -#: aleksis/core/templates/core/announcement/list.html:8 -msgid "Announcements" -msgstr "" - -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 -#: aleksis/core/templates/core/school_term/list.html:8 -#: aleksis/core/templates/core/school_term/list.html:9 -msgid "School terms" -msgstr "" - -#: aleksis/core/menus.py:163 -#: aleksis/core/templates/core/dashboard_widget/list.html:8 -#: aleksis/core/templates/core/dashboard_widget/list.html:9 -msgid "Dashboard widgets" -msgstr "" - -#: aleksis/core/menus.py:174 -#: aleksis/core/templates/core/management/data_management.html:6 -#: aleksis/core/templates/core/management/data_management.html:7 -msgid "Data management" -msgstr "" - -#: aleksis/core/menus.py:185 -#: aleksis/core/templates/core/pages/system_status.html:5 -#: aleksis/core/templates/core/pages/system_status.html:7 -msgid "System status" -msgstr "" - -#: aleksis/core/menus.py:196 -msgid "Configuration" -msgstr "" - -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 -#: aleksis/core/templates/core/data_check/list.html:10 -msgid "Data checks" -msgstr "" - -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 -#: aleksis/core/templates/core/perms/list.html:14 -msgid "Manage permissions" -msgstr "" - -#: aleksis/core/menus.py:224 -msgid "Backend Admin" -msgstr "" - -#: aleksis/core/menus.py:232 -#: aleksis/core/templates/oauth2_provider/application/list.html:5 -#: aleksis/core/templates/oauth2_provider/application/list.html:6 -msgid "OAuth2 Applications" -msgstr "" - -#: aleksis/core/menus.py:245 -msgid "People" -msgstr "" - -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 -#: aleksis/core/templates/core/group_type/list.html:8 -#: aleksis/core/templates/core/group_type/list.html:9 -#, fuzzy -#| msgid "Group" -msgid "Group types" -msgstr "Groupe" - -#: aleksis/core/menus.py:287 -msgid "Groups and child groups" -msgstr "" - -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 -#: aleksis/core/templates/core/additional_field/list.html:8 -#: aleksis/core/templates/core/additional_field/list.html:9 -msgid "Additional fields" -msgstr "" - -#: aleksis/core/menus.py:309 -#, fuzzy -#| msgid "Contact details" -msgid "Invite person" -msgstr "Détails de contact" - -#: aleksis/core/menus.py:322 -#: aleksis/core/templates/core/group/child_groups.html:7 -#: aleksis/core/templates/core/group/child_groups.html:9 -msgid "Assign child groups to groups" -msgstr "" - #: aleksis/core/mixins.py:511 msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:83 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:85 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:86 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:88 msgid "Integer" msgstr "" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:89 msgid "IP address" msgstr "" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:93 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 msgid "Name" msgstr "" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:107 #, fuzzy #| msgid "Contact details" msgid "Start date" msgstr "Détails de contact" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:108 msgid "End date" msgstr "" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 msgid "Person" msgstr "Personne" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:166 #, fuzzy #| msgid "Contact details" msgid "Can view address" msgstr "Détails de contact" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:167 #, fuzzy #| msgid "Contact details" msgid "Can view contact details" msgstr "Détails de contact" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:168 #, fuzzy #| msgid "Contact details" msgid "Can view photo" msgstr "Détails de contact" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:169 #, fuzzy #| msgid "Contact details" msgid "Can view avatar image" msgstr "Détails de contact" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:170 #, fuzzy #| msgid "Contact details" msgid "Can view persons groups" msgstr "Détails de contact" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:171 #, fuzzy #| msgid "Contact details" msgid "Can view personal details" msgstr "Détails de contact" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "female" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:181 +msgid "other" +msgstr "" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 #, fuzzy #| msgid "First name" msgid "Short name" msgstr "Prénom" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:202 msgid "Street" msgstr "" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:203 msgid "Street number" msgstr "" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:204 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:205 msgid "Place" msgstr "" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:212 msgid "Date of birth" msgstr "Date d'anniversaire" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:213 #, fuzzy #| msgid "Date of birth" msgid "Place of birth" msgstr "Date d'anniversaire" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:214 msgid "Sex" msgstr "Sexe" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:241 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 msgid "Description" msgstr "Description" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:464 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:466 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "" + +#: aleksis/core/models.py:469 +#, fuzzy +#| msgid "Description" +msgid "Help text / description" +msgstr "Description" + +#: aleksis/core/models.py:475 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:476 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:497 #, fuzzy #| msgid "Contact details" msgid "Can view statistics about group." msgstr "Détails de contact" -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 #, fuzzy #| msgid "Last name" msgid "Long name" msgstr "Nom de famille" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "Propriétaires" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:537 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:726 msgid "Application" msgstr "" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:732 msgid "Activity" msgstr "" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:733 msgid "Activities" msgstr "" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:739 msgid "Sender" msgstr "" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:744 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "" + +#: aleksis/core/models.py:757 msgid "Read" msgstr "" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:775 msgid "Notification" msgstr "" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "" + +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:875 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "" + +#: aleksis/core/models.py:913 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:914 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:934 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:936 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:989 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:990 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:991 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:997 msgid "URL" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:998 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "" + +#: aleksis/core/models.py:1023 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1044 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1045 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1075 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 -#: aleksis/core/templates/oauth2_provider/application/detail.html:26 -msgid "Icon" -msgstr "" - -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1103 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 #, fuzzy #| msgid "Group" msgid "Group type" msgstr "Groupe" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +#, fuzzy +#| msgid "Group" +msgid "Group types" +msgstr "Groupe" + +#: aleksis/core/models.py:1124 #, fuzzy #| msgid "Contact details" msgid "Can view system status" msgstr "Détails de contact" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1125 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1126 #, fuzzy #| msgid "Contact details" msgid "Can impersonate" msgstr "Détails de contact" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1127 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1132 #, fuzzy #| msgid "Contact details" msgid "Can invite persons" msgstr "Détails de contact" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1168 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1176 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1177 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1190 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1191 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1201 #, fuzzy #| msgid "Contact details" msgid "E-Mail address" msgstr "Détails de contact" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1233 #, fuzzy #| msgid "Owners" msgid "Owner" msgstr "Propriétaires" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1237 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1263 +msgid "Back URL" +msgstr "" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "" + +#: aleksis/core/models.py:1269 +#, fuzzy +#| msgid "Contact details" +msgid "Additional button title" +msgstr "Détails de contact" + +#: aleksis/core/models.py:1271 +#, fuzzy +#| msgid "Contact details" +msgid "Additional button URL" +msgstr "Détails de contact" + +#: aleksis/core/models.py:1273 +#, fuzzy +#| msgid "Contact details" +msgid "Additional button icon" +msgstr "Détails de contact" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "" + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1348 #, fuzzy #| msgid "Contact details" msgid "Additional attributes" msgstr "Détails de contact" -#: aleksis/core/models.py:1268 +#: aleksis/core/models.py:1386 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1278 +#: aleksis/core/models.py:1396 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" +#: aleksis/core/models.py:1441 +#, fuzzy +#| msgid "Contact details" +msgid "Can view room timetable" +msgstr "Détails de contact" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + #: aleksis/core/preferences.py:25 msgid "General" msgstr "" @@ -1119,150 +1106,167 @@ msgstr "" msgid "Channels to use for notifications" msgstr "" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:208 +#, fuzzy +#| msgid "Contact details" +msgid "Select Design" +msgstr "Détails de contact" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" msgstr "" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "" -#: aleksis/core/preferences.py:241 +#: aleksis/core/preferences.py:256 msgid "Automatically link existing persons to new users by their e-mail address" msgstr "" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "" + +#: aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "" + +#: aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:345 #, fuzzy #| msgid "Contact details" msgid "Allowed Grant Flows for OAuth applications" msgstr "Détails de contact" -#: aleksis/core/preferences.py:328 -msgid "Available languages" -msgstr "" - -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "" -#: aleksis/core/preferences.py:407 +#: aleksis/core/preferences.py:424 msgid "Editable fields on person model which should trigger a notification on change" msgstr "" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "" + +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" msgstr "" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:539 msgid "English" msgstr "" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:540 msgid "German" msgstr "" -#: aleksis/core/tables.py:24 +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "" + +#: aleksis/core/tables.py:25 #: aleksis/core/templates/core/announcement/list.html:36 -#: aleksis/core/templates/core/group/full.html:24 -#: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/group/full.html:26 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 msgid "Edit" msgstr "" -#: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:138 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" -#: aleksis/core/tables.py:61 aleksis/core/tables.py:62 -#: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:136 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 #: aleksis/core/templates/core/announcement/list.html:42 -#: aleksis/core/templates/core/group/full.html:31 +#: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 -#: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 msgid "Delete" msgstr "" #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 #: aleksis/core/templates/oauth2_provider/authorize.html:54 -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:24 msgid "Error" msgstr "" @@ -1291,7 +1295,7 @@ msgstr "" #: aleksis/core/templates/500.html:10 msgid "" "An unexpected error has\n" -" occured." +" occurred." msgstr "" #: aleksis/core/templates/500.html:13 @@ -1302,6 +1306,10 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1357,6 +1365,17 @@ msgstr "" msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "" + #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" msgstr "" @@ -1470,6 +1489,11 @@ msgstr "" msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "" + #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 msgid "Signup closed" @@ -1541,7 +1565,7 @@ msgid "Publish new announcement" msgstr "" #: aleksis/core/templates/core/announcement/form.html:34 -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1560,22 +1584,6 @@ msgstr "" msgid "There are no announcements." msgstr "" -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "" - -#: aleksis/core/templates/core/base.html:179 -msgid "About AlekSIS® — The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/base.html:187 -msgid "Imprint" -msgstr "" - -#: aleksis/core/templates/core/base.html:195 -msgid "Privacy Policy" -msgstr "" - #: aleksis/core/templates/core/base_print.html:74 msgid "Powered by AlekSIS®" msgstr "" @@ -1606,6 +1614,11 @@ msgstr "" msgid "Edit %(widget)s" msgstr "" +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "" + #: aleksis/core/templates/core/dashboard_widget/list.html:15 #, fuzzy #| msgid "Contact details" @@ -1624,6 +1637,11 @@ msgstr "Détails de contact" msgid "Edit default dashboard" msgstr "" +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "" + #: aleksis/core/templates/core/data_check/list.html:15 msgid "Check data again" msgstr "" @@ -1719,6 +1737,11 @@ msgstr "" msgid "Default dashboard" msgstr "" +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "" + #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" @@ -1797,34 +1820,32 @@ msgstr "" msgid "Edit group" msgstr "" -#: aleksis/core/templates/core/group/full.html:38 -#: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "" -#: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 msgid "Statistics" msgstr "" -#: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "" -#: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 -msgid "years to" -msgstr "" - -#: aleksis/core/templates/core/group/full.html:76 -msgid "years " +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " msgstr "" #: aleksis/core/templates/core/group/list.html:14 @@ -1861,7 +1882,7 @@ msgstr "Groupe" msgid "Home" msgstr "" -#: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" " You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" @@ -1869,101 +1890,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "" -#: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "" -#: aleksis/core/templates/core/index.html:82 -msgid "Recent notifications" -msgstr "" - -#: aleksis/core/templates/core/index.html:98 -#: aleksis/core/templates/core/notifications.html:23 -msgid "More information →" -msgstr "" - -#: aleksis/core/templates/core/index.html:105 -#: aleksis/core/templates/core/notifications.html:30 -msgid "No notifications available yet." -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:6 -msgid "About AlekSIS®" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:7 -msgid "AlekSIS® – The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:15 -msgid "About AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:17 -msgid "" -"\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" -" can be used by anyone.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:24 -msgid "" -"\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:30 -msgid "Website of AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:31 -msgid "Source code" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:40 -msgid "Licence information" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:42 -msgid "" -"\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" -" licences are marked like this:\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:50 -msgid "Free/Open Source Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:51 -msgid "Other Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:55 -msgid "Full licence text" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:56 -msgid "More information about the EUPL" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:95 -#, python-format -msgid "" -"\n" -" This app is licenced under %(licence)s.\n" -" " -msgstr "" - #: aleksis/core/templates/core/pages/delete.html:6 #, python-format msgid "Delete %(object_name)s" @@ -1977,99 +1911,92 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/pages/progress.html:27 -msgid "" -"\n" -" Without activated JavaScript the progress status can't be updated.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/progress.html:47 -#: aleksis/core/templates/two_factor/core/otp_required.html:19 -msgid "Go back" +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" msgstr "" #: aleksis/core/templates/core/pages/system_status.html:12 msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access the site.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 #, fuzzy #| msgid "Date" msgid "Date done" @@ -2112,37 +2039,29 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Changed by" -msgstr "" - -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Unknown" +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:15 -msgid "Language" +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:27 -msgid "Select language" +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:12 -msgid "" -"\n" -" Your administrator account is not linked to any person. Therefore,\n" -" a dummy person has been linked to your account.\n" -" " +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:19 +#: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " msgstr "" #: aleksis/core/templates/core/perms/assign.html:12 @@ -2160,6 +2079,11 @@ msgstr "Détails de contact" msgid "Assign" msgstr "" +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "" + #: aleksis/core/templates/core/perms/list.html:21 msgid "Assign a new permission" msgstr "" @@ -2205,30 +2129,6 @@ msgstr "Détails de contact" msgid "Edit person" msgstr "" -#: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 -#, fuzzy -#| msgid "Contact details" -msgid "Impersonate" -msgstr "Détails de contact" - -#: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 -msgid "Invite user" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:133 -msgid "Contact details" -msgstr "Détails de contact" - -#: aleksis/core/templates/core/person/full.html:224 -msgid "This person didn't upload a personal photo." -msgstr "" - -#: aleksis/core/templates/core/person/full.html:232 -msgid "Children" -msgstr "" - #: aleksis/core/templates/core/person/list.html:21 msgid "Filter persons" msgstr "" @@ -2248,6 +2148,10 @@ msgstr "" msgid "Edit school term" msgstr "" +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "" + #: aleksis/core/templates/dynamic_preferences/form.html:9 msgid "Site preferences" msgstr "" @@ -2281,6 +2185,10 @@ msgstr "" msgid "site preferences page" msgstr "" +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2377,6 +2285,11 @@ msgstr "" msgid "Edit OAuth2 Application" msgstr "Détails de contact" +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/application/list.html:11 msgid "Register new application" msgstr "" @@ -2409,14 +2322,6 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:12 -msgid "Success!" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 -msgid "Please return to your application and enter this code:" -msgstr "" - #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 @@ -2431,6 +2336,11 @@ msgstr "" msgid "Revoke" msgstr "" +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 #, fuzzy #| msgid "Contact details" @@ -2441,16 +2351,14 @@ msgstr "Détails de contact" msgid "Network error" msgstr "" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." msgstr "" -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" " administrators:\n" " " @@ -2697,7 +2605,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "" @@ -2737,6 +2645,12 @@ msgstr "" msgid "Generate Tokens" msgstr "" +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "" + #: aleksis/core/templates/two_factor/core/login.html:27 #, fuzzy, python-format #| msgid "Contact details" @@ -2802,15 +2716,15 @@ msgstr "" msgid "Or, alternatively, use one of your backup phones:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "" @@ -2832,6 +2746,10 @@ msgid "" " security." msgstr "" +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + #: aleksis/core/templates/two_factor/core/phone_register.html:5 #: aleksis/core/templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" @@ -3047,190 +2965,195 @@ msgid "" " " msgstr "" -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "" -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "" -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:766 -msgid "The additional_field has been saved." +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:857 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1337 -msgid "The requested PDF file does not exist" -msgstr "" - -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 -msgid "The requested task does not exist or is not accessible" -msgstr "" - -#: aleksis/core/views.py:1388 +#: aleksis/core/views.py:1349 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1466 +#: aleksis/core/views.py:1432 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1443 #, fuzzy #| msgid "This username is already in use." msgid "Person was already invited." msgstr "Cet nom est deja en utilisation." +#, fuzzy +#~| msgid "Contact details" +#~ msgid "Invite person" +#~ msgstr "Détails de contact" + +#, fuzzy +#~| msgid "Contact details" +#~ msgid "Impersonate" +#~ msgstr "Détails de contact" + +#~ msgid "Contact details" +#~ msgstr "Détails de contact" + #, fuzzy #~| msgid "Contact details" #~ msgid "Can link persons to accounts" diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po index 9f07be2903046e41680c481bea659aa95b695df7..e36f5875ab7b9770243227f51fa21ddd75d467a2 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -29,7 +29,3 @@ msgstr "" #: aleksis/core/static/js/main.js:68 msgid "OK" msgstr "" - -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "" diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po index 4b2afb73bbbc2fd8a426789859152fa2d1895395..81cb58ba93fc0e0cb0132717762819fcd0b9bf63 100644 --- a/aleksis/core/locale/la/LC_MESSAGES/django.po +++ b/aleksis/core/locale/la/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: 2020-12-19 12:57+0000\n" "Last-Translator: Julian <leuckerj@gmail.com>\n" "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n" @@ -18,65 +18,72 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3.2\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:157 #, fuzzy #| msgid "E-mail address" msgid "Full home postal address" msgstr "Inscriptio electronica" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:158 #, fuzzy #| msgid "E-mail address" msgid "Email address" msgstr "Inscriptio electronica" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:159 #, fuzzy #| msgid "Mobile phone" msgid "Home and mobile phone" msgstr "Numerus telephoni mobilis" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 msgid "Groups" msgstr "Greges" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:284 #, fuzzy #| msgid "Dashboard" msgid "Deactivate DashboardWidget" msgstr "Forum" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "" -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "" -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 -#: aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "" + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 #: aleksis/core/templates/search/search.html:22 @@ -101,11 +108,11 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 msgid "Group" msgstr "Grex" @@ -113,7 +120,7 @@ msgstr "Grex" msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 #, fuzzy #| msgid "E-mail address" msgid "Address" @@ -145,7 +152,7 @@ msgstr "" msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 msgid "School term" msgstr "Anus scolae" @@ -156,8 +163,7 @@ msgid "Common data" msgstr "Adminstratio datarum" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 -#: aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "personae" @@ -168,18 +174,18 @@ msgstr "personae" msgid "Additional data" msgstr "addita nomines" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "Photographia" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:84 msgid "Date" msgstr "dies" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:92 msgid "Time" msgstr "tempus" @@ -215,11 +221,11 @@ msgstr "" msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 msgid "First name" msgstr "Primus nomen" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "Last name" msgstr "Secondus nomen" @@ -252,13 +258,13 @@ msgid "You must select at least one group or person which should get the permiss msgstr "" #: aleksis/core/forms.py:499 -msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." msgstr "" #: aleksis/core/forms.py:586 #, fuzzy #| msgid "E-mail address" -msgid "Adress data" +msgid "Address data" msgstr "Inscriptio electronica" #: aleksis/core/forms.py:598 @@ -275,7 +281,15 @@ msgstr "" msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "" + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" + +#: aleksis/core/forms.py:828 msgid "No valid selection." msgstr "" @@ -301,786 +315,749 @@ msgstr "" msgid "No backup result found!" msgstr "" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:32 -#: aleksis/core/templates/two_factor/core/login.html:95 -msgid "Login" -msgstr "nomen profiteri" - -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 -#: aleksis/core/templates/socialaccount/signup.html:23 -msgid "Sign up" -msgstr "" - -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 -#, fuzzy -#| msgid "Edit school information" -msgid "Accept invitation" -msgstr "Muta informationes scolae" - -#: aleksis/core/menus.py:33 -msgid "Dashboard" -msgstr "Forum" - -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "Nuntii" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "Simulandum aliquem finire" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "nomen retractare" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "" - -#: aleksis/core/menus.py:113 -#, fuzzy -#| msgid "Persons and accounts" -msgid "Third-party accounts" -msgstr "Personae et computi" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -#, fuzzy -#| msgid "Notifications" -msgid "Authorized applications" -msgstr "Nuntii" - -#: aleksis/core/menus.py:133 -msgid "Admin" -msgstr "Administratio" - -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 -#: aleksis/core/templates/core/announcement/list.html:7 -#: aleksis/core/templates/core/announcement/list.html:8 -msgid "Announcements" -msgstr "Nuntii" - -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 -#: aleksis/core/templates/core/school_term/list.html:8 -#: aleksis/core/templates/core/school_term/list.html:9 -msgid "School terms" -msgstr "ani scolae" - -#: aleksis/core/menus.py:163 -#: aleksis/core/templates/core/dashboard_widget/list.html:8 -#: aleksis/core/templates/core/dashboard_widget/list.html:9 -#, fuzzy -#| msgid "Dashboard" -msgid "Dashboard widgets" -msgstr "Forum" - -#: aleksis/core/menus.py:174 -#: aleksis/core/templates/core/management/data_management.html:6 -#: aleksis/core/templates/core/management/data_management.html:7 -msgid "Data management" -msgstr "Adminstratio datarum" - -#: aleksis/core/menus.py:185 -#: aleksis/core/templates/core/pages/system_status.html:5 -#: aleksis/core/templates/core/pages/system_status.html:7 -msgid "System status" -msgstr "Status systemae" - -#: aleksis/core/menus.py:196 -#, fuzzy -#| msgid "Notification" -msgid "Configuration" -msgstr "Nuntius" - -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 -#: aleksis/core/templates/core/data_check/list.html:10 -#, fuzzy -#| msgid "System status" -msgid "Data checks" -msgstr "Status systemae" - -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 -#: aleksis/core/templates/core/perms/list.html:14 -msgid "Manage permissions" -msgstr "" - -#: aleksis/core/menus.py:224 -msgid "Backend Admin" -msgstr "" - -#: aleksis/core/menus.py:232 -#: aleksis/core/templates/oauth2_provider/application/list.html:5 -#: aleksis/core/templates/oauth2_provider/application/list.html:6 -#, fuzzy -#| msgid "Notifications" -msgid "OAuth2 Applications" -msgstr "Nuntii" - -#: aleksis/core/menus.py:245 -msgid "People" -msgstr "Personae" - -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 -#: aleksis/core/templates/core/group_type/list.html:8 -#: aleksis/core/templates/core/group_type/list.html:9 -#, fuzzy -#| msgid "Groups" -msgid "Group types" -msgstr "Greges" - -#: aleksis/core/menus.py:287 -msgid "Groups and child groups" -msgstr "" - -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 -#: aleksis/core/templates/core/additional_field/list.html:8 -#: aleksis/core/templates/core/additional_field/list.html:9 -#, fuzzy -#| msgid "Additional name(s)" -msgid "Additional fields" -msgstr "addita nomines" - -#: aleksis/core/menus.py:309 -#, fuzzy -#| msgid "Stop impersonation" -msgid "Invite person" -msgstr "Simulandum aliquem finire" - -#: aleksis/core/menus.py:322 -#: aleksis/core/templates/core/group/child_groups.html:7 -#: aleksis/core/templates/core/group/child_groups.html:9 -msgid "Assign child groups to groups" -msgstr "" - #: aleksis/core/mixins.py:511 #, fuzzy #| msgid "Edit school term" msgid "Linked school term" msgstr "Muta anum scolae" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:83 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:85 msgid "Date and time" msgstr "Dies et hora" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:86 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:88 msgid "Integer" msgstr "" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:89 #, fuzzy #| msgid "E-mail address" msgid "IP address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:93 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 msgid "Name" msgstr "Nomen" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:107 msgid "Start date" msgstr "" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:108 msgid "End date" msgstr "" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "ani scolae" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 msgid "Person" msgstr "Persona" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:166 #, fuzzy #| msgid "E-mail address" msgid "Can view address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:167 #, fuzzy #| msgid "E-mail address" msgid "Can view contact details" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:168 #, fuzzy #| msgid "E-mail address" msgid "Can view photo" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:169 #, fuzzy #| msgid "E-mail address" msgid "Can view avatar image" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:170 #, fuzzy #| msgid "Persons and accounts" msgid "Can view persons groups" msgstr "Personae et computi" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:171 #, fuzzy #| msgid "Stop impersonation" msgid "Can view personal details" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "female" msgstr "femininum" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "male" msgstr "maskulinum" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:181 +msgid "other" +msgstr "" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "addita nomines" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 msgid "Short name" msgstr "Breve nomen" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:202 msgid "Street" msgstr "Via" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:203 msgid "Street number" msgstr "Numerus domini" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:204 msgid "Postal code" msgstr "Numerus directorius" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:205 msgid "Place" msgstr "Urbs" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "Numerus telephoni domi" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "Numerus telephoni mobilis" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:212 msgid "Date of birth" msgstr "Dies natalis" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:213 #, fuzzy #| msgid "Date of birth" msgid "Place of birth" msgstr "Dies natalis" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:214 msgid "Sex" msgstr "Genus" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "Parentes" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:241 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 msgid "Description" msgstr "Descriptio" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:464 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:466 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "" + +#: aleksis/core/models.py:469 +#, fuzzy +#| msgid "Site description" +msgid "Help text / description" +msgstr "Descriptio paginae" + +#: aleksis/core/models.py:475 #, fuzzy #| msgid "Additional name(s)" msgid "Addtitional field for groups" msgstr "addita nomines" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:476 #, fuzzy #| msgid "Additional name(s)" msgid "Addtitional fields for groups" msgstr "addita nomines" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:497 #, fuzzy #| msgid "Persons and accounts" msgid "Can view statistics about group." msgstr "Personae et computi" -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 #, fuzzy #| msgid "Last name" msgid "Long name" msgstr "Secondus nomen" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:537 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +#, fuzzy +#| msgid "Additional name(s)" +msgid "Additional fields" +msgstr "addita nomines" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "Titulus" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:726 msgid "Application" msgstr "" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:732 msgid "Activity" msgstr "" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:733 msgid "Activities" msgstr "" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:739 msgid "Sender" msgstr "Mittens" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:744 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "Nota" + +#: aleksis/core/models.py:755 +#, fuzzy +#| msgid "Notification" +msgid "Send notification at" +msgstr "Nuntius" + +#: aleksis/core/models.py:757 msgid "Read" msgstr "" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:775 #, fuzzy #| msgid "Notifications" msgid "Notification" msgstr "Nuntii" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "Nuntii" + +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:875 #, fuzzy #| msgid "Announcements" msgid "Announcement" msgstr "Nuntii" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "Nuntii" + +#: aleksis/core/models.py:913 #, fuzzy #| msgid "Announcements" msgid "Announcement recipient" msgstr "Nuntii" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:914 #, fuzzy #| msgid "Announcements" msgid "Announcement recipients" msgstr "Nuntii" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:934 #, fuzzy #| msgid "Site title" msgid "Widget Title" msgstr "Titulus paginae" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:936 #, fuzzy #| msgid "Site title" msgid "Widget is broken" msgstr "Titulus paginae" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:989 #, fuzzy #| msgid "Dashboard" msgid "Can edit default dashboard" msgstr "Forum" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:990 #, fuzzy #| msgid "Dashboard" msgid "Dashboard Widget" msgstr "Forum" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:991 #, fuzzy #| msgid "Dashboard" msgid "Dashboard Widgets" msgstr "Forum" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:997 msgid "URL" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:998 #, fuzzy #| msgid "Icon" msgid "Icon URL" msgstr "Nota" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "" + +#: aleksis/core/models.py:1023 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget" msgstr "Forum" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1044 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget order" msgstr "Forum" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1045 #, fuzzy #| msgid "Dashboard" msgid "Dashboard widget orders" msgstr "Forum" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1075 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 -#: aleksis/core/templates/oauth2_provider/application/detail.html:26 -msgid "Icon" -msgstr "Nota" - -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1103 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 #, fuzzy #| msgid "Group" msgid "Group type" msgstr "Grex" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +#, fuzzy +#| msgid "Groups" +msgid "Group types" +msgstr "Greges" + +#: aleksis/core/models.py:1124 #, fuzzy #| msgid "System status" msgid "Can view system status" msgstr "Status systemae" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1125 #, fuzzy #| msgid "Data management" msgid "Can manage data" msgstr "Adminstratio datarum" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1126 #, fuzzy #| msgid "Stop impersonation" msgid "Can impersonate" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1127 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1132 #, fuzzy #| msgid "Stop impersonation" msgid "Can invite persons" msgstr "Simulandum aliquem finire" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1168 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1176 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1177 #, fuzzy #| msgid "Notifications" msgid "Notification sent" msgstr "Nuntii" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1190 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1191 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1201 #, fuzzy #| msgid "E-mail address" msgid "E-Mail address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1233 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1237 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1263 +#, fuzzy +#| msgid "Icon" +msgid "Back URL" +msgstr "Nota" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "" + +#: aleksis/core/models.py:1269 +#, fuzzy +#| msgid "Additional name(s)" +msgid "Additional button title" +msgstr "addita nomines" + +#: aleksis/core/models.py:1271 +#, fuzzy +#| msgid "Additional name(s)" +msgid "Additional button URL" +msgstr "addita nomines" + +#: aleksis/core/models.py:1273 +#, fuzzy +#| msgid "Additional name(s)" +msgid "Additional button icon" +msgstr "addita nomines" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "" + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1348 #, fuzzy #| msgid "Additional name(s)" msgid "Additional attributes" msgstr "addita nomines" -#: aleksis/core/models.py:1268 -msgid "Allowed scopes that clients can request" +#: aleksis/core/models.py:1386 +msgid "Allowed scopes that clients can request" +msgstr "" + +#: aleksis/core/models.py:1396 +msgid "This image will be shown as icon in the authorization flow. It should be squared." +msgstr "" + +#: aleksis/core/models.py:1441 +#, fuzzy +#| msgid "E-mail address" +msgid "Can view room timetable" +msgstr "Inscriptio electronica" + +#: aleksis/core/models.py:1443 +msgid "Room" msgstr "" -#: aleksis/core/models.py:1278 -msgid "This image will be shown as icon in the authorization flow. It should be squared." +#: aleksis/core/models.py:1444 +msgid "Rooms" msgstr "" #: aleksis/core/preferences.py:25 @@ -1185,152 +1162,169 @@ msgstr "" msgid "Channels to use for notifications" msgstr "" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:208 +#, fuzzy +#| msgid "Stop impersonation" +msgid "Select Design" +msgstr "Simulandum aliquem finire" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" msgstr "" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "" -#: aleksis/core/preferences.py:241 +#: aleksis/core/preferences.py:256 msgid "Automatically link existing persons to new users by their e-mail address" msgstr "" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "Officialis nomen scolae, e. g." -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "" + +#: aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "" + +#: aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:345 #, fuzzy #| msgid "E-mail address" msgid "Allowed Grant Flows for OAuth applications" msgstr "Inscriptio electronica" -#: aleksis/core/preferences.py:328 -msgid "Available languages" -msgstr "" - -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "" -#: aleksis/core/preferences.py:407 +#: aleksis/core/preferences.py:424 msgid "Editable fields on person model which should trigger a notification on change" msgstr "" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "" + +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" msgstr "" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:539 msgid "English" msgstr "Britannicus" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:540 msgid "German" msgstr "Germanus" -#: aleksis/core/tables.py:24 +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "" + +#: aleksis/core/tables.py:25 #: aleksis/core/templates/core/announcement/list.html:36 -#: aleksis/core/templates/core/group/full.html:24 -#: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/group/full.html:26 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 msgid "Edit" msgstr "" -#: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:138 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 #: aleksis/core/templates/core/announcement/list.html:22 #, fuzzy #| msgid "Notifications" msgid "Actions" msgstr "Nuntii" -#: aleksis/core/tables.py:61 aleksis/core/tables.py:62 -#: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:136 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 #: aleksis/core/templates/core/announcement/list.html:42 -#: aleksis/core/templates/core/group/full.html:31 +#: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 -#: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 msgid "Delete" msgstr "" #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 #: aleksis/core/templates/oauth2_provider/authorize.html:54 -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:24 msgid "Error" msgstr "" @@ -1359,7 +1353,7 @@ msgstr "" #: aleksis/core/templates/500.html:10 msgid "" "An unexpected error has\n" -" occured." +" occurred." msgstr "" #: aleksis/core/templates/500.html:13 @@ -1370,6 +1364,10 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1427,6 +1425,17 @@ msgstr "" msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "" + #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" msgstr "" @@ -1540,6 +1549,11 @@ msgstr "" msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "" + #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 msgid "Signup closed" @@ -1625,7 +1639,7 @@ msgstr "Quis nuntium videatne?" #: aleksis/core/templates/core/announcement/form.html:34 #, fuzzy #| msgid "Who should see the announcement?" -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "Quis nuntium videatne?" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1646,22 +1660,6 @@ msgstr "" msgid "There are no announcements." msgstr "Scribe nuntium:" -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "" - -#: aleksis/core/templates/core/base.html:179 -msgid "About AlekSIS® — The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/base.html:187 -msgid "Imprint" -msgstr "" - -#: aleksis/core/templates/core/base.html:195 -msgid "Privacy Policy" -msgstr "" - #: aleksis/core/templates/core/base_print.html:74 msgid "Powered by AlekSIS®" msgstr "" @@ -1692,6 +1690,13 @@ msgstr "" msgid "Edit %(widget)s" msgstr "" +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +#, fuzzy +#| msgid "Dashboard" +msgid "Dashboard widgets" +msgstr "Forum" + #: aleksis/core/templates/core/dashboard_widget/list.html:15 #, fuzzy #| msgid "Dashboard" @@ -1712,6 +1717,13 @@ msgstr "Simulandum aliquem finire" msgid "Edit default dashboard" msgstr "Forum" +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +#, fuzzy +#| msgid "System status" +msgid "Data checks" +msgstr "Status systemae" + #: aleksis/core/templates/core/data_check/list.html:15 msgid "Check data again" msgstr "" @@ -1813,6 +1825,11 @@ msgstr "Forum" msgid "Default dashboard" msgstr "Forum" +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "" + #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" @@ -1891,36 +1908,34 @@ msgstr "" msgid "Edit group" msgstr "" -#: aleksis/core/templates/core/group/full.html:38 -#: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "" -#: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 #, fuzzy #| msgid "System status" msgid "Statistics" msgstr "Status systemae" -#: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "" -#: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 -msgid "years to" -msgstr "" - -#: aleksis/core/templates/core/group/full.html:76 -msgid "years " +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " msgstr "" #: aleksis/core/templates/core/group/list.html:14 @@ -1957,7 +1972,7 @@ msgstr "Grex" msgid "Home" msgstr "" -#: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" " You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" @@ -1965,109 +1980,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "" -#: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "" -#: aleksis/core/templates/core/index.html:82 -#, fuzzy -#| msgid "Notifications" -msgid "Recent notifications" -msgstr "Nuntii" - -#: aleksis/core/templates/core/index.html:98 -#: aleksis/core/templates/core/notifications.html:23 -#, fuzzy -#| msgid "Edit school information" -msgid "More information →" -msgstr "Muta informationes scolae" - -#: aleksis/core/templates/core/index.html:105 -#: aleksis/core/templates/core/notifications.html:30 -msgid "No notifications available yet." -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:6 -msgid "About AlekSIS®" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:7 -msgid "AlekSIS® – The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:15 -msgid "About AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:17 -msgid "" -"\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" -" can be used by anyone.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:24 -msgid "" -"\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:30 -msgid "Website of AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:31 -msgid "Source code" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:40 -#, fuzzy -#| msgid "Edit school information" -msgid "Licence information" -msgstr "Muta informationes scolae" - -#: aleksis/core/templates/core/pages/about.html:42 -msgid "" -"\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" -" licences are marked like this:\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:50 -msgid "Free/Open Source Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:51 -msgid "Other Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:55 -msgid "Full licence text" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:56 -#, fuzzy -#| msgid "Edit school information" -msgid "More information about the EUPL" -msgstr "Muta informationes scolae" - -#: aleksis/core/templates/core/pages/about.html:95 -#, python-format -msgid "" -"\n" -" This app is licenced under %(licence)s.\n" -" " -msgstr "" - #: aleksis/core/templates/core/pages/delete.html:6 #, python-format msgid "Delete %(object_name)s" @@ -2081,17 +2001,10 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/pages/progress.html:27 -msgid "" -"\n" -" Without activated JavaScript the progress status can't be updated.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/progress.html:47 -#: aleksis/core/templates/two_factor/core/otp_required.html:19 -msgid "Go back" -msgstr "" +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" +msgstr "Status systemae" #: aleksis/core/templates/core/pages/system_status.html:12 #, fuzzy @@ -2099,87 +2012,87 @@ msgstr "" msgid "System checks" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access the site.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 #, fuzzy #| msgid "System status" msgid "System health checks" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 #, fuzzy #| msgid "System status" msgid "Status" msgstr "Status systemae" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 #, fuzzy #| msgid "Date" msgid "Date done" @@ -2222,6 +2135,18 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" +msgstr "" + +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +#, fuzzy +#| msgid "Notifications" +msgid "Identicon" +msgstr "Nuntii" + #: aleksis/core/templates/core/partials/crud_events.html:15 msgid "Changed by" msgstr "" @@ -2230,29 +2155,11 @@ msgstr "" msgid "Unknown" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:15 -msgid "Language" -msgstr "" - -#: aleksis/core/templates/core/partials/language_form.html:27 -msgid "Select language" -msgstr "" - -#: aleksis/core/templates/core/partials/no_person.html:12 -msgid "" -"\n" -" Your administrator account is not linked to any person. Therefore,\n" -" a dummy person has been linked to your account.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/partials/no_person.html:19 +#: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " msgstr "" #: aleksis/core/templates/core/perms/assign.html:12 @@ -2270,6 +2177,11 @@ msgstr "Simulandum aliquem finire" msgid "Assign" msgstr "" +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "" + #: aleksis/core/templates/core/perms/list.html:21 msgid "Assign a new permission" msgstr "" @@ -2315,32 +2227,6 @@ msgstr "Simulandum aliquem finire" msgid "Edit person" msgstr "" -#: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 -#, fuzzy -#| msgid "Impersonation" -msgid "Impersonate" -msgstr "Simulare aliquem" - -#: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 -#, fuzzy -#| msgid "Impersonation" -msgid "Invite user" -msgstr "Simulare aliquem" - -#: aleksis/core/templates/core/person/full.html:133 -msgid "Contact details" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:224 -msgid "This person didn't upload a personal photo." -msgstr "" - -#: aleksis/core/templates/core/person/full.html:232 -msgid "Children" -msgstr "" - #: aleksis/core/templates/core/person/list.html:21 msgid "Filter persons" msgstr "" @@ -2362,6 +2248,10 @@ msgstr "Muta anum scolae" msgid "Edit school term" msgstr "Muta anum scolae" +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "" + #: aleksis/core/templates/dynamic_preferences/form.html:9 msgid "Site preferences" msgstr "" @@ -2395,6 +2285,12 @@ msgstr "" msgid "site preferences page" msgstr "" +#: aleksis/core/templates/invitations/enter.html:7 +#, fuzzy +#| msgid "Edit school information" +msgid "Accept invitation" +msgstr "Muta informationes scolae" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2493,6 +2389,13 @@ msgstr "Nuntii" msgid "Edit OAuth2 Application" msgstr "Nuntii" +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +#, fuzzy +#| msgid "Notifications" +msgid "OAuth2 Applications" +msgstr "Nuntii" + #: aleksis/core/templates/oauth2_provider/application/list.html:11 #, fuzzy #| msgid "Edit school information" @@ -2527,14 +2430,6 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:12 -msgid "Success!" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 -msgid "Please return to your application and enter this code:" -msgstr "" - #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 @@ -2549,6 +2444,13 @@ msgstr "" msgid "Revoke" msgstr "" +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +#, fuzzy +#| msgid "Notifications" +msgid "Authorized applications" +msgstr "Nuntii" + #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 #, fuzzy #| msgid "Notifications" @@ -2559,16 +2461,14 @@ msgstr "Nuntii" msgid "Network error" msgstr "" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." msgstr "" -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" " administrators:\n" " " @@ -2824,7 +2724,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "" @@ -2864,6 +2764,12 @@ msgstr "" msgid "Generate Tokens" msgstr "" +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "nomen profiteri" + #: aleksis/core/templates/two_factor/core/login.html:27 #, fuzzy, python-format #| msgid "Stop impersonation" @@ -2929,15 +2835,15 @@ msgstr "" msgid "Or, alternatively, use one of your backup phones:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "" @@ -2959,6 +2865,10 @@ msgid "" " security." msgstr "" +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + #: aleksis/core/templates/two_factor/core/phone_register.html:5 #: aleksis/core/templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" @@ -3174,190 +3084,247 @@ msgid "" " " msgstr "" -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "" -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "" -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:766 -msgid "The additional_field has been saved." -msgstr "" +#: aleksis/core/views.py:730 +#, fuzzy +#| msgid "Additional name(s)" +msgid "The additional field has been saved." +msgstr "addita nomines" -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:857 #, fuzzy #| msgid "System status" msgid "Run data checks …" msgstr "Status systemae" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1337 -msgid "The requested PDF file does not exist" -msgstr "" - -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 -msgid "The requested task does not exist or is not accessible" -msgstr "" - -#: aleksis/core/views.py:1388 +#: aleksis/core/views.py:1349 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1466 +#: aleksis/core/views.py:1432 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1443 msgid "Person was already invited." msgstr "" +#~ msgid "Dashboard" +#~ msgstr "Forum" + +#~ msgid "Admin" +#~ msgstr "Administratio" + +#~ msgid "Data management" +#~ msgstr "Adminstratio datarum" + +#, fuzzy +#~| msgid "Notification" +#~ msgid "Configuration" +#~ msgstr "Nuntius" + +#~ msgid "People" +#~ msgstr "Personae" + +#, fuzzy +#~| msgid "Stop impersonation" +#~ msgid "Invite person" +#~ msgstr "Simulandum aliquem finire" + +#~ msgid "Stop impersonation" +#~ msgstr "Simulandum aliquem finire" + +#, fuzzy +#~| msgid "Persons and accounts" +#~ msgid "Third-party accounts" +#~ msgstr "Personae et computi" + +#~ msgid "Logout" +#~ msgstr "nomen retractare" + +#, fuzzy +#~| msgid "Notifications" +#~ msgid "Recent notifications" +#~ msgstr "Nuntii" + +#, fuzzy +#~| msgid "Edit school information" +#~ msgid "More information →" +#~ msgstr "Muta informationes scolae" + +#, fuzzy +#~| msgid "Edit school information" +#~ msgid "Licence information" +#~ msgstr "Muta informationes scolae" + +#, fuzzy +#~| msgid "Edit school information" +#~ msgid "More information about the EUPL" +#~ msgstr "Muta informationes scolae" + +#, fuzzy +#~| msgid "Impersonation" +#~ msgid "Impersonate" +#~ msgstr "Simulare aliquem" + +#, fuzzy +#~| msgid "Impersonation" +#~ msgid "Invite user" +#~ msgstr "Simulare aliquem" + #, fuzzy #~| msgid "Street number" #~ msgid "home number" diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po index dfec73c5c894d3d686092593be9c21a811cd0535..726d9cab18b9d431a74d68ffb2df35db6aff97b5 100644 --- a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -28,7 +28,3 @@ msgstr "" #: aleksis/core/static/js/main.js:68 msgid "OK" msgstr "" - -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po index ab1f6b974dc48a296d3eead2faacea0232b1461d..2ea99e7cad1be5a61c71b50784fec05db9003c9d 100644 --- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po +++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,57 +17,64 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:157 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:158 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:159 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 msgid "Groups" msgstr "" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:284 msgid "Deactivate DashboardWidget" msgstr "" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "" -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "" -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 -#: aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "" + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 #: aleksis/core/templates/search/search.html:22 @@ -90,11 +97,11 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 msgid "Group" msgstr "" @@ -102,7 +109,7 @@ msgstr "" msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 msgid "Address" msgstr "" @@ -130,7 +137,7 @@ msgstr "" msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 msgid "School term" msgstr "" @@ -139,8 +146,7 @@ msgid "Common data" msgstr "" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 -#: aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" @@ -149,18 +155,18 @@ msgstr "" msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:84 msgid "Date" msgstr "" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:92 msgid "Time" msgstr "" @@ -196,11 +202,11 @@ msgstr "" msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "Last name" msgstr "" @@ -229,11 +235,11 @@ msgid "You must select at least one group or person which should get the permiss msgstr "" #: aleksis/core/forms.py:499 -msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." msgstr "" #: aleksis/core/forms.py:586 -msgid "Adress data" +msgid "Address data" msgstr "" #: aleksis/core/forms.py:598 @@ -248,7 +254,15 @@ msgstr "" msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "" + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" + +#: aleksis/core/forms.py:828 msgid "No valid selection." msgstr "" @@ -272,700 +286,665 @@ msgstr "" msgid "No backup result found!" msgstr "" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:32 -#: aleksis/core/templates/two_factor/core/login.html:95 -msgid "Login" -msgstr "" - -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 -#: aleksis/core/templates/socialaccount/signup.html:23 -msgid "Sign up" -msgstr "" - -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 -msgid "Accept invitation" -msgstr "" - -#: aleksis/core/menus.py:33 -msgid "Dashboard" -msgstr "" - -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "" - -#: aleksis/core/menus.py:113 -msgid "Third-party accounts" -msgstr "" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/menus.py:133 -msgid "Admin" -msgstr "" - -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 -#: aleksis/core/templates/core/announcement/list.html:7 -#: aleksis/core/templates/core/announcement/list.html:8 -msgid "Announcements" -msgstr "" - -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 -#: aleksis/core/templates/core/school_term/list.html:8 -#: aleksis/core/templates/core/school_term/list.html:9 -msgid "School terms" -msgstr "" - -#: aleksis/core/menus.py:163 -#: aleksis/core/templates/core/dashboard_widget/list.html:8 -#: aleksis/core/templates/core/dashboard_widget/list.html:9 -msgid "Dashboard widgets" -msgstr "" - -#: aleksis/core/menus.py:174 -#: aleksis/core/templates/core/management/data_management.html:6 -#: aleksis/core/templates/core/management/data_management.html:7 -msgid "Data management" -msgstr "" - -#: aleksis/core/menus.py:185 -#: aleksis/core/templates/core/pages/system_status.html:5 -#: aleksis/core/templates/core/pages/system_status.html:7 -msgid "System status" -msgstr "" - -#: aleksis/core/menus.py:196 -msgid "Configuration" -msgstr "" - -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 -#: aleksis/core/templates/core/data_check/list.html:10 -msgid "Data checks" -msgstr "" - -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 -#: aleksis/core/templates/core/perms/list.html:14 -msgid "Manage permissions" -msgstr "" - -#: aleksis/core/menus.py:224 -msgid "Backend Admin" -msgstr "" - -#: aleksis/core/menus.py:232 -#: aleksis/core/templates/oauth2_provider/application/list.html:5 -#: aleksis/core/templates/oauth2_provider/application/list.html:6 -msgid "OAuth2 Applications" -msgstr "" - -#: aleksis/core/menus.py:245 -msgid "People" -msgstr "" - -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 -#: aleksis/core/templates/core/group_type/list.html:8 -#: aleksis/core/templates/core/group_type/list.html:9 -msgid "Group types" -msgstr "" - -#: aleksis/core/menus.py:287 -msgid "Groups and child groups" -msgstr "" - -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 -#: aleksis/core/templates/core/additional_field/list.html:8 -#: aleksis/core/templates/core/additional_field/list.html:9 -msgid "Additional fields" -msgstr "" - -#: aleksis/core/menus.py:309 -msgid "Invite person" -msgstr "" - -#: aleksis/core/menus.py:322 -#: aleksis/core/templates/core/group/child_groups.html:7 -#: aleksis/core/templates/core/group/child_groups.html:9 -msgid "Assign child groups to groups" -msgstr "" - #: aleksis/core/mixins.py:511 msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:83 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:85 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:86 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:88 msgid "Integer" msgstr "" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:89 msgid "IP address" msgstr "" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:93 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 msgid "Name" msgstr "" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:107 msgid "Start date" msgstr "" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:108 msgid "End date" msgstr "" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 msgid "Person" msgstr "" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:166 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:167 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:168 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:169 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:170 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:171 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "female" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:181 +msgid "other" +msgstr "" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 msgid "Short name" msgstr "" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:202 msgid "Street" msgstr "" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:203 msgid "Street number" msgstr "" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:204 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:205 msgid "Place" msgstr "" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:212 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:213 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:214 msgid "Sex" msgstr "" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:241 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 msgid "Description" msgstr "" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:464 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:466 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "" + +#: aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "" + +#: aleksis/core/models.py:475 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:476 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:497 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 msgid "Long name" msgstr "" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:537 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:726 msgid "Application" msgstr "" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:732 msgid "Activity" msgstr "" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:733 msgid "Activities" msgstr "" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:739 msgid "Sender" msgstr "" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:744 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "" + +#: aleksis/core/models.py:757 msgid "Read" msgstr "" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:775 msgid "Notification" msgstr "" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "" + +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:875 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "" + +#: aleksis/core/models.py:913 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:914 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:934 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:936 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:989 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:990 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:991 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:997 msgid "URL" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:998 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "" + +#: aleksis/core/models.py:1023 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1044 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1045 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1075 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 -#: aleksis/core/templates/oauth2_provider/application/detail.html:26 -msgid "Icon" -msgstr "" - -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1103 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +msgid "Group types" +msgstr "" + +#: aleksis/core/models.py:1124 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1125 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1126 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1127 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1132 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1168 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1176 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1177 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1190 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1191 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1201 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1233 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1237 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1263 +msgid "Back URL" +msgstr "" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "" + +#: aleksis/core/models.py:1269 +msgid "Additional button title" +msgstr "" + +#: aleksis/core/models.py:1271 +msgid "Additional button URL" +msgstr "" + +#: aleksis/core/models.py:1273 +msgid "Additional button icon" +msgstr "" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "" + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1348 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1268 +#: aleksis/core/models.py:1386 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1278 +#: aleksis/core/models.py:1396 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" +#: aleksis/core/models.py:1441 +msgid "Can view room timetable" +msgstr "" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + #: aleksis/core/preferences.py:25 msgid "General" msgstr "" @@ -1054,148 +1033,163 @@ msgstr "" msgid "Channels to use for notifications" msgstr "" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:208 +msgid "Select Design" +msgstr "" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" msgstr "" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "" -#: aleksis/core/preferences.py:241 +#: aleksis/core/preferences.py:256 msgid "Automatically link existing persons to new users by their e-mail address" msgstr "" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "" + +#: aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "" + +#: aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:345 msgid "Allowed Grant Flows for OAuth applications" msgstr "" -#: aleksis/core/preferences.py:328 -msgid "Available languages" -msgstr "" - -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "" -#: aleksis/core/preferences.py:407 +#: aleksis/core/preferences.py:424 msgid "Editable fields on person model which should trigger a notification on change" msgstr "" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "" + +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" msgstr "" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:539 msgid "English" msgstr "" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:540 msgid "German" msgstr "" -#: aleksis/core/tables.py:24 +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "" + +#: aleksis/core/tables.py:25 #: aleksis/core/templates/core/announcement/list.html:36 -#: aleksis/core/templates/core/group/full.html:24 -#: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/group/full.html:26 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 msgid "Edit" msgstr "" -#: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:138 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" -#: aleksis/core/tables.py:61 aleksis/core/tables.py:62 -#: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:136 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 #: aleksis/core/templates/core/announcement/list.html:42 -#: aleksis/core/templates/core/group/full.html:31 +#: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 -#: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 msgid "Delete" msgstr "" #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 #: aleksis/core/templates/oauth2_provider/authorize.html:54 -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:24 msgid "Error" msgstr "" @@ -1224,7 +1218,7 @@ msgstr "" #: aleksis/core/templates/500.html:10 msgid "" "An unexpected error has\n" -" occured." +" occurred." msgstr "" #: aleksis/core/templates/500.html:13 @@ -1235,6 +1229,10 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1290,6 +1288,17 @@ msgstr "" msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "" + #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" msgstr "" @@ -1403,6 +1412,11 @@ msgstr "" msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "" + #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 msgid "Signup closed" @@ -1474,7 +1488,7 @@ msgid "Publish new announcement" msgstr "" #: aleksis/core/templates/core/announcement/form.html:34 -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1493,22 +1507,6 @@ msgstr "" msgid "There are no announcements." msgstr "" -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "" - -#: aleksis/core/templates/core/base.html:179 -msgid "About AlekSIS® — The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/base.html:187 -msgid "Imprint" -msgstr "" - -#: aleksis/core/templates/core/base.html:195 -msgid "Privacy Policy" -msgstr "" - #: aleksis/core/templates/core/base_print.html:74 msgid "Powered by AlekSIS®" msgstr "" @@ -1538,6 +1536,11 @@ msgstr "" msgid "Edit %(widget)s" msgstr "" +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "" + #: aleksis/core/templates/core/dashboard_widget/list.html:15 msgid "Create dashboard widget" msgstr "" @@ -1553,6 +1556,11 @@ msgstr "" msgid "Edit default dashboard" msgstr "" +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "" + #: aleksis/core/templates/core/data_check/list.html:15 msgid "Check data again" msgstr "" @@ -1646,6 +1654,11 @@ msgstr "" msgid "Default dashboard" msgstr "" +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "" + #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" @@ -1724,34 +1737,32 @@ msgstr "" msgid "Edit group" msgstr "" -#: aleksis/core/templates/core/group/full.html:38 -#: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "" -#: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 msgid "Statistics" msgstr "" -#: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "" -#: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 -msgid "years to" -msgstr "" - -#: aleksis/core/templates/core/group/full.html:76 -msgid "years " +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " msgstr "" #: aleksis/core/templates/core/group/list.html:14 @@ -1784,7 +1795,7 @@ msgstr "" msgid "Home" msgstr "" -#: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" " You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" @@ -1792,101 +1803,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "" -#: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "" -#: aleksis/core/templates/core/index.html:82 -msgid "Recent notifications" -msgstr "" - -#: aleksis/core/templates/core/index.html:98 -#: aleksis/core/templates/core/notifications.html:23 -msgid "More information →" -msgstr "" - -#: aleksis/core/templates/core/index.html:105 -#: aleksis/core/templates/core/notifications.html:30 -msgid "No notifications available yet." -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:6 -msgid "About AlekSIS®" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:7 -msgid "AlekSIS® – The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:15 -msgid "About AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:17 -msgid "" -"\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" -" can be used by anyone.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:24 -msgid "" -"\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:30 -msgid "Website of AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:31 -msgid "Source code" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:40 -msgid "Licence information" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:42 -msgid "" -"\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" -" licences are marked like this:\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:50 -msgid "Free/Open Source Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:51 -msgid "Other Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:55 -msgid "Full licence text" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:56 -msgid "More information about the EUPL" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:95 -#, python-format -msgid "" -"\n" -" This app is licenced under %(licence)s.\n" -" " -msgstr "" - #: aleksis/core/templates/core/pages/delete.html:6 #, python-format msgid "Delete %(object_name)s" @@ -1900,99 +1824,92 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/pages/progress.html:27 -msgid "" -"\n" -" Without activated JavaScript the progress status can't be updated.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/progress.html:47 -#: aleksis/core/templates/two_factor/core/otp_required.html:19 -msgid "Go back" +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" msgstr "" #: aleksis/core/templates/core/pages/system_status.html:12 msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access the site.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 msgid "Date done" msgstr "" @@ -2033,37 +1950,29 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Changed by" -msgstr "" - -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Unknown" +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:15 -msgid "Language" +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:27 -msgid "Select language" +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:12 -msgid "" -"\n" -" Your administrator account is not linked to any person. Therefore,\n" -" a dummy person has been linked to your account.\n" -" " +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:19 +#: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " msgstr "" #: aleksis/core/templates/core/perms/assign.html:12 @@ -2079,6 +1988,11 @@ msgstr "" msgid "Assign" msgstr "" +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "" + #: aleksis/core/templates/core/perms/list.html:21 msgid "Assign a new permission" msgstr "" @@ -2122,28 +2036,6 @@ msgstr "" msgid "Edit person" msgstr "" -#: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 -msgid "Impersonate" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 -msgid "Invite user" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:133 -msgid "Contact details" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:224 -msgid "This person didn't upload a personal photo." -msgstr "" - -#: aleksis/core/templates/core/person/full.html:232 -msgid "Children" -msgstr "" - #: aleksis/core/templates/core/person/list.html:21 msgid "Filter persons" msgstr "" @@ -2163,6 +2055,10 @@ msgstr "" msgid "Edit school term" msgstr "" +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "" + #: aleksis/core/templates/dynamic_preferences/form.html:9 msgid "Site preferences" msgstr "" @@ -2196,6 +2092,10 @@ msgstr "" msgid "site preferences page" msgstr "" +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2284,6 +2184,11 @@ msgstr "" msgid "Edit OAuth2 Application" msgstr "" +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/application/list.html:11 msgid "Register new application" msgstr "" @@ -2315,14 +2220,6 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:12 -msgid "Success!" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 -msgid "Please return to your application and enter this code:" -msgstr "" - #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 @@ -2337,6 +2234,11 @@ msgstr "" msgid "Revoke" msgstr "" +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 msgid "No authorized applications." msgstr "" @@ -2345,16 +2247,14 @@ msgstr "" msgid "Network error" msgstr "" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." msgstr "" -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" " administrators:\n" " " @@ -2595,7 +2495,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "" @@ -2635,6 +2535,12 @@ msgstr "" msgid "Generate Tokens" msgstr "" +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "" + #: aleksis/core/templates/two_factor/core/login.html:27 #, python-format msgid "Login for %(name)s" @@ -2699,15 +2605,15 @@ msgstr "" msgid "Or, alternatively, use one of your backup phones:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "" @@ -2729,6 +2635,10 @@ msgid "" " security." msgstr "" +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + #: aleksis/core/templates/two_factor/core/phone_register.html:5 #: aleksis/core/templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" @@ -2944,185 +2854,177 @@ msgid "" " " msgstr "" -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "" -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "" -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:766 -msgid "The additional_field has been saved." +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:857 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1337 -msgid "The requested PDF file does not exist" -msgstr "" - -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 -msgid "The requested task does not exist or is not accessible" -msgstr "" - -#: aleksis/core/views.py:1388 +#: aleksis/core/views.py:1349 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1466 +#: aleksis/core/views.py:1432 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1443 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po index dfec73c5c894d3d686092593be9c21a811cd0535..726d9cab18b9d431a74d68ffb2df35db6aff97b5 100644 --- a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -28,7 +28,3 @@ msgstr "" #: aleksis/core/static/js/main.js:68 msgid "OK" msgstr "" - -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "" diff --git a/aleksis/core/locale/ru/LC_MESSAGES/django.po b/aleksis/core/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000000000000000000000000000000000000..90703e6c4415480c873dbdaf505af0622a2ea982 --- /dev/null +++ b/aleksis/core/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,3617 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" +"PO-Revision-Date: 2022-07-05 12:54+0000\n" +"Last-Translator: Serhii Horichenko <m@sgg.im>\n" +"Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-core/ru/>\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"X-Generator: Weblate 4.12.1\n" + +#: aleksis/core/apps.py:155 +msgid "OpenID Connect scope" +msgstr "Граница дейÑÑ‚Ð²Ð¸Ñ OpenID Connect" + +#: aleksis/core/apps.py:156 +msgid "Given name, family name, link to profile and picture if existing." +msgstr "ИмÑ, фамилиÑ, ÑÑылка на профиль и фото, еÑли еÑть." + +#: aleksis/core/apps.py:157 +msgid "Full home postal address" +msgstr "Полный домашний почтовый адреÑ" + +#: aleksis/core/apps.py:158 +msgid "Email address" +msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" + +#: aleksis/core/apps.py:159 +msgid "Home and mobile phone" +msgstr "Домашний и мобильный телефоны" + +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/templates/core/group/list.html:9 +msgid "Groups" +msgstr "Группы" + +#: aleksis/core/data_checks.py:60 +msgid "Ignore problem" +msgstr "Игнорировать проблему" + +#: aleksis/core/data_checks.py:188 +#, python-brace-format +msgid "Solve option '{solve_option_obj.verbose_name}' " +msgstr "Вариант Ñ€ÐµÑˆÐµÐ½Ð¸Ñ '{solve_option_obj.verbose_name}' " + +#: aleksis/core/data_checks.py:284 +msgid "Deactivate DashboardWidget" +msgstr "Отключить виджет информпанели" + +#: aleksis/core/data_checks.py:296 +msgid "Ensure that there are no broken DashboardWidgets." +msgstr "УбедитеÑÑŒ в отÑутÑтвии Ñбойных виджетов на информапанели." + +#: aleksis/core/data_checks.py:297 +msgid "The DashboardWidget was reported broken automatically." +msgstr "Виджет информпанели Ñообщил о Ñбое в автоматичеÑком режиме." + +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "Проверьте поле %s модели %s." + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "Поле %s проверить не удалоÑÑŒ." + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/templates/core/person/list.html:24 +#: aleksis/core/templates/search/search.html:7 +#: aleksis/core/templates/search/search.html:22 +msgid "Search" +msgstr "ПоиÑк" + +#: aleksis/core/filters.py:59 +msgid "Search by name" +msgstr "ПоиÑк по имени" + +#: aleksis/core/filters.py:71 +msgid "Search by contact details" +msgstr "ПоиÑк по контактным данным" + +#: aleksis/core/filters.py:92 +msgid "Permission" +msgstr "Разрешение" + +#: aleksis/core/filters.py:100 +msgid "Content type" +msgstr "Тип Ñодержимого" + +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +msgid "User" +msgstr "Пользователь" + +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +msgid "Group" +msgstr "Группа" + +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +msgid "Base data" +msgstr "ОÑновные данные" + +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +msgid "Address" +msgstr "ÐдреÑ" + +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +msgid "Contact data" +msgstr "Контактные данные" + +#: aleksis/core/forms.py:58 +msgid "Advanced personal data" +msgstr "Дополнительные личные данные" + +#: aleksis/core/forms.py:106 +msgid "New user" +msgstr "Ðовый пользователь" + +#: aleksis/core/forms.py:106 +msgid "Create a new account" +msgstr "Создать новую учётную запиÑÑŒ" + +#: aleksis/core/forms.py:132 +msgid "You cannot set a new username when also selecting an existing user." +msgstr "ПоÑле выбора ÑущеÑтвующего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñоздать новый логин нельзÑ." + +#: aleksis/core/forms.py:136 +msgid "This username is already in use." +msgstr "Ðтот логин уже занÑÑ‚." + +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +msgid "School term" +msgstr "Учебный год" + +#: aleksis/core/forms.py:154 +msgid "Common data" +msgstr "Общие данные" + +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/templates/core/person/list.html:9 +msgid "Persons" +msgstr "Люди" + +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +msgid "Additional data" +msgstr "Дополнительные данные" + +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +msgid "Photo" +msgstr "Фото" + +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 +#: aleksis/core/models.py:84 +msgid "Date" +msgstr "Дата" + +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:92 +msgid "Time" +msgstr "ВремÑ" + +#: aleksis/core/forms.py:233 +msgid "From when until when should the announcement be displayed?" +msgstr "С какого и по какое Ð²Ñ€ÐµÐ¼Ñ Ñто объÑвление должно отображатьÑÑ?" + +#: aleksis/core/forms.py:236 +msgid "Who should see the announcement?" +msgstr "Кто должен видеть Ñто объÑвление?" + +#: aleksis/core/forms.py:237 +msgid "Write your announcement:" +msgstr "Ðапишите Ñвое объÑвление:" + +#: aleksis/core/forms.py:276 +msgid "You are not allowed to create announcements which are only valid in the past." +msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð¾Ð³Ð¾ Вам Ñоздавать не разрешено." + +#: aleksis/core/forms.py:280 +msgid "The from date and time must be earlier then the until date and time." +msgstr "Дата и Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° должны быть до даты и времени окончаниÑ." + +#: aleksis/core/forms.py:289 +msgid "You need at least one recipient." +msgstr "Ðужен Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один получатель." + +#: aleksis/core/forms.py:398 +msgid "Invitation code" +msgstr "Код приглашениÑ" + +#: aleksis/core/forms.py:399 +msgid "Please enter your invitation code." +msgstr "Укажите, пожалуйÑта, код приглашениÑ." + +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +msgid "First name" +msgstr "ИмÑ" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +msgid "Last name" +msgstr "ФамилиÑ" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "Ðтот Ñл.Ð°Ð´Ñ€ÐµÑ ÐºÐµÐ¼-то иÑпользуетÑÑ" + +#: aleksis/core/forms.py:456 +msgid "Who should get the permission?" +msgstr "Кто должен получить такое разрешение?" + +#: aleksis/core/forms.py:457 +msgid "On what?" +msgstr "Ð’ Ñлучае чего?" + +#: aleksis/core/forms.py:483 +msgid "Select objects which the permission should be granted for:" +msgstr "Отметьте объекты, к которым будет предоÑтавлен доÑтуп:" + +#: aleksis/core/forms.py:486 +msgid "Grant the permission for all objects" +msgstr "ПредоÑтавить доÑтуп ко вÑем объектам" + +#: aleksis/core/forms.py:494 +msgid "You must select at least one group or person which should get the permission." +msgstr "Вам нужно выбрать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну группу или физлицо, кто получит доÑтуп." + +#: aleksis/core/forms.py:499 +#, fuzzy +#| msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." +msgstr "Ð’Ñ‹ должны предоÑтавить доÑтуп ко вÑем и/или к некоторым объектам." + +#: aleksis/core/forms.py:586 +msgid "Address data" +msgstr "ПодробноÑти адреÑа" + +#: aleksis/core/forms.py:598 +msgid "Account data" +msgstr "Данные учётной запиÑи" + +#: aleksis/core/forms.py:605 +msgid "Password" +msgstr "Пароль" + +#: aleksis/core/forms.py:608 +msgid "Password (again)" +msgstr "Пароль (ещё раз)" + +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "Выбранное дейÑтвие не ÑущеÑтвует." + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "У Ð’Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° запуÑк {} на вÑех выбранных объектах." + +#: aleksis/core/forms.py:828 +msgid "No valid selection." +msgstr "Ðеправильный выбор." + +#: aleksis/core/health_checks.py:21 +msgid "There are unresolved data problems." +msgstr "ИмеютÑÑ Ð½ÐµÑ€ÐµÑˆÑ‘Ð½Ð½Ñ‹Ðµ проблемы Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸." + +#: aleksis/core/health_checks.py:40 +msgid "Error accessing backup storage: {}" +msgstr "Ошибка доÑтупа к резервному хранилищу: {}" + +#: aleksis/core/health_checks.py:50 +msgid "Last backup {}!" +msgstr "ПоÑледнÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ {}!" + +#: aleksis/core/health_checks.py:52 +msgid "No backup found!" +msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ найдена!" + +#: aleksis/core/health_checks.py:79 +msgid "No backup result found!" +msgstr "Результат резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ найден!" + +#: aleksis/core/mixins.py:511 +msgid "Linked school term" +msgstr "СвÑзанный учебный год" + +#: aleksis/core/models.py:82 +msgid "Boolean (Yes/No)" +msgstr "Булево (Да/Ðет)" + +#: aleksis/core/models.py:83 +msgid "Text (one line)" +msgstr "ТекÑÑ‚ (одна Ñтрока)" + +#: aleksis/core/models.py:85 +msgid "Date and time" +msgstr "Дата и времÑ" + +#: aleksis/core/models.py:86 +msgid "Decimal number" +msgstr "ДеÑÑтичное чиÑло" + +#: aleksis/core/models.py:87 aleksis/core/models.py:210 +msgid "E-mail address" +msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" + +#: aleksis/core/models.py:88 +msgid "Integer" +msgstr "Целое" + +#: aleksis/core/models.py:89 +msgid "IP address" +msgstr "IP адреÑ" + +#: aleksis/core/models.py:90 +msgid "Boolean or empty (Yes/No/Neither)" +msgstr "Булево или пуÑтое (Да/Ðет/Ðичего)" + +#: aleksis/core/models.py:91 +msgid "Text (multi-line)" +msgstr "ТекÑÑ‚ (многоÑтрочный)" + +#: aleksis/core/models.py:93 +msgid "URL / Link" +msgstr "URL / СÑылка" + +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +msgid "Name" +msgstr "ИмÑ" + +#: aleksis/core/models.py:107 +msgid "Start date" +msgstr "Дата начала" + +#: aleksis/core/models.py:108 +msgid "End date" +msgstr "Дата окончаниÑ" + +#: aleksis/core/models.py:127 +msgid "The start date must be earlier than the end date." +msgstr "Дата начала должна быть ранее даты окончаниÑ." + +#: aleksis/core/models.py:134 +msgid "There is already a school term for this time or a part of this time." +msgstr "Ðа Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ на его чаÑть уже запланирован учебный год." + +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "Учебный год" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +msgid "Person" +msgstr "Физлицо" + +#: aleksis/core/models.py:166 +msgid "Can view address" +msgstr "Может видеть адреÑ" + +#: aleksis/core/models.py:167 +msgid "Can view contact details" +msgstr "Может видеть контактные данные" + +#: aleksis/core/models.py:168 +msgid "Can view photo" +msgstr "Может видеть фото" + +#: aleksis/core/models.py:169 +msgid "Can view avatar image" +msgstr "Может видеть аватар" + +#: aleksis/core/models.py:170 +msgid "Can view persons groups" +msgstr "Может видеть группы лиц" + +#: aleksis/core/models.py:171 +msgid "Can view personal details" +msgstr "Может видеть личные данные" + +#: aleksis/core/models.py:181 +msgid "female" +msgstr "жен" + +#: aleksis/core/models.py:181 +msgid "male" +msgstr "муж" + +#: aleksis/core/models.py:181 +msgid "other" +msgstr "другой" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 +msgid "Linked user" +msgstr "СвÑзанный пользователь" + +#: aleksis/core/models.py:195 +msgid "Additional name(s)" +msgstr "Дополнительные имена" + +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 +msgid "Short name" +msgstr "Короткое имÑ" + +#: aleksis/core/models.py:202 +msgid "Street" +msgstr "Улица" + +#: aleksis/core/models.py:203 +msgid "Street number" +msgstr "Ðомер дома" + +#: aleksis/core/models.py:204 +msgid "Postal code" +msgstr "Почтовый индекÑ" + +#: aleksis/core/models.py:205 +msgid "Place" +msgstr "Город/меÑто" + +#: aleksis/core/models.py:207 +msgid "Home phone" +msgstr "Домашний телефон" + +#: aleksis/core/models.py:208 +msgid "Mobile phone" +msgstr "Мобильный телефон" + +#: aleksis/core/models.py:212 +msgid "Date of birth" +msgstr "Дата рождениÑ" + +#: aleksis/core/models.py:213 +msgid "Place of birth" +msgstr "МеÑто рождениÑ" + +#: aleksis/core/models.py:214 +msgid "Sex" +msgstr "Пол" + +#: aleksis/core/models.py:221 aleksis/core/models.py:550 +msgid "This is an official photo, used for official documents and for internal use cases." +msgstr "Ðто официальное фото, которое иÑпользуетÑÑ Ð´Ð»Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² и внутренних нужд." + +#: aleksis/core/models.py:226 aleksis/core/models.py:554 +msgid "Display picture / Avatar" +msgstr "Отобразить фото/аватар" + +#: aleksis/core/models.py:229 aleksis/core/models.py:557 +msgid "This is a picture or an avatar for public display." +msgstr "Ðто фото или аватар Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ³Ð¾ отображениÑ." + +#: aleksis/core/models.py:234 +msgid "Guardians / Parents" +msgstr "Опекуны / Родители" + +#: aleksis/core/models.py:241 +msgid "Primary group" +msgstr "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" + +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 +msgid "Description" +msgstr "ОпиÑание" + +#: aleksis/core/models.py:464 +msgid "Title of field" +msgstr "Ðазвание полÑ" + +#: aleksis/core/models.py:466 +msgid "Type of field" +msgstr "Тип полÑ" + +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "Ðеобходимое" + +#: aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "Ð’Ñпомогательный текÑÑ‚ / опиÑание" + +#: aleksis/core/models.py:475 +msgid "Addtitional field for groups" +msgstr "Дополнительное поле Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" + +#: aleksis/core/models.py:476 +msgid "Addtitional fields for groups" +msgstr "Дополнительные Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿" + +#: aleksis/core/models.py:496 +msgid "Can assign child groups to groups" +msgstr "Может определÑть дочерние группы в группы" + +#: aleksis/core/models.py:497 +msgid "Can view statistics about group." +msgstr "Может видеть ÑтатиÑтику группы." + +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 +msgid "Long name" +msgstr "Длинное имÑ" + +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +msgid "Members" +msgstr "УчаÑтники" + +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +msgid "Owners" +msgstr "Владельцы" + +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +msgid "Parent groups" +msgstr "РодительÑкие группы" + +#: aleksis/core/models.py:537 +msgid "Type of group" +msgstr "Тип группы" + +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "Дополнительные полÑ" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 +#: aleksis/core/templates/core/announcement/list.html:18 +msgid "Title" +msgstr "Ðазвание" + +#: aleksis/core/models.py:726 +msgid "Application" +msgstr "Приложение" + +#: aleksis/core/models.py:732 +msgid "Activity" +msgstr "ÐктивноÑть" + +#: aleksis/core/models.py:733 +msgid "Activities" +msgstr "ÐктивноÑти" + +#: aleksis/core/models.py:739 +msgid "Sender" +msgstr "Отправитель" + +#: aleksis/core/models.py:744 +msgid "Recipient" +msgstr "Получатель" + +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +msgid "Link" +msgstr "СÑылка" + +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "Иконка" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "Отправить уведомление в" + +#: aleksis/core/models.py:757 +msgid "Read" +msgstr "Читать" + +#: aleksis/core/models.py:758 +msgid "Sent" +msgstr "Отправлено" + +#: aleksis/core/models.py:775 +msgid "Notification" +msgstr "Уведомление" + +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "УведомлениÑ" + +#: aleksis/core/models.py:844 +msgid "Link to detailed view" +msgstr "СÑылка на подробный обзор" + +#: aleksis/core/models.py:847 +msgid "Date and time from when to show" +msgstr "Дата и времÑ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ показывать" + +#: aleksis/core/models.py:850 +msgid "Date and time until when to show" +msgstr "Дата и времÑ, по какое показывать" + +#: aleksis/core/models.py:875 +msgid "Announcement" +msgstr "ОбъÑвление" + +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "ОбъÑвление" + +#: aleksis/core/models.py:913 +msgid "Announcement recipient" +msgstr "Получатель объÑвлениÑ" + +#: aleksis/core/models.py:914 +msgid "Announcement recipients" +msgstr "Получатели объÑвлениÑ" + +#: aleksis/core/models.py:934 +msgid "Widget Title" +msgstr "Ðазвание виджета" + +#: aleksis/core/models.py:935 +msgid "Activate Widget" +msgstr "Ðктивировать виджет" + +#: aleksis/core/models.py:936 +msgid "Widget is broken" +msgstr "Виджет поломалÑÑ" + +#: aleksis/core/models.py:939 +msgid "Size on mobile devices" +msgstr "Размер на мобильных" + +#: aleksis/core/models.py:940 +msgid "<= 600 px, 12 columns" +msgstr "<= 600 пикÑ, 12 Ñтолбцов" + +#: aleksis/core/models.py:945 +msgid "Size on tablet devices" +msgstr "Размер на планшетах" + +#: aleksis/core/models.py:946 +msgid "> 600 px, 12 columns" +msgstr "> 600 пикÑ, 12 Ñтолбцов" + +#: aleksis/core/models.py:951 +msgid "Size on desktop devices" +msgstr "Размер на ПК" + +#: aleksis/core/models.py:952 +msgid "> 992 px, 12 columns" +msgstr "> 992 пикÑ, 12 Ñтолбцов" + +#: aleksis/core/models.py:957 +msgid "Size on large desktop devices" +msgstr "Размер Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñкранов" + +#: aleksis/core/models.py:958 +msgid "> 1200 px>, 12 columns" +msgstr "> 1200 пикÑ, 12 Ñтолбцов" + +#: aleksis/core/models.py:989 +msgid "Can edit default dashboard" +msgstr "Может редактировать типовую/Ñтандартную информпанель" + +#: aleksis/core/models.py:990 +msgid "Dashboard Widget" +msgstr "Виджет информпанели" + +#: aleksis/core/models.py:991 +msgid "Dashboard Widgets" +msgstr "Виджеты информпанели" + +#: aleksis/core/models.py:997 +msgid "URL" +msgstr "URL" + +#: aleksis/core/models.py:998 +msgid "Icon URL" +msgstr "Иконка URL" + +#: aleksis/core/models.py:1004 +msgid "External link widget" +msgstr "ВнешнÑÑ ÑÑылка на виджет" + +#: aleksis/core/models.py:1005 +msgid "External link widgets" +msgstr "Внешние ÑÑылки на виджеты" + +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "Содержимое" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "Виджет Ñ Ð¿Ð¾ÑтоÑнным Ñодержимым" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "Виджеты Ñ Ð¿Ð¾ÑтоÑнным Ñодержимым" + +#: aleksis/core/models.py:1023 +msgid "Dashboard widget" +msgstr "Виджет информпанели" + +#: aleksis/core/models.py:1028 +msgid "Order" +msgstr "ПорÑдок" + +#: aleksis/core/models.py:1029 +msgid "Part of the default dashboard" +msgstr "ЧаÑть типовой информпанели" + +#: aleksis/core/models.py:1044 +msgid "Dashboard widget order" +msgstr "ПорÑдок виджета на информпанели" + +#: aleksis/core/models.py:1045 +msgid "Dashboard widget orders" +msgstr "ПорÑдок виджетов на информпанели" + +#: aleksis/core/models.py:1051 +msgid "Menu ID" +msgstr "Меню ID" + +#: aleksis/core/models.py:1064 +msgid "Custom menu" +msgstr "ПользовательÑкое меню" + +#: aleksis/core/models.py:1065 +msgid "Custom menus" +msgstr "ПользовательÑкие меню" + +#: aleksis/core/models.py:1075 +msgid "Menu" +msgstr "Меню" + +#: aleksis/core/models.py:1085 +msgid "Custom menu item" +msgstr "Пункт пользовательÑкого меню" + +#: aleksis/core/models.py:1086 +msgid "Custom menu items" +msgstr "Пункты пользовательÑкого меню" + +#: aleksis/core/models.py:1103 +msgid "Title of type" +msgstr "Ðазвание типа" + +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 +msgid "Group type" +msgstr "Тип группы" + +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +msgid "Group types" +msgstr "Типы групп" + +#: aleksis/core/models.py:1124 +msgid "Can view system status" +msgstr "Может проÑматривать ÑоÑтоÑние ÑиÑтемы" + +#: aleksis/core/models.py:1125 +msgid "Can manage data" +msgstr "Может управлÑть данными" + +#: aleksis/core/models.py:1126 +msgid "Can impersonate" +msgstr "Может маÑкироватьÑÑ" + +#: aleksis/core/models.py:1127 +msgid "Can use search" +msgstr "Может иÑпользовать поиÑк" + +#: aleksis/core/models.py:1128 +msgid "Can change site preferences" +msgstr "Может менÑть ÑвойÑтва Ñайта" + +#: aleksis/core/models.py:1129 +msgid "Can change person preferences" +msgstr "Может менÑть перÑональные ÑвойÑтва" + +#: aleksis/core/models.py:1130 +msgid "Can change group preferences" +msgstr "Может менÑть ÑвойÑтва группы" + +#: aleksis/core/models.py:1131 +msgid "Can test PDF generation" +msgstr "Может генерировать теÑтовые PDF" + +#: aleksis/core/models.py:1132 +msgid "Can invite persons" +msgstr "Может приглашать других" + +#: aleksis/core/models.py:1168 +msgid "Related data check task" +msgstr "Задание проверки ÑвÑзанных данных" + +#: aleksis/core/models.py:1176 +msgid "Issue solved" +msgstr "Проблема решена" + +#: aleksis/core/models.py:1177 +msgid "Notification sent" +msgstr "Уведомление отправлено" + +#: aleksis/core/models.py:1190 +msgid "Data check result" +msgstr "Результат проверки данных" + +#: aleksis/core/models.py:1191 +msgid "Data check results" +msgstr "Результаты проверки данных" + +#: aleksis/core/models.py:1193 +msgid "Can run data checks" +msgstr "Может запуÑкать проверки данных" + +#: aleksis/core/models.py:1194 +msgid "Can solve data check problems" +msgstr "Может решать проблемы проверки данных" + +#: aleksis/core/models.py:1201 +msgid "E-Mail address" +msgstr "ÐÐ´Ñ€ÐµÑ Ñл.почты" + +#: aleksis/core/models.py:1233 +msgid "Owner" +msgstr "Владелец" + +#: aleksis/core/models.py:1237 +msgid "File expires at" +msgstr "Файл дейÑтвителен до" + +#: aleksis/core/models.py:1240 +msgid "Generated HTML file" +msgstr "Сгенерированный файл HTML" + +#: aleksis/core/models.py:1243 +msgid "Generated PDF file" +msgstr "Сгенерированный файл PDF" + +#: aleksis/core/models.py:1250 +msgid "PDF file" +msgstr "Файл PDF" + +#: aleksis/core/models.py:1251 +msgid "PDF files" +msgstr "Файлы PDF" + +#: aleksis/core/models.py:1256 +msgid "Task result" +msgstr "Результат заданиÑ" + +#: aleksis/core/models.py:1259 +msgid "Task user" +msgstr "Пользователь заданиÑ" + +#: aleksis/core/models.py:1263 +#, fuzzy +#| msgid "Back" +msgid "Back URL" +msgstr "Ðазад" + +#: aleksis/core/models.py:1264 +#, fuzzy +#| msgid "Progress: Generate PDF file" +msgid "Progress title" +msgstr "Ð’ процеÑÑе: Генерирование файла PDF" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +#, fuzzy +#| msgid "Success!" +msgid "Success message" +msgstr "УÑпех!" + +#: aleksis/core/models.py:1267 +#, fuzzy +#| msgid "Redirect URIs" +msgid "Redirect on success URL" +msgstr "Перенаправление URI-адреÑов" + +#: aleksis/core/models.py:1269 +#, fuzzy +#| msgid "Additional attributes" +msgid "Additional button title" +msgstr "Дополнительные атрибуты" + +#: aleksis/core/models.py:1271 +#, fuzzy +#| msgid "Additional data" +msgid "Additional button URL" +msgstr "Дополнительные данные" + +#: aleksis/core/models.py:1273 +#, fuzzy +#| msgid "Additional attributes" +msgid "Additional button icon" +msgstr "Дополнительные атрибуты" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +#, fuzzy +#| msgid "ICal feed deleted successfully" +msgid "Background task completed successfully" +msgstr "Лента iCal уÑпешно удалена" + +#: aleksis/core/models.py:1301 +#, fuzzy +#| msgid "The PDF file has been generated successfully." +msgid "The background task '{}' has been completed successfully." +msgstr "Файл PDF уÑпешно Ñоздан." + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 +msgid "Task user assignment" +msgstr "Ðазначение Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ" + +#: aleksis/core/models.py:1332 +msgid "Task user assignments" +msgstr "ÐÐ°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ заданиÑ" + +#: aleksis/core/models.py:1348 +msgid "Additional attributes" +msgstr "Дополнительные атрибуты" + +#: aleksis/core/models.py:1386 +msgid "Allowed scopes that clients can request" +msgstr "Разрешённые пределы дейÑтвиÑ, которые могут запрашивать клиенты" + +#: aleksis/core/models.py:1396 +msgid "This image will be shown as icon in the authorization flow. It should be squared." +msgstr "Ðто изображение будет иÑпользоватьÑÑ Ð² качеÑтве значка во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Должно быть квадратным." + +#: aleksis/core/models.py:1441 +#, fuzzy +#| msgid "Can view avatar image" +msgid "Can view room timetable" +msgstr "Может видеть аватар" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + +#: aleksis/core/preferences.py:25 +msgid "General" +msgstr "Общее" + +#: aleksis/core/preferences.py:26 +msgid "School" +msgstr "Школа / уч.заведение" + +#: aleksis/core/preferences.py:27 +msgid "Theme" +msgstr "Тема" + +#: aleksis/core/preferences.py:28 +msgid "Mail" +msgstr "Почта" + +#: aleksis/core/preferences.py:30 +msgid "Footer" +msgstr "Ðижний колонтитул (подвал)" + +#: aleksis/core/preferences.py:31 +msgid "Accounts" +msgstr "Учётные запиÑи" + +#: aleksis/core/preferences.py:32 +msgid "Authentication" +msgstr "ÐвторизациÑ" + +#: aleksis/core/preferences.py:33 +msgid "Internationalisation" +msgstr "ИнтернационализациÑ" + +#: aleksis/core/preferences.py:43 +msgid "Site title" +msgstr "Ðазвание Ñайта" + +#: aleksis/core/preferences.py:55 +msgid "Site description" +msgstr "ОпиÑание Ñайта" + +#: aleksis/core/preferences.py:65 +msgid "Primary colour" +msgstr "ОÑновной цвет" + +#: aleksis/core/preferences.py:77 +msgid "Secondary colour" +msgstr "Дополнительный цвет" + +#: aleksis/core/preferences.py:89 +msgid "Logo" +msgstr "Логотип" + +#: aleksis/core/preferences.py:100 +msgid "Favicon" +msgstr "Favicon" + +#: aleksis/core/preferences.py:111 +msgid "PWA-Icon" +msgstr "Иконка PWA" + +#: aleksis/core/preferences.py:121 +msgid "PWA-Icon is maskable" +msgstr "Иконка PWA может быть Ñ Ð¼Ð°Ñкой" + +#: aleksis/core/preferences.py:133 +msgid "Mail out name" +msgstr "Ð˜Ð¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ" + +#: aleksis/core/preferences.py:144 +msgid "Mail out address" +msgstr "ÐÐ´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ" + +#: aleksis/core/preferences.py:157 +msgid "Link to privacy policy" +msgstr "СÑылка на политику приватноÑти" + +#: aleksis/core/preferences.py:169 +msgid "Link to imprint" +msgstr "СÑылка на отпечаток" + +#: aleksis/core/preferences.py:180 +msgid "Name format for addressing" +msgstr "Формат имени в перепиÑке" + +#: aleksis/core/preferences.py:197 +msgid "Channels to use for notifications" +msgstr "Каналы Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹" + +#: aleksis/core/preferences.py:208 +#, fuzzy +#| msgid "Selected persons" +msgid "Select Design" +msgstr "Выбранные физлица" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "РегулÑрное выражение Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка оÑновной группы, напр. '^Class .*'" + +#: aleksis/core/preferences.py:235 +msgid "Field on person to match primary group against" +msgstr "Поле Ð´Ð»Ñ ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ†Ð° Ñ Ð¾Ñновной группой" + +#: aleksis/core/preferences.py:247 +msgid "Automatically create new persons for new users" +msgstr "Ðовые физлица Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… пользователей Ñоздавать автоматичеÑки" + +#: aleksis/core/preferences.py:256 +msgid "Automatically link existing persons to new users by their e-mail address" +msgstr "СвÑзывать ÑущеÑтвующие физлица Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ пользователÑми автоматичеÑки по Ñл.адреÑам" + +#: aleksis/core/preferences.py:267 +msgid "Display name of the school" +msgstr "Ðазвание школы / уч.Ð·Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ" + +#: aleksis/core/preferences.py:278 +msgid "Official name of the school, e.g. as given by supervisory authority" +msgstr "Официальное название школы / уч.заведениÑ, напр., как в региÑтрационных документах" + +#: aleksis/core/preferences.py:286 +msgid "Allow users to change their passwords" +msgstr "Разрешить пользователÑм менÑть Ñвои пароли" + +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "Разрешить пользователÑм ÑбраÑывать Ñвои пароли" + +#: aleksis/core/preferences.py:302 +msgid "Enable signup" +msgstr "Включить региÑтрацию" + +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "РегулÑрное выражение Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÑ‘Ð½Ð½Ñ‹Ñ… логинов" + +#: aleksis/core/preferences.py:318 +msgid "Enable invitations" +msgstr "Включить приглашениÑ" + +#: aleksis/core/preferences.py:326 +msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" +msgstr "Длина приглаÑительного кода. (По-умолчанию 3: abcde-abcde-abcde)" + +#: aleksis/core/preferences.py:334 +msgid "Size of packets. (Default 5: abcde)" +msgstr "Размер пакетов. (По-умолчанию 5: abcde)" + +#: aleksis/core/preferences.py:345 +msgid "Allowed Grant Flows for OAuth applications" +msgstr "Разрешённые потоки грантов Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñ OAuth" + +#: aleksis/core/preferences.py:358 +msgid "Send emails if data checks detect problems" +msgstr "Ð’ Ñлучае Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹ при проверке данных отправить Ñл.пиÑьмо" + +#: aleksis/core/preferences.py:369 +msgid "Email recipients for data checks problem emails" +msgstr "Ðл.адреÑа получателей Ð´Ð»Ñ Ð¿Ð¸Ñем Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ при проверке данных" + +#: aleksis/core/preferences.py:380 +msgid "Email recipient groups for data checks problem emails" +msgstr "Ðл.адреÑа груп Ð´Ð»Ñ Ð¿Ð¸Ñем Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ при проверке данных" + +#: aleksis/core/preferences.py:389 +msgid "Show dashboard to users without login" +msgstr "Отображать информпанель анонимным пользователÑм" + +#: aleksis/core/preferences.py:398 +msgid "Allow users to edit their dashboard" +msgstr "Разрешить пользователÑм редактировать Ñвою информпанель" + +#: aleksis/core/preferences.py:409 +msgid "Fields on person model which are editable by themselves." +msgstr "ÐŸÐ¾Ð»Ñ Ñ Ð¾Ð¿Ð¸Ñанием физлица, которые можно редактировать ÑамоÑтоÑтельно." + +#: aleksis/core/preferences.py:424 +msgid "Editable fields on person model which should trigger a notification on change" +msgstr "ИзменÑемые Ð¿Ð¾Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñ„Ð¸Ð·Ð»Ð¸Ñ†Ð°, при изменении которых должен Ñрабатывать триггер Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ" + +#: aleksis/core/preferences.py:438 +msgid "Contact for notification if a person changes their data" +msgstr "Контакт Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹ при изменении кем-то Ñвоих данных" + +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "Отдавать предпочтение личным фото вмеÑто аватаров" + +#: aleksis/core/preferences.py:459 +msgid "PDF file expiration duration" +msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° PDF" + +#: aleksis/core/preferences.py:460 +msgid "in minutes" +msgstr "в минутах" + +#: aleksis/core/preferences.py:470 +msgid "Automatically update the dashboard and its widgets" +msgstr "ÐвтоматичеÑки обновлÑть информпанель и её виджеты" + +#: aleksis/core/preferences.py:480 +msgid "Automatically update the dashboard and its widgets sitewide" +msgstr "ÐвтоматичеÑки обновлÑть информпанель и её виджеты (Ð´Ð»Ñ Ð²Ñего Ñайта)" + +#: aleksis/core/preferences.py:490 +msgid "Country for phone number parsing" +msgstr "Страна Ð´Ð»Ñ Ð¿Ð°Ñ€Ñинга номера телефона" + +#: aleksis/core/settings.py:539 +msgid "English" +msgstr "ÐнглийÑкий" + +#: aleksis/core/settings.py:540 +msgid "German" +msgstr "Ðемецкий" + +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "УкраинÑкий" + +#: aleksis/core/tables.py:25 +#: aleksis/core/templates/core/announcement/list.html:36 +#: aleksis/core/templates/core/group/full.html:26 +#: aleksis/core/templates/oauth2_provider/application/detail.html:17 +msgid "Edit" +msgstr "Редактировать" + +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 +#: aleksis/core/templates/core/announcement/list.html:22 +msgid "Actions" +msgstr "ДейÑтвиÑ" + +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 +#: aleksis/core/templates/core/announcement/list.html:42 +#: aleksis/core/templates/core/group/full.html:33 +#: aleksis/core/templates/core/pages/delete.html:22 +#: aleksis/core/templates/oauth2_provider/application/detail.html:21 +msgid "Delete" +msgstr "Удалить" + +#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 +#: aleksis/core/templates/oauth2_provider/authorize.html:54 +msgid "Error" +msgstr "Ошибка" + +#: aleksis/core/templates/403.html:14 +msgid "" +"You are not allowed to access the requested page or\n" +" object." +msgstr "" +"У Ð’Ð°Ñ Ð½ÐµÑ‚ доÑтупа к запрашиваемой Ñтранице или\n" +" к объекту." + +#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16 +msgid "" +"\n" +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " +msgstr "" +"\n" +" ЕÑли Ð’Ñ‹ думаете, что Ñто ошибка AlekSIS, обратитеÑÑŒ, пожалуйÑта,\n" +" к админиÑтраторам Ñайта:\n" +" " + +#: aleksis/core/templates/404.html:12 +msgid "" +"\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" +" " +msgstr "" +"\n" +" ЕÑли Ð’Ñ‹ были перенаправлены по ÑÑылке Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñтраницы,\n" +" вероÑтно, Ñта ÑÑылка уÑтарела.\n" +" " + +#: aleksis/core/templates/500.html:10 +msgid "" +"An unexpected error has\n" +" occurred." +msgstr "" +"Возникла Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ \n" +" ошибка." + +#: aleksis/core/templates/500.html:13 +msgid "" +"\n" +" Your site administrators will automatically be notified about this\n" +" error. You can also contact them directly:\n" +" " +msgstr "" +"\n" +" ÐдминиÑтраторы Ñайта будут уведомлены об Ñтой ошибке автоматичеÑки.\n" +" Ð’Ñ‹ также можете обратитьÑÑ Ðº ним непоÑредÑтвенно:\n" +" " + +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "ПопытатьÑÑ ÐµÑ‰Ñ‘" + +#: aleksis/core/templates/503.html:10 +msgid "" +"The maintenance mode is currently enabled. Please try again\n" +" later." +msgstr "" +"Сайт находитÑÑ Ð½Ð° обÑлуживании. Попробуйте зайти\n" +" позже." + +#: aleksis/core/templates/503.html:13 +msgid "" +"\n" +" This page is currently unavailable. If this error persists, contact your site administrators:\n" +" " +msgstr "" +"\n" +" Ðта Ñтраница ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна. ЕÑли ошибка проÑвитÑÑ ÐµÑ‰Ñ‘ раз, обратитеÑÑŒ к админиÑтраторам Ñайта:\n" +" " + +#: aleksis/core/templates/account/account_inactive.html:5 +#: aleksis/core/templates/account/account_inactive.html:6 +msgid "Account inactive" +msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ неактивна" + +#: aleksis/core/templates/account/account_inactive.html:14 +msgid "Account inactive." +msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ неактивна." + +#: aleksis/core/templates/account/account_inactive.html:17 +msgid "" +"\n" +" This account is currently inactive. If you think this is an\n" +" error, please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" Ðта ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð°. ЕÑли Ð’Ñ‹ думаете,\n" +" что Ñто ошибка, обратитеÑÑŒ к админиÑтраторам Ñайта.\n" +" " + +#: aleksis/core/templates/account/email/base_message.txt:5 +msgid "Hello!" +msgstr "Привет!" + +#: aleksis/core/templates/account/email/base_message.txt:9 +msgid "Your AlekSIS team" +msgstr "Команда AlekSIS" + +#: aleksis/core/templates/account/email_confirm.html:5 +#: aleksis/core/templates/account/email_confirm.html:6 +#: aleksis/core/templates/account/email_confirm.html:17 +#: aleksis/core/templates/socialaccount/login.html:17 +msgid "Confirm" +msgstr "Подтвердить" + +#: aleksis/core/templates/account/email_confirm.html:12 +#, python-format +msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s." +msgstr "Подтвердите, пожалуйÑта, что <a href=\"mailto:%(email)s\">%(email)s</a> — Ñл.Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(user_display)s." + +#: aleksis/core/templates/account/email_confirm.html:25 +#, python-format +msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." +msgstr "Ðта ÑÑылка Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñл.почты проÑрочена или недейÑтвительна. Сделайте, пожалуйÑта, <a href=\"%(email_url)s\">новый запроÑ</a>." + +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "Сменить пароль" + +#: aleksis/core/templates/account/password_change.html:12 +msgid "Forgot your current password? Click here to reset it:" +msgstr "Забыли Ñвой пароль? Ðажмите тут Ð´Ð»Ñ ÑброÑа:" + +#: aleksis/core/templates/account/password_change.html:12 +msgid "Forgot Password?" +msgstr "Забыли пароль?" + +#: aleksis/core/templates/account/password_change_disabled.html:5 +#: aleksis/core/templates/account/password_change_disabled.html:6 +msgid "Changing of password disabled" +msgstr "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾" + +#: aleksis/core/templates/account/password_change_disabled.html:13 +msgid "Changing of password disabled." +msgstr "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾." + +#: aleksis/core/templates/account/password_change_disabled.html:15 +msgid "" +"\n" +" Users are not allowed to edit their own passwords. If you think\n" +" this is an error please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" ПользователÑм не разрешаетÑÑ Ð¼ÐµÐ½Ñть Ñвои пароли.\n" +" ЕÑли Ñчитаете Ñто ошибкой, обратитеÑÑŒ к админиÑтраторам Ñайта.\n" +" " + +#: aleksis/core/templates/account/password_reset.html:5 +#: aleksis/core/templates/account/password_reset.html:15 +#: aleksis/core/templates/account/password_reset.html:23 +#: aleksis/core/templates/account/password_reset_done.html:5 +#: aleksis/core/templates/account/verification_email_required.html:5 +#: aleksis/core/templates/account/verification_email_required.html:6 +#: aleksis/core/templates/two_factor/core/login.html:100 +msgid "Reset password" +msgstr "СброÑить пароль" + +#: aleksis/core/templates/account/password_reset.html:17 +msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." +msgstr "Забыли пароль? Укажите ниже Ñвою Ñл.почту и мы отправим Вам пиÑьмо Ð´Ð»Ñ ÑброÑа паролÑ." + +#: aleksis/core/templates/account/password_reset.html:30 +msgid "" +"Please contact one of your site administrators, if you\n" +" have any trouble resetting your password:" +msgstr "" +"ЕÑли у Ð’Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð° проблема Ñо ÑброÑом паролÑ,\n" +" обратитеÑÑŒ, пожалуйÑта, к админиÑтраторам Ñайта:" + +#: aleksis/core/templates/account/password_reset_done.html:15 +msgid "Password reset mail sent" +msgstr "ПиÑьмо Ð´Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¾" + +#: aleksis/core/templates/account/password_reset_done.html:18 +#: aleksis/core/templates/account/verification_email_required.html:16 +msgid "" +"\n" +" We have sent you an e-mail. Please contact one of your site\n" +" administrators if you do not receive it within a few minutes.\n" +" " +msgstr "" +"\n" +" Мы отправили Вам Ñл.пиÑьмо. ЕÑли Ð’Ñ‹ не получите его на протÑжении\n" +" неÑкольких минут, обратитеÑÑŒ, пожалуйÑта, к админиÑтраторам Ñайта.\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:15 +msgid "Bad token" +msgstr "Ðеправильный токен" + +#: aleksis/core/templates/account/password_reset_from_key.html:19 +#, python-format +msgid "" +"\n" +" The password reset link was invalid, possibly because it has already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" +" class=\"blue-text text-lighten-2\">new password reset</a>.\n" +" " +msgstr "" +"\n" +" СÑылка на ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвительна или, возможно, уже иÑпользована. Сделайте, пожалуйÑта, <a href=\"%(passwd_reset_url)s\"\n" +" class=\"blue-text text-lighten-2\">новый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ</a>.\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:25 +msgid "" +"\n" +" If this issue persists, please contact one of your site\n" +" administrators\n" +" " +msgstr "" +"\n" +" ЕÑли проблема вÑÑ‘ ещё приÑутÑтвует, обратитеÑÑŒ, пожалуйÑта, к\n" +" админиÑтраторам Ñайта\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:56 +#: aleksis/core/templates/account/password_reset_from_key_done.html:15 +msgid "" +"\n" +" Your password is now changed!\n" +" " +msgstr "" +"\n" +" Ваш пароль изменён!\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:61 +msgid "Back to login" +msgstr "Ðазад ко входу" + +#: aleksis/core/templates/account/password_reset_from_key_done.html:13 +msgid "Password changed!" +msgstr "Пароль изменён!" + +#: aleksis/core/templates/account/password_set.html:5 +#: aleksis/core/templates/account/password_set.html:6 +#: aleksis/core/templates/account/password_set.html:12 +msgid "Set password" +msgstr "УÑтановите пароль" + +#: aleksis/core/templates/account/signup.html:5 +#: aleksis/core/templates/account/signup.html:6 +#: aleksis/core/templates/socialaccount/signup.html:5 +#: aleksis/core/templates/socialaccount/signup.html:6 +msgid "Signup" +msgstr "РегиÑтрациÑ" + +#: aleksis/core/templates/account/signup.html:12 +#, python-format +msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." +msgstr "У Ð’Ð°Ñ ÑƒÐ¶Ðµ еÑть ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ? Ð’ таком Ñлучае можете <a href=\"%(login_url)s\">войти</a>." + +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "ЗарегиÑтрироватьÑÑ" + +#: aleksis/core/templates/account/signup_closed.html:5 +#: aleksis/core/templates/account/signup_closed.html:6 +msgid "Signup closed" +msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°" + +#: aleksis/core/templates/account/signup_closed.html:14 +msgid "Signup closed." +msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°." + +#: aleksis/core/templates/account/signup_closed.html:17 +msgid "" +"\n" +" This sign up is currently closed. If you think this is an\n" +" error, please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°. ЕÑли Ñчитаете, что Ñто ошибка,\n" +" можете обратитьÑÑ Ðº админиÑтраторам Ñайта.\n" +" " + +#: aleksis/core/templates/account/verification_email_required.html:14 +msgid "Password reset mail sent!" +msgstr "ПиÑьмо Ð´Ð»Ñ ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¾!" + +#: aleksis/core/templates/account/verification_sent.html:5 +#: aleksis/core/templates/account/verification_sent.html:6 +msgid "Verify your email address" +msgstr "Подтвердите Ñвой Ð°Ð´Ñ€ÐµÑ Ñл.почты" + +#: aleksis/core/templates/account/verification_sent.html:14 +msgid "Verify your email!" +msgstr "Подтвердите Ñвой Ð°Ð´Ñ€ÐµÑ Ñл.почты!" + +#: aleksis/core/templates/account/verification_sent.html:16 +msgid "" +"\n" +" This part of the site requires us to verify that you are who you claim to be.\n" +" For this purpose, we require that you verify ownership of your e-mail address.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñтой чаÑти Ñайта необходимо пройти проверку, что Ð’Ñ‹ - именно Ð’Ñ‹.\n" +" Ð”Ð»Ñ Ñтого нам нужно проверить как минимум, что Ð°Ð´Ñ€ÐµÑ Ñл.почты принадлежит именно Вам\n" +" " + +#: aleksis/core/templates/account/verification_sent.html:22 +msgid "" +"\n" +" We have sent an e-mail to you for verification.\n" +" Please click on the link inside this e-mail. Please\n" +" contact us if you do not receive it within a few minutes.\n" +" " +msgstr "" +"\n" +" Мы отправили Вам Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñл.пиÑьмо.\n" +" ПожалуйÑта, перейдите по указанной ÑÑылке. ЕÑли Ð’Ñ‹ не получите\n" +" пиÑьмо в ближайшие неÑколько минут, обратитеÑÑŒ, пожалуйÑта, к нам.\n" +" " + +#: aleksis/core/templates/core/additional_field/edit.html:6 +#: aleksis/core/templates/core/additional_field/edit.html:7 +msgid "Edit additional field" +msgstr "Редактирование дополнительного полÑ" + +#: aleksis/core/templates/core/additional_field/list.html:14 +msgid "Create additional field" +msgstr "Создать дополнительное поле" + +#: aleksis/core/templates/core/announcement/form.html:14 +#: aleksis/core/templates/core/announcement/form.html:21 +msgid "Edit announcement" +msgstr "Редактирование объÑвлениÑ" + +#: aleksis/core/templates/core/announcement/form.html:16 +msgid "Publish announcement" +msgstr "Размещение объÑвлениÑ" + +#: aleksis/core/templates/core/announcement/form.html:23 +#: aleksis/core/templates/core/announcement/list.html:13 +msgid "Publish new announcement" +msgstr "РазмеÑтить новое объÑвление" + +#: aleksis/core/templates/core/announcement/form.html:34 +msgid "Save and publish announcement" +msgstr "Сохранить и опубликовать объÑвление" + +#: aleksis/core/templates/core/announcement/list.html:19 +msgid "Valid from" +msgstr "ДейÑтвительно Ñ" + +#: aleksis/core/templates/core/announcement/list.html:20 +msgid "Valid until" +msgstr "ДейÑтвительно по" + +#: aleksis/core/templates/core/announcement/list.html:21 +msgid "Recipients" +msgstr "Получатели" + +#: aleksis/core/templates/core/announcement/list.html:50 +msgid "There are no announcements." +msgstr "ОбъÑвлений нет." + +#: aleksis/core/templates/core/base_print.html:74 +msgid "Powered by AlekSIS®" +msgstr "Под управлением AlekSIS®" + +#: aleksis/core/templates/core/dashboard_widget/create.html:8 +#: aleksis/core/templates/core/dashboard_widget/create.html:12 +#, python-format +msgid "Create %(widget)s" +msgstr "Создать %(widget)s" + +#: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:10 +msgid "This widget is currently not available." +msgstr "Ðтот виджет ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупен." + +#: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:14 +#, python-format +msgid "" +"\n" +" There is a problem getting the widget \"%(title)s\".\n" +" There is no need for you to take any action.\n" +" " +msgstr "" +"\n" +" Во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¶ÐµÑ‚Ð° \"%(title)s\" возникла проблема.\n" +" Вам ничего делать не нужно.\n" +" " + +#: aleksis/core/templates/core/dashboard_widget/edit.html:8 +#: aleksis/core/templates/core/dashboard_widget/edit.html:12 +#, python-format +msgid "Edit %(widget)s" +msgstr "Редактировать %(widget)s" + +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "Виджеты информпанели" + +#: aleksis/core/templates/core/dashboard_widget/list.html:15 +msgid "Create dashboard widget" +msgstr "Создать виджет Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ð¸" + +#: aleksis/core/templates/core/dashboard_widget/list.html:22 +#, python-format +msgid "Create %(name)s" +msgstr "Создать %(name)s" + +#: aleksis/core/templates/core/dashboard_widget/list.html:32 +#: aleksis/core/templates/core/edit_dashboard.html:8 +#: aleksis/core/templates/core/edit_dashboard.html:15 +msgid "Edit default dashboard" +msgstr "Редактировать Ñтандартную информпанель" + +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "Проверки данных" + +#: aleksis/core/templates/core/data_check/list.html:15 +msgid "Check data again" +msgstr "Проверить данные ещё раз" + +#: aleksis/core/templates/core/data_check/list.html:22 +msgid "The system detected some problems with your data." +msgstr "СиÑтема обнаружила некоторые проблемы Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными." + +#: aleksis/core/templates/core/data_check/list.html:23 +msgid "" +"Please go through all data and check whether some extra action is\n" +" needed." +msgstr "" +"ПожалуйÑта, переÑмотрите внимательно вÑе данные и проверьте не нужно ли\n" +" что-то Ñделать." + +#: aleksis/core/templates/core/data_check/list.html:31 +msgid "Everything is fine." +msgstr "Ð’ÑÑ‘ прекраÑно." + +#: aleksis/core/templates/core/data_check/list.html:32 +msgid "The system hasn't detected any problems with your data." +msgstr "СиÑтема не обнаружила никаких проблем Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными." + +#: aleksis/core/templates/core/data_check/list.html:40 +msgid "Detected problems" +msgstr "Обнаруженные проблемы" + +#: aleksis/core/templates/core/data_check/list.html:45 +msgid "Affected object" +msgstr "ЗавиÑимые объекты" + +#: aleksis/core/templates/core/data_check/list.html:46 +msgid "Detected problem" +msgstr "Обнаружена проблема" + +#: aleksis/core/templates/core/data_check/list.html:47 +msgid "Show details" +msgstr "Подробнее" + +#: aleksis/core/templates/core/data_check/list.html:48 +msgid "Options to solve the problem" +msgstr "Варианты Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹" + +#: aleksis/core/templates/core/data_check/list.html:63 +msgid "Show object" +msgstr "ПоÑмотреть объект" + +#: aleksis/core/templates/core/data_check/list.html:86 +msgid "Registered checks" +msgstr "ЗарегиÑтрированные проверки" + +#: aleksis/core/templates/core/data_check/list.html:90 +msgid "" +"\n" +" The system will check for the following problems:\n" +" " +msgstr "" +"\n" +" СиÑтема проверит наличие таких проблем:\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:6 +#: aleksis/core/templates/core/edit_dashboard.html:13 +#: aleksis/core/templates/core/index.html:17 +msgid "Edit dashboard" +msgstr "Редактировать информпанель" + +#: aleksis/core/templates/core/edit_dashboard.html:24 +msgid "" +"\n" +" On this page you can arrange your personal dashboard. You can drag any items from \"Available widgets\" to \"Your\n" +" Dashboard\" or change the order by moving the widgets. After you have finished, please don't forget to click on\n" +" \"Save\".\n" +" " +msgstr "" +"\n" +" Ðа Ñтой Ñтранице Ð’Ñ‹ можете упорÑдочить Ñвою информпанель. ПеретаÑкивайте любые Ñлементы из \"ДоÑтупных виджетов\"\n" +" в \"Свою информпанель\" или менÑйте порÑдок, перетÑÐ³Ð¸Ð²Ð°Ñ Ð²Ð¸Ð´Ð¶ÐµÑ‚Ñ‹. ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ забудьте нажать\n" +" \"Сохранить\".\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:30 +msgid "" +"\n" +" On this page you can arrange the default dashboard which is shown when a user doesn't arrange his own\n" +" dashboard. You can drag any items from \"Available widgets\" to \"Default Dashboard\" or change the order\n" +" by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n" +" " +msgstr "" +"\n" +" Ðа Ñтой Ñтранице Ð’Ñ‹ можете упорÑдочить типовую/Ñтандартную информпанель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ, еÑли пользователь\n" +" не наÑтроил Ñвою. ПеретÑгивайте любые Ñлементы из \"ДоÑтупных виджетов\" в \"Типовую информпанель\" или менÑйте \n" +" порÑдок, перетÑÐ³Ð¸Ð²Ð°Ñ Ð²Ð¸Ð´Ð¶ÐµÑ‚Ñ‹. ПоÑле Ð·Ð°Ð²Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ðµ забудьте нажать \"Сохранить\".\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:48 +msgid "Available widgets" +msgstr "ДоÑтупные виджеты" + +#: aleksis/core/templates/core/edit_dashboard.html:57 +msgid "Your dashboard" +msgstr "Ваша информпанель" + +#: aleksis/core/templates/core/edit_dashboard.html:59 +msgid "Default dashboard" +msgstr "Ð¢Ð¸Ð¿Ð¾Ð²Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»ÑŒ" + +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "Определить дочерние группы к группе" + +#: aleksis/core/templates/core/group/child_groups.html:18 +msgid "" +"\n" +" You can use this to assign child groups to groups. Please use the filters below to select groups you want to\n" +" change and click \"Next\".\n" +" " +msgstr "" +"\n" +" Ð’Ñ‹ можете воÑпользоватьÑÑ Ñтим Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ñзки дочерних групп к оÑновным. Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° групп,\n" +" которые хотите изменить, иÑпользуйте фильтры, раÑположенные ниже и нажмите \"Далее\".\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:31 +msgid "Update selection" +msgstr "Обновить выбор" + +#: aleksis/core/templates/core/group/child_groups.html:35 +msgid "Clear all filters" +msgstr "ОчиÑтить фильтры" + +#: aleksis/core/templates/core/group/child_groups.html:39 +msgid "Currently selected groups" +msgstr "Выбранные ÑÐµÐ¹Ñ‡Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" + +#: aleksis/core/templates/core/group/child_groups.html:52 +msgid "Start assigning child groups for this groups" +msgstr "Ðачать привÑзку дочерних групп к Ñтим группам" + +#: aleksis/core/templates/core/group/child_groups.html:61 +msgid "" +"\n" +" Please select some groups in order to go on with assigning.\n" +" " +msgstr "" +"\n" +" Выберите, пожалуйÑта, неÑколько групп в порÑдке, по какому привÑзывать.\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:72 +msgid "Current group:" +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°:" + +#: aleksis/core/templates/core/group/child_groups.html:78 +msgid "Please be careful!" +msgstr "ПожалуйÑта, будьте аккуратны!" + +#: aleksis/core/templates/core/group/child_groups.html:79 +msgid "" +"\n" +" If you click \"Back\" or \"Next\" the current group assignments are not saved.\n" +" If you click \"Save\", you will overwrite all existing child group relations for this group with what you\n" +" selected on this page.\n" +" " +msgstr "" +"\n" +" ЕÑли нажмёте \"Ðазад\" или \"Далее\" привÑзки Ñтой группы не ÑохранÑÑ‚ÑÑ.\n" +" ЕÑли нажмёте \"Сохранить\", вÑе ÑущеÑтвующие ÑвÑзи дочерней группы Ñ Ñтой группой будут заменены на\n" +" выбранные на Ñтой Ñтранице.\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:93 +#: aleksis/core/templates/core/group/child_groups.html:128 +#: aleksis/core/templates/oauth2_provider/application/detail.html:9 +#: aleksis/core/templates/two_factor/_wizard_actions.html:15 +#: aleksis/core/templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "Ðазад" + +#: aleksis/core/templates/core/group/child_groups.html:99 +#: aleksis/core/templates/core/group/child_groups.html:134 +#: aleksis/core/templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "Следующий" + +#: aleksis/core/templates/core/group/child_groups.html:106 +#: aleksis/core/templates/core/group/child_groups.html:141 +#: aleksis/core/templates/core/partials/save_button.html:3 +msgid "Save" +msgstr "Сохранить" + +#: aleksis/core/templates/core/group/child_groups.html:112 +#: aleksis/core/templates/core/group/child_groups.html:147 +msgid "Save and next" +msgstr "Сохранить и продолжить" + +#: aleksis/core/templates/core/group/edit.html:11 +#: aleksis/core/templates/core/group/edit.html:12 +msgid "Edit group" +msgstr "Редактировать группу" + +#: aleksis/core/templates/core/group/full.html:40 +msgid "Change preferences" +msgstr "Изменить ÑвойÑтва" + +#: aleksis/core/templates/core/group/full.html:68 +msgid "Statistics" +msgstr "СтатиÑтика" + +#: aleksis/core/templates/core/group/full.html:73 +msgid "Count of members" +msgstr "КоличеÑтво учаÑтников" + +#: aleksis/core/templates/core/group/full.html:81 +msgid "Average age" +msgstr "Средний возраÑÑ‚" + +#: aleksis/core/templates/core/group/full.html:90 +msgid "Age range" +msgstr "ВозраÑтной диапазон" + +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " +msgstr "" +"\n" +" %(min)s лет до %(max)s лет\n" +" " + +#: aleksis/core/templates/core/group/list.html:14 +msgid "Create group" +msgstr "Создать группу" + +#: aleksis/core/templates/core/group/list.html:17 +msgid "Filter groups" +msgstr "Фильтровать группы" + +#: aleksis/core/templates/core/group/list.html:24 +#: aleksis/core/templates/core/person/list.html:28 +msgid "Clear" +msgstr "ОчиÑтить" + +#: aleksis/core/templates/core/group/list.html:28 +msgid "Selected groups" +msgstr "Выбранные группы" + +#: aleksis/core/templates/core/group_type/edit.html:6 +#: aleksis/core/templates/core/group_type/edit.html:7 +msgid "Edit group type" +msgstr "Редактировать тип группы" + +#: aleksis/core/templates/core/group_type/list.html:14 +msgid "Create group type" +msgstr "Создать тип группы" + +#: aleksis/core/templates/core/index.html:4 +msgid "Home" +msgstr "Домой" + +#: aleksis/core/templates/core/index.html:34 +msgid "" +"\n" +" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" +" customise your personal dashboard.\n" +" " +msgstr "" +"\n" +" Ð’Ñ‹ ещё не наÑтроили Ñвою информпанель, так что пока наблюдаете типовую по-умолчанию. Ð”Ð»Ñ Ð½Ð°Ñтройки \n" +" Ñвоей информпанели клацните \"Редактировать информпанель\".\n" +" " + +#: aleksis/core/templates/core/index.html:44 +msgid "Last activities" +msgstr "ПоÑледние дейÑтвиÑ" + +#: aleksis/core/templates/core/index.html:62 +msgid "No activities available yet." +msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾ÐºÐ° недоÑтупны." + +#: aleksis/core/templates/core/pages/delete.html:6 +#, python-format +msgid "Delete %(object_name)s" +msgstr "Удалить %(object_name)s" + +#: aleksis/core/templates/core/pages/delete.html:13 +#, python-format +msgid "" +"\n" +" Do you really want to delete the %(object_name)s \"%(object)s\"?\n" +" " +msgstr "" +"\n" +" Ð’Ñ‹ дейÑтвительно хотите удалить %(object_name)s \"%(object)s\"?\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" +msgstr "СоÑтоÑние ÑиÑтемы" + +#: aleksis/core/templates/core/pages/system_status.html:12 +msgid "System checks" +msgstr "СиÑтемные проверки" + +#: aleksis/core/templates/core/pages/system_status.html:22 +msgid "Maintenance mode enabled" +msgstr "Включен режим обÑлуживаниÑ" + +#: aleksis/core/templates/core/pages/system_status.html:24 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access the site.\n" +" " +msgstr "" +"\n" +" ДоÑтуп к Ñайту имеют только админиÑтратор и пользователи Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ð¼Ð¸ IP-адреÑами.\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:36 +msgid "Maintenance mode disabled" +msgstr "Режим обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½" + +#: aleksis/core/templates/core/pages/system_status.html:37 +msgid "Everyone can access the site." +msgstr "ДоÑтуп к Ñайту еÑть у вÑех." + +#: aleksis/core/templates/core/pages/system_status.html:47 +msgid "Debug mode enabled" +msgstr "Режим отладки включен" + +#: aleksis/core/templates/core/pages/system_status.html:49 +msgid "" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " +msgstr "" +"\n" +" Веб-Ñервер во Ð²Ñ€ÐµÐ¼Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº пишет отладочную информацию. Ðе иÑпользуйте в продакшене!\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:56 +msgid "Debug mode disabled" +msgstr "Режим отладки отключен" + +#: aleksis/core/templates/core/pages/system_status.html:58 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " +msgstr "" +"\n" +" Режим отладки отключен. Ð’ Ñлучае ошибок будут отображатьÑÑ Ñтандартные Ñтраницы об ошибках.\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:71 +msgid "System health checks" +msgstr "Проверки работы ÑиÑтемы" + +#: aleksis/core/templates/core/pages/system_status.html:77 +msgid "Service" +msgstr "Служба" + +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 +msgid "Status" +msgstr "СоÑтоÑние" + +#: aleksis/core/templates/core/pages/system_status.html:79 +msgid "Time taken" +msgstr "ПродолжительноÑть" + +#: aleksis/core/templates/core/pages/system_status.html:100 +msgid "seconds" +msgstr "Ñек" + +#: aleksis/core/templates/core/pages/system_status.html:111 +msgid "Celery task results" +msgstr "Результаты Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Celery" + +#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/templated_email/celery_failure.email:9 +#: aleksis/core/templates/templated_email/celery_failure.email:28 +msgid "Task" +msgstr "ЗаданиÑ" + +#: aleksis/core/templates/core/pages/system_status.html:117 +msgid "ID" +msgstr "ID" + +#: aleksis/core/templates/core/pages/system_status.html:118 +msgid "Date done" +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ" + +#: aleksis/core/templates/core/pages/test_pdf.html:7 +#: aleksis/core/templates/core/pages/test_pdf.html:8 +msgid "Test PDF generation" +msgstr "Пробное генерирование PDF" + +#: aleksis/core/templates/core/pages/test_pdf.html:14 +msgid "" +"\n" +" This simple view can be used to ensure the correct function of the built-in PDF generation system.\n" +" " +msgstr "" +"\n" +" Ðта проÑÑ‚Ð°Ñ Ñтраница может помочь проверить корректноÑть наÑтроек вÑтроенной ÑиÑтемы Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ PDF.\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:8 +#: aleksis/core/templates/core/partials/announcements.html:35 +#, python-format +msgid "" +"\n" +" Valid for %(from)s\n" +" " +msgstr "" +"\n" +" ДейÑтвительно до %(from)s\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:12 +#, python-format +msgid "" +"\n" +" Valid from %(from)s until %(until)s\n" +" " +msgstr "" +"\n" +" ДейÑтвительно Ñ %(from)s по %(until)s\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:39 +#, python-format +msgid "" +"\n" +" Valid for %(from)s – %(until)s\n" +" " +msgstr "" +"\n" +" ДейÑтвительно в период %(from)s – %(until)s\n" +" " + +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" +msgstr "Ðватар" + +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" +msgstr "Идентификатор (иконка)" + +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" +msgstr "Изменено" + +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" +msgstr "ÐеизвеÑтно" + +#: aleksis/core/templates/core/partials/splash_screen.html:11 +msgid "" +"\n" +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " +msgstr "" + +#: aleksis/core/templates/core/perms/assign.html:12 +#: aleksis/core/templates/core/perms/assign.html:13 +msgid "Assign permission" +msgstr "Ðазначить доÑтуп" + +#: aleksis/core/templates/core/perms/assign.html:17 +msgid "Selected permission" +msgstr "Выбранный доÑтуп" + +#: aleksis/core/templates/core/perms/assign.html:26 +msgid "Assign" +msgstr "Ðазначить" + +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "Управление разрешениÑми" + +#: aleksis/core/templates/core/perms/list.html:21 +msgid "Assign a new permission" +msgstr "Ðазначить новый доÑтуп" + +#: aleksis/core/templates/core/perms/list.html:25 +msgid "Select" +msgstr "Отметить" + +#: aleksis/core/templates/core/perms/list.html:34 +msgid "Global (user)" +msgstr "Глобально (пользователь)" + +#: aleksis/core/templates/core/perms/list.html:38 +msgid "Global (group)" +msgstr "Глобально (группа)" + +#: aleksis/core/templates/core/perms/list.html:42 +msgid "Object (user)" +msgstr "Объект (пользователь)" + +#: aleksis/core/templates/core/perms/list.html:46 +msgid "Object (group)" +msgstr "Объект (группа)" + +#: aleksis/core/templates/core/perms/list.html:52 +msgid "Filter permissions" +msgstr "Фильтр доÑтупов" + +#: aleksis/core/templates/core/perms/list.html:58 +msgid "Update" +msgstr "Обновить" + +#: aleksis/core/templates/core/person/create.html:12 +#: aleksis/core/templates/core/person/create.html:13 +#: aleksis/core/templates/core/person/list.html:17 +msgid "Create person" +msgstr "Создать физлицо" + +#: aleksis/core/templates/core/person/edit.html:12 +#: aleksis/core/templates/core/person/edit.html:13 +msgid "Edit person" +msgstr "Редактировать физлицо" + +#: aleksis/core/templates/core/person/list.html:21 +msgid "Filter persons" +msgstr "Фильтр физлиц" + +#: aleksis/core/templates/core/person/list.html:32 +msgid "Selected persons" +msgstr "Выбранные физлица" + +#: aleksis/core/templates/core/school_term/create.html:6 +#: aleksis/core/templates/core/school_term/create.html:7 +#: aleksis/core/templates/core/school_term/list.html:14 +msgid "Create school term" +msgstr "Создать Учебный год" + +#: aleksis/core/templates/core/school_term/edit.html:6 +#: aleksis/core/templates/core/school_term/edit.html:7 +msgid "Edit school term" +msgstr "Редактировать Учебный год" + +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "СвойÑтва" + +#: aleksis/core/templates/dynamic_preferences/form.html:9 +msgid "Site preferences" +msgstr "СвойÑтва Ñайта" + +#: aleksis/core/templates/dynamic_preferences/form.html:11 +msgid "My preferences" +msgstr "Мои предпочтениÑ" + +#: aleksis/core/templates/dynamic_preferences/form.html:13 +#, python-format +msgid "Preferences for %(instance)s" +msgstr "СвойÑтва %(instance)s" + +#: aleksis/core/templates/dynamic_preferences/form.html:25 +msgid "Save preferences" +msgstr "Сохранить ÑвойÑтва" + +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "Ð¤ÑƒÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°." + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ включите ÑоответÑтвующий Ñ‡ÐµÐºÐ±Ð¾ÐºÑ Ð² разделе авторизации на " + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "Ñтранице наÑтроек Ñайта" + +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "ПринÑть приглашение" + +#: aleksis/core/templates/invitations/enter.html:21 +msgid "Accept your invitation" +msgstr "ПринÑтие Вашего приглашениÑ" + +#: aleksis/core/templates/invitations/enter.html:25 +msgid "" +"\n" +" Please enter your invitation code to register\n" +" your new user account:\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Вашей новой учётной запиÑи\n" +" укажите Ñвой код приглашениÑ:\n" +" " + +#: aleksis/core/templates/invitations/enter.html:37 +msgid "Accept invite" +msgstr "ПринÑть приглашение" + +#: aleksis/core/templates/invitations/forms/_invite.html:9 +#: aleksis/core/templates/invitations/forms/_invite.html:10 +#: aleksis/core/templates/invitations/forms/_invite.html:21 +msgid "Invite" +msgstr "Приглашение" + +#: aleksis/core/templates/invitations/forms/_invite.html:17 +msgid "Invite by email address" +msgstr "Приглашение по Ñл.почте" + +#: aleksis/core/templates/invitations/forms/_invite.html:26 +msgid "Generate invitation code" +msgstr "Создать код приглашениÑ" + +#: aleksis/core/templates/invitations/forms/_invite.html:29 +msgid "Generate code" +msgstr "Генерирование кода" + +#: aleksis/core/templates/invitations/forms/_invite.html:33 +msgid "Invitations" +msgstr "ПриглашениÑ" + +#: aleksis/core/templates/invitations/messages/invite_accepted.txt:3 +#, python-format +msgid "The invitation for %(email)s has been accepted." +msgstr "Приглашение Ð´Ð»Ñ %(email)s было принÑто." + +#: aleksis/core/templates/oauth2_provider/application/create.html:5 +#: aleksis/core/templates/oauth2_provider/application/create.html:6 +msgid "Register OAuth2 Application" +msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/create.html:14 +#: aleksis/core/templates/oauth2_provider/application/edit.html:14 +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 +#: aleksis/core/templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "Отменить" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:5 +msgid "OAuth2 Application" +msgstr "Приложение OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:39 +msgid "Client id" +msgstr "КлиентÑкий ID" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:47 +msgid "Client secret" +msgstr "КлиентÑкий Ñекрет" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:55 +msgid "Client type" +msgstr "КлиентÑкий тип" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:63 +msgid "Allowed scopes" +msgstr "Разрешённые границы дейÑтвиÑ" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:71 +msgid "Redirect URIs" +msgstr "Перенаправление URI-адреÑов" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:79 +msgid "Skip Authorisation" +msgstr "ПропуÑтить авторизацию" + +#: aleksis/core/templates/oauth2_provider/application/edit.html:5 +#: aleksis/core/templates/oauth2_provider/application/edit.html:6 +msgid "Edit OAuth2 Application" +msgstr "Редактировать приложение OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/list.html:11 +msgid "Register new application" +msgstr "ЗарегиÑтрировать новое приложение" + +#: aleksis/core/templates/oauth2_provider/application/list.html:25 +msgid "No applications defined." +msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ определены." + +#: aleksis/core/templates/oauth2_provider/authorize.html:5 +#: aleksis/core/templates/socialaccount/login.html:5 +#: aleksis/core/templates/socialaccount/login.html:6 +msgid "Authorize" +msgstr "Ðвторизовать" + +#: aleksis/core/templates/oauth2_provider/authorize.html:23 +#, python-format +msgid "Authorize %(name)s" +msgstr "Ðвторизовать %(name)s" + +#: aleksis/core/templates/oauth2_provider/authorize.html:25 +msgid "The application requests access to the following scopes:" +msgstr "Приложение запрашивает разрешение к таким пределам дейÑтвиÑ:" + +#: aleksis/core/templates/oauth2_provider/authorize.html:40 +msgid "Allow" +msgstr "Разрешить" + +#: aleksis/core/templates/oauth2_provider/authorize.html:43 +msgid "Disallow" +msgstr "Запретить" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 +msgid "Revoke access" +msgstr "Отозвать доÑтуп" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 +msgid "Are you sure to revoke the access for this application?" +msgstr "Ви дейÑтвительно хотите отозвать доÑтуп Ð´Ð»Ñ Ñтого приложениÑ?" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 +msgid "Revoke" +msgstr "Отозвать" + +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "Ðвторизованные приложениÑ" + +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 +msgid "No authorized applications." +msgstr "Ðвторизованных приложений нет." + +#: aleksis/core/templates/offline.html:5 +msgid "Network error" +msgstr "Ошибка Ñети" + +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." +msgstr "" + +#: aleksis/core/templates/offline.html:14 +#, fuzzy +#| msgid "" +#| "\n" +#| " There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +#| " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +#| " administrators:\n" +#| " " +msgid "" +"\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" +" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +" administrators:\n" +" " +msgstr "" +"\n" +" При доÑтупе к Ñтой Ñтранице произошла ошибка. Возможно, у Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚Ð¾Ð¼. УбедитеÑÑŒ, что Ваш WiFi\n" +" или мобильный интернет включены и попробуйте ещё раз. ЕÑли Ñчитаете, что Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸ÐµÐ¼ вÑÑ‘ хорошо, обратитеÑÑŒ,\n" +" пожалуйÑта, к ÑиÑтемным админиÑтраторам:\n" +" " + +#: aleksis/core/templates/search/search.html:8 +msgid "Global Search" +msgstr "Глобальный поиÑк" + +#: aleksis/core/templates/search/search.html:15 +msgid "Search Term" +msgstr "ПоиÑковый термин" + +#: aleksis/core/templates/search/search.html:26 +msgid "Results" +msgstr "Результаты" + +#: aleksis/core/templates/search/search.html:38 +msgid "No search results could be found to your search." +msgstr "По Вашему поиÑковому запроÑу результатов нет." + +#: aleksis/core/templates/search/search.html:87 +msgid "Please enter a search term above." +msgstr "ПожалуйÑта, напишите выше поиÑковый термин." + +#: aleksis/core/templates/socialaccount/authentication_error.html:5 +#: aleksis/core/templates/socialaccount/authentication_error.html:6 +msgid "Third-party Account Login Failure" +msgstr "Ошибка входа Ñторонней учётной запиÑи" + +#: aleksis/core/templates/socialaccount/authentication_error.html:13 +msgid "Third-party Account Login Failure." +msgstr "Ошибка входа учётной запиÑи третьей Ñтороны." + +#: aleksis/core/templates/socialaccount/authentication_error.html:15 +msgid "" +"\n" +" An error occurred while attempting to login via your third-party account.\n" +" Please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" Во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ входа Ñ Ð’Ð°ÑˆÐµÐ¹ Ñторонней учётной запиÑью возникла ошибка входа.\n" +" ОбратитеÑÑŒ, пожалуйÑта, к админиÑтратору Ñайта.\n" +" " + +#: aleksis/core/templates/socialaccount/connections.html:5 +#: aleksis/core/templates/socialaccount/connections.html:6 +msgid "Connections" +msgstr "СоединениÑ" + +#: aleksis/core/templates/socialaccount/connections.html:24 +msgid "Remove" +msgstr "Удалить" + +#: aleksis/core/templates/socialaccount/connections.html:34 +msgid "You currently have no third-party accounts connected to this account." +msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñƒ Ð’Ð°Ñ Ð½ÐµÑ‚ учётных запиÑей третих Ñторон, Ñоединённых Ñ Ñтой учётной запиÑью." + +#: aleksis/core/templates/socialaccount/connections.html:37 +msgid "Add a Third-party Account" +msgstr "Добавить Ñтороннюю учётную запиÑÑŒ" + +#: aleksis/core/templates/socialaccount/login.html:12 +#, python-format +msgid "You are about to connect a new third party account from %(provider)s." +msgstr "Ð’Ñ‹ подключаете новую учётную запиÑÑŒ третьей Ñтороны от %(provider)s." + +#: aleksis/core/templates/socialaccount/login.html:23 +#, python-format +msgid "You are about to sign in using a third party account from %(provider)s." +msgstr "Ð’Ñ‹ авторизуетеÑÑŒ при помощи Ñторонней учётной запиÑи от %(provider)s." + +#: aleksis/core/templates/socialaccount/login.html:28 +msgid "Continue" +msgstr "Продолжить" + +#: aleksis/core/templates/socialaccount/login_cancelled.html:5 +#: aleksis/core/templates/socialaccount/login_cancelled.html:6 +#: aleksis/core/templates/socialaccount/login_cancelled.html:13 +msgid "Login cancelled" +msgstr "Вход отменён" + +#: aleksis/core/templates/socialaccount/login_cancelled.html:15 +#, python-format +msgid "" +"\n" +" You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n" +" " +msgstr "" +"\n" +" Похоже, Ð’Ñ‹ отменили вход на наш Ñайт Ñ Ð¾Ð´Ð½Ð¾Ð¹ из Ваших учётных запиÑей. ЕÑли Ñто произошло Ñлучайно, Ð’Ñ‹ можете <a href=\"%(login_url)s\">продолжить вход здеÑÑŒ</a>.\n" +" " + +#: aleksis/core/templates/socialaccount/signup.html:12 +#, python-format +msgid "" +"You are about to use your %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" +"Ð’Ñ‹ на пути к иÑпользованию Ñвоей учётной запиÑи %(provider_name)s\n" +" Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в %(site_name)s. Заполните, пожалуйÑта, Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñту форму:" + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:12 +#, python-format +msgid "" +"\n" +" Login with %(name)s\n" +" " +msgstr "" +"\n" +" Вход Ñ %(name)s\n" +" " + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:21 +#, python-format +msgid "" +"\n" +" Login with %(name)s\n" +" " +msgstr "" +"\n" +" Вход Ñ %(name)s\n" +" " + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:30 +msgid "" +"\n" +" No third-party account providers available.\n" +" " +msgstr "" +"\n" +" Провайдеры Ñторонних учётных запиÑей недоÑтупны.\n" +" " + +#: aleksis/core/templates/templated_email/base.email:5 +#: aleksis/core/templates/templated_email/base.email:16 +msgid "Hello" +msgstr "Привет" + +#: aleksis/core/templates/templated_email/celery_failure.email:4 +#, python-format +msgid "Celery task %(task_name)s failed!" +msgstr "Сбой в задании Celery Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ %(task_name)s!" + +#: aleksis/core/templates/templated_email/celery_failure.email:7 +#, python-format +msgid "the celery task %(task_name)s failed with following information:" +msgstr "в задании Celery %(task_name)s произошла ошибка:" + +#: aleksis/core/templates/templated_email/celery_failure.email:10 +#: aleksis/core/templates/templated_email/celery_failure.email:29 +msgid "Task ID" +msgstr "ID заданиÑ" + +#: aleksis/core/templates/templated_email/celery_failure.email:11 +#: aleksis/core/templates/templated_email/celery_failure.email:30 +msgid "Raised exception" +msgstr "ИÑключение" + +#: aleksis/core/templates/templated_email/celery_failure.email:12 +#: aleksis/core/templates/templated_email/celery_failure.email:31 +msgid "Positional arguments" +msgstr "Ðргументы" + +#: aleksis/core/templates/templated_email/celery_failure.email:15 +#: aleksis/core/templates/templated_email/celery_failure.email:38 +msgid "Keyword arguments" +msgstr "Ðргументы Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ð¼Ð¸ Ñловами" + +#: aleksis/core/templates/templated_email/celery_failure.email:22 +#, python-format +msgid "" +"\n" +" the celery task %(task_name)s failed with following information:\n" +" " +msgstr "" +"\n" +" в задании Celery %(task_name)s произошла ошибка:\n" +" " + +#: aleksis/core/templates/templated_email/data_checks.email:3 +msgid "The system detected some new problems with your data." +msgstr "СиÑтема обнаружила новые проблемы Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными." + +#: aleksis/core/templates/templated_email/data_checks.email:6 +msgid "" +"the system detected some new problems with your data.\n" +"Please take some time to inspect them and solve the issues or mark them as ignored." +msgstr "" +"ÑиÑтема обнаружила новые проблемы Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными.\n" +"Уделите, пожалуйÑта, немного времени Ð´Ð»Ñ Ð¸Ñ… проверки и Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼, или же отметьте их Ð´Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ." + +#: aleksis/core/templates/templated_email/data_checks.email:15 +msgid "" +"\n" +" the system detected some new problems with your data.\n" +" Please take some time to inspect them and solve the issues or mark them as ignored.\n" +" " +msgstr "" +"\n" +" ÑиÑтема обнаружила новые проблемы Ñ Ð’Ð°ÑˆÐ¸Ð¼Ð¸ данными.\n" +" Уделите, пожалуйÑта, немного времени Ð´Ð»Ñ Ð¸Ñ… проверки и Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼, или же отметьте их Ð´Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.\n" +" " + +#: aleksis/core/templates/templated_email/data_checks.email:23 +msgid "Problem description" +msgstr "ОпиÑание проблемы" + +#: aleksis/core/templates/templated_email/data_checks.email:24 +msgid "Count of objects with new problems" +msgstr "КоличеÑтво объектов Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ проблемами" + +#: aleksis/core/templates/templated_email/notification.email:4 +msgid "New notification for" +msgstr "Ðовое уведомление длÑ" + +#: aleksis/core/templates/templated_email/notification.email:6 +#: aleksis/core/templates/templated_email/notification.email:20 +#, python-format +msgid "Hello %(notification_user)s," +msgstr "Привет, %(notification_user)s," + +#: aleksis/core/templates/templated_email/notification.email:9 +#: aleksis/core/templates/templated_email/notification.email:23 +msgid "we got a new notification for you:" +msgstr "у Ð½Ð°Ñ Ð´Ð»Ñ Ð’Ð°Ñ Ð½Ð¾Ð²Ð¾Ðµ уведомление:" + +#: aleksis/core/templates/templated_email/notification.email:15 +#: aleksis/core/templates/templated_email/notification.email:29 +msgid "More information" +msgstr "Подробнее" + +#: aleksis/core/templates/templated_email/notification.email:17 +#, python-format +msgid "Sent by %(trans_sender)s at %(trans_created_at)s" +msgstr "Отправлено %(trans_sender)s в %(trans_created_at)s" + +#: aleksis/core/templates/templated_email/notification.email:34 +#, python-format +msgid "" +"\n" +" Sent by %(trans_sender)s at %(trans_created_at)s\n" +" " +msgstr "" +"\n" +" Отправлено %(trans_sender)s в %(trans_created_at)s\n" +" " + +#: aleksis/core/templates/templated_email/person_changed.email:4 +#, python-format +msgid "%(person)s changed their data!" +msgstr "%(person)s изменили Ñвои данные!" + +#: aleksis/core/templates/templated_email/person_changed.email:7 +#, python-format +msgid "the person %(person)s recently changed the following fields:" +msgstr "физлицо %(person)s менÑет такие полÑ:" + +#: aleksis/core/templates/templated_email/person_changed.email:15 +#, python-format +msgid "" +"\n" +" the person %(person)s recently changed the following fields:\n" +" " +msgstr "" +"\n" +" физлицо %(person)s менÑет такие полÑ:\n" +" " + +#: aleksis/core/templates/two_factor/_base_focus.html:6 +#: aleksis/core/templates/two_factor/core/otp_required.html:22 +#: aleksis/core/templates/two_factor/core/setup.html:5 +#: aleksis/core/templates/two_factor/profile/profile.html:88 +msgid "Enable Two-Factor Authentication" +msgstr "Включить двух-факторную аутентификацию" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:5 +#: aleksis/core/templates/two_factor/core/backup_tokens.html:9 +#: aleksis/core/templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "Резервные токены" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" +"\n" +" Резервные токены могут быть иÑпользованы, когда Ваши оÑновной и резервный\n" +" телефонные номера недоÑтупны. Резервные токены, указанные ниже, могут быть\n" +" иÑпользованы Ð´Ð»Ñ Ð²ÐµÑ€Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ входа. Когда Ð’Ñ‹ иÑпользуете вÑе резервные токены,\n" +" Ð’Ñ‹ Ñможете Ñгенерировать новый набор резервных токенов. ДейÑтвительными будут только\n" +" токены, указанные ниже.\n" +" " + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" +"\n" +" РаÑпечатайте Ñти токены и Ñохраните их в надёжном меÑте.\n" +" " + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "У Ð’Ð°Ñ Ð¿Ð¾ÐºÐ° ещё нет резервных кодов." + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "Ðазад к безопаÑноÑти учётной запиÑи" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "Создать Токены" + +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "Войти" + +#: aleksis/core/templates/two_factor/core/login.html:27 +#, python-format +msgid "Login for %(name)s" +msgstr "Войти Ð´Ð»Ñ %(name)s" + +#: aleksis/core/templates/two_factor/core/login.html:30 +msgid "Login with username and password" +msgstr "Войдите Ñ Ð¸Ñпользованием логина и паролÑ" + +#: aleksis/core/templates/two_factor/core/login.html:38 +msgid "" +"You have no permission to view this page. Please login with an other\n" +" account." +msgstr "" +"У Ð’Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° проÑмотр Ñтой Ñтраницы. Войдите, пожалуйÑта,\n" +" Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ учётной запиÑью." + +#: aleksis/core/templates/two_factor/core/login.html:47 +msgid "Please login with your account to use the external application." +msgstr "Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾Ð¹Ð´Ð¸Ñ‚Ðµ, пожалуйÑта, в Ñвою учётную запиÑÑŒ." + +#: aleksis/core/templates/two_factor/core/login.html:54 +msgid "Please login to see this page." +msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтой Ñтраницы, пожалуйÑта, войдите." + +#: aleksis/core/templates/two_factor/core/login.html:65 +msgid "" +"\n" +" We are calling your phone right now, please enter the\n" +" digits you hear.\n" +" " +msgstr "" +"\n" +" Мы ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð½Ð¸Ð¼ на Ваш номер. Ðапишите, пожалуйÑта, цифры,\n" +" которые Ð’Ñ‹ уÑлышите.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:70 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we\n" +" sent.\n" +" " +msgstr "" +"\n" +" Мы отправили Вам текÑтовое Ñообщение. Ðапишите, пожалуйÑта, полученный\n" +" токен.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:75 +msgid "" +"\n" +" Please enter the tokens generated by your token\n" +" generator.\n" +" " +msgstr "" +"\n" +" Ðапишите, пожалуйÑта, токен, Ñ Ð’Ð°ÑˆÐµÐ³Ð¾\n" +" генератора токенов.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:81 +msgid "" +"\n" +" Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° воÑпользуйтеÑÑŒ формой Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° резервных токенов.\n" +" Ðти токены были Ñгенерированы, чтобы Ð’Ñ‹ раÑпечатали их и Ñохранили в надёжном меÑте.\n" +" Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° укажите, пожалуйÑта, один из резервных токенов.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:109 +msgid "Device currently not available?" +msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ ÑƒÑтройÑтво недоÑтупно?" + +#: aleksis/core/templates/two_factor/core/login.html:111 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "Или можете воÑпользоватьÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из резервных телефонов:" + +#: aleksis/core/templates/two_factor/core/login.html:122 +msgid "As a last resort, you can use a backup token:" +msgstr "Ð’ качеÑтве поÑледней возможноÑти можете воÑпользоватьÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ð¼ токеном:" + +#: aleksis/core/templates/two_factor/core/login.html:125 +msgid "Use Backup Token" +msgstr "ВоÑпользоватьÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ð¼ токеном" + +#: aleksis/core/templates/two_factor/core/login.html:136 +msgid "Use alternative login options" +msgstr "ВоÑпользоватьÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸ возможноÑÑ‚Ñми Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°" + +#: aleksis/core/templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "ДоÑтуп отÑутÑтвует" + +#: aleksis/core/templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" +"Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра запрошенной Ñтраницы, Ñ Ð¾Ð³Ð»Ñдкой на безопаÑноÑть, необходима дополнительнаÑ\n" +" проверка Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¸Ñпользованием двухфакторной аутентификации.\n" +" Ð”Ð»Ñ Ð´Ð¾Ñтупа к данной Ñтранице Ð’Ñ‹ должны включить Ñти функции безопаÑноÑти." + +#: aleksis/core/templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" +"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð² Вашей учётной запиÑи отключена\n" +" Ð”Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти учётки включите двухфакторную\n" +" аутентификацию." + +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "Ðазад" + +#: aleksis/core/templates/two_factor/core/phone_register.html:5 +#: aleksis/core/templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "Добавить резервный телефон" + +#: aleksis/core/templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" +"Ð’Ñ‹ добавлÑете в Ñвою учётную запиÑÑŒ резервный номер телефона.\n" +" Он будет иÑпользован в Ñлучае невозможноÑти региÑтрации Ñ Ð’Ð°ÑˆÐ¸Ð¼\n" +" оÑновным номером." + +#: aleksis/core/templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" +"Мы отправили токен на Ваш номер. Ðапишите,\n" +" пожалуйÑта, полученный токен." + +#: aleksis/core/templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" +"\n" +" Ð’Ñ‹ уÑтанавливаете Ð´Ð»Ñ Ñвоей учётной запиÑи новый уровень безопаÑноÑти.\n" +" Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ð¹ аутентификации пройдите неÑколько шагов\n" +" маÑтера наÑтройки.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" +"\n" +" Выберите, пожалуйÑта, метод аутентификации, который Ð’Ñ‹ хотите иÑпользовать:\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" favourite two factor authentication (TOTP) app to scan the QR code below.\n" +" Then, enter the token generated by the app.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы начать иÑпользование генератора токенов, воÑпользуйтеÑÑŒ, пожалуйÑта, Ñвоим\n" +" любимым приложением Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ð¹ аутентификации (TOTP) и отÑканируйте QR-код, который видите ниже.\n" +" ПоÑле Ñтого напишите полученный генератором токен.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" +"\n" +" Ðапишите, пожалуйÑта, номер телефона, на который хотите\n" +" получать текÑтовые ÑообщениÑ. Ðа Ñледующем Ñтапе он будет проверен.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" +"\n" +" Ðапишите, пожалуйÑта, номер телефона, на который хотите\n" +" получать звонки. Ðа Ñледующем Ñтапе он будет проверен.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" +"\n" +" Мы ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð²Ð¾Ð½Ð¸Ð¼ на Ваш номер, – напишите, пожалуйÑта, цифры, которые уÑлышите.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" +"\n" +" Мы отправили Вам текÑтовое Ñообщение. Ðапишите, пожалуйÑта, полученные токены.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" +"\n" +" Мы заметили, что ÑущеÑтвует проблема Ñ Ð¸Ñпользованием выбранного метода авторизации. ВернитеÑÑŒ,\n" +" пожалуйÑта, назад, и убедитеÑÑŒ, что необходимые данные указаны правильно,\n" +" поÑле чего попробуйте зайти ешё раз, или же воÑпользуйтеÑÑŒ другим вариантом входа. ЕÑли же\n" +" проблема оÑтаётÑÑ, обратитеÑÑŒ к админиÑтратору Ñайта.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ и проверки Вашего YubiKey напишите,\n" +" пожалуйÑта, ниже токен. Ваш YubiKey будет привÑзан к Вашей\n" +" учётной запиÑи.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:5 +#: aleksis/core/templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÑпешно включена" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" +"\n" +" ПоздравлÑем Ñ ÑƒÑпешной наÑтройкой двухфакторной аутентификации.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:24 +#: aleksis/core/templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "Ðазад к Профилю" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:28 +#: aleksis/core/templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "Создать резервные коды" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" +"\n" +" Между прочим, может так ÑлучитьÑÑ, что у Ð’Ð°Ñ Ð½Ðµ будет доÑтупа к Ñвоему оÑновному\n" +" уÑтройÑтву Ñ Ñ‚Ð¾ÐºÐµÐ½Ð°Ð¼Ð¸. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚ÐºÐ¸ Ñоздайте резервные коды\n" +" или добавьте номер телефона.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:52 +#: aleksis/core/templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "Добавить номер телефона" + +#: aleksis/core/templates/two_factor/profile/disable.html:5 +#: aleksis/core/templates/two_factor/profile/disable.html:9 +#: aleksis/core/templates/two_factor/profile/profile.html:63 +#: aleksis/core/templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "Отключить двухфакторную аутентификацию" + +#: aleksis/core/templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "Ð’Ñ‹ отключаете двухфакторную аутентификацию. Ðто Ñнизит защиту Вашей учётной запиÑи. Ð’Ñ‹ уверены?" + +#: aleksis/core/templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "Отключить" + +#: aleksis/core/templates/two_factor/profile/profile.html:5 +#: aleksis/core/templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "БезопаÑноÑть учётной запиÑи" + +#: aleksis/core/templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "Токены будут Ñозданы Вашим генератором токенов." + +#: aleksis/core/templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "ОÑновной метод: %(primary)s" + +#: aleksis/core/templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "Токены будут Ñозданы Вашим YubiKey." + +#: aleksis/core/templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "Резервные номера телефонов" + +#: aleksis/core/templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" +"ЕÑли Ваш оÑновной метод будет не доÑтупен, мы Ñможем\n" +" отправить резервные токены на указанные ниже телефонные номера." + +#: aleksis/core/templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "Отменить региÑтрацию" + +#: aleksis/core/templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" +"ЕÑли у Ð’Ð°Ñ Ñ Ñобой нет ни одного уÑтройÑтва, Ð’Ñ‹ можете\n" +" получить доÑтуп Ñ Ð¸Ñпользованием резервных токенов." + +#: aleksis/core/templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +"\n" +" У Ð’Ð°Ñ Ð¾ÑталÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ один резервный токен.\n" +" " +msgstr[1] "" +"\n" +" У Ð’Ð°Ñ Ð¾ÑталоÑÑŒ %(counter)s резервных токена.\n" +" " +msgstr[2] "" +"\n" +" У Ð’Ð°Ñ Ð¾ÑталоÑÑŒ %(counter)s резервных токенов.\n" +" " +msgstr[3] "" +"\n" +" У Ð’Ð°Ñ Ð¾ÑталÑÑ %(counter)s резервный токен.\n" +" " + +#: aleksis/core/templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "Показать коды" + +#: aleksis/core/templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" +"\n" +" Ðе ÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что мы Вам рекомендуем Ñтого не делать, Ð’Ñ‹ можете \n" +" также отключить двухфакторную аутентификацию Ð´Ð»Ñ Ñвоей учётной запиÑи.\n" +" " + +#: aleksis/core/templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" +"\n" +" Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ¹ учётной запиÑи\n" +" не активирована. Ð”Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти учётной запиÑи включите\n" +" двухфакторную аутентификацию.\n" +" " + +#: aleksis/core/util/notifications.py:64 +msgid "E-Mail" +msgstr "Ðл.почта" + +#: aleksis/core/util/notifications.py:65 +msgid "SMS" +msgstr "СМС" + +#: aleksis/core/util/pdf.py:151 +msgid "Progress: Generate PDF file" +msgstr "Ð’ процеÑÑе: Генерирование файла PDF" + +#: aleksis/core/util/pdf.py:152 +msgid "Generating PDF file …" +msgstr "Создание файла PDF …" + +#: aleksis/core/util/pdf.py:153 +msgid "The PDF file has been generated successfully." +msgstr "Файл PDF уÑпешно Ñоздан." + +#: aleksis/core/util/pdf.py:154 +msgid "There was a problem while generating the PDF file." +msgstr "Во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° PDF возникла проблема." + +#: aleksis/core/util/pdf.py:157 +msgid "Download PDF" +msgstr "Скачать PDF" + +#: aleksis/core/views.py:278 +msgid "The school term has been created." +msgstr "Учебный год Ñоздан." + +#: aleksis/core/views.py:290 +msgid "The school term has been saved." +msgstr "Учебный год Ñохранён." + +#: aleksis/core/views.py:394 +msgid "The child groups were successfully saved." +msgstr "Дочерние группы Ñохранены." + +#: aleksis/core/views.py:413 aleksis/core/views.py:423 +msgid "The person has been saved." +msgstr "Физлицо Ñохранено." + +#: aleksis/core/views.py:473 +msgid "The group has been saved." +msgstr "Группа Ñохранена." + +#: aleksis/core/views.py:556 +msgid "The announcement has been saved." +msgstr "ОбъÑвление Ñохранено." + +#: aleksis/core/views.py:572 +msgid "The announcement has been deleted." +msgstr "ОбъÑвление удалено." + +#: aleksis/core/views.py:641 +msgid "The requested preference registry does not exist" +msgstr "Журнал Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами не ÑущеÑтвует" + +#: aleksis/core/views.py:660 +msgid "The preferences have been saved successfully." +msgstr "СвойÑтва Ñохранены." + +#: aleksis/core/views.py:684 +msgid "The person has been deleted." +msgstr "Физлицо удалено." + +#: aleksis/core/views.py:698 +msgid "The group has been deleted." +msgstr "Группа удалена." + +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." +msgstr "Дополнительное поле Ñохранено." + +#: aleksis/core/views.py:765 +msgid "The additional field has been deleted." +msgstr "Дополнительное поле удалено." + +#: aleksis/core/views.py:790 +msgid "The group type has been saved." +msgstr "Тип группы Ñохранён." + +#: aleksis/core/views.py:821 +msgid "The group type has been deleted." +msgstr "Тип группы удалён." + +#: aleksis/core/views.py:856 +msgid "Progress: Run data checks" +msgstr "Ð’ процеÑÑе: ЗапуÑк проверки данных" + +#: aleksis/core/views.py:857 +msgid "Run data checks …" +msgstr "ЗапуÑкаетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° данных …" + +#: aleksis/core/views.py:858 +msgid "The data checks were run successfully." +msgstr "Проверка данных уÑпешно запущена." + +#: aleksis/core/views.py:859 +msgid "There was a problem while running data checks." +msgstr "Во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка проверки данных возникла проблема." + +#: aleksis/core/views.py:876 +#, python-brace-format +msgid "The solve option '{solve_option_obj.verbose_name}' " +msgstr "Вариант Ñ€ÐµÑˆÐµÐ½Ð¸Ñ \"{solve_option_obj.verbose_name}\" " + +#: aleksis/core/views.py:886 +msgid "The requested solve option does not exist" +msgstr "Запрошенный вариант Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ðµ ÑущеÑтвует" + +#: aleksis/core/views.py:919 +msgid "The dashboard widget has been saved." +msgstr "Виджет информпанели Ñохранён." + +#: aleksis/core/views.py:949 +msgid "The dashboard widget has been created." +msgstr "Виджет информпанели Ñоздан." + +#: aleksis/core/views.py:959 +msgid "The dashboard widget has been deleted." +msgstr "Виджет информпанели удалён." + +#: aleksis/core/views.py:1030 +msgid "Your dashboard configuration has been saved successfully." +msgstr "Ваша ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ð¸ Ñохранена." + +#: aleksis/core/views.py:1032 +msgid "The configuration of the default dashboard has been saved successfully." +msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð¹/Ñтандартной информпанели." + +#: aleksis/core/views.py:1103 +#, python-brace-format +msgid "The invitation was successfully created. The invitation code is {code}" +msgstr "Приглашение уÑпешно Ñоздано. Код приглашениÑ: {code}" + +#: aleksis/core/views.py:1200 +msgid "We have successfully assigned the permissions." +msgstr "Мы уÑпешно назначили доÑтупы." + +#: aleksis/core/views.py:1210 +msgid "The global user permission has been deleted." +msgstr "Глобальный пользовательÑкий доÑтуп удалён." + +#: aleksis/core/views.py:1220 +msgid "The global group permission has been deleted." +msgstr "Глобальный групповой доÑтуп удалён." + +#: aleksis/core/views.py:1230 +msgid "The object user permission has been deleted." +msgstr "Объектный пользовательÑкий доÑтуп удалён." + +#: aleksis/core/views.py:1240 +msgid "The object group permission has been deleted." +msgstr "Объектный групповой доÑтуп удалён." + +#: aleksis/core/views.py:1349 +msgid "The third-party account could not be disconnected because it is the only login method available." +msgstr "Учётную запиÑÑŒ третьей Ñтороны Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, Ñ‚.к. Ñто единÑтвенный ÑпоÑоб входа." + +#: aleksis/core/views.py:1356 +msgid "The third-party account has been successfully disconnected." +msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ третьей Ñтороны уÑпешно отключена." + +#: aleksis/core/views.py:1432 +msgid "Person was invited successfully and an email with further instructions has been send to them." +msgstr "Владелец указанного Ñл.адреÑа уÑпешно приглашён. ИнÑтрукции о дальнейших дейÑтвиÑÑ… отправлены на Ñл.почту." + +#: aleksis/core/views.py:1443 +msgid "Person was already invited." +msgstr "Кто-то уже приглаÑил его/её." + +#~ msgid "Birthday Calendar" +#~ msgstr "Календарь Дней РождениÑ" + +#~ msgid "A Calendar of Birthdays" +#~ msgstr "Календарь Дней РождениÑ" + +#, python-format +#~ msgid "%(name)s's birthday" +#~ msgstr "%(name)s отмечает День РождениÑ" + +#, python-format +#~ msgid "%(name)s was born on %(birthday)s" +#~ msgstr "%(name)s родилÑÑ(-лаÑÑŒ) %(birthday)s" + +#~ msgid "Dashboard" +#~ msgstr "Информпанель" + +#~ msgid "Admin" +#~ msgstr "Ðдмин" + +#~ msgid "Data management" +#~ msgstr "Управление данными" + +#~ msgid "Configuration" +#~ msgstr "КонфигурациÑ" + +#~ msgid "Backend Admin" +#~ msgstr "ÐдминиÑтрирование бекенда" + +#~ msgid "People" +#~ msgstr "Люди" + +#~ msgid "Groups and child groups" +#~ msgstr "Группы и дочерние группы" + +#~ msgid "Invite person" +#~ msgstr "ПриглаÑить знакомого" + +#~ msgid "Stop impersonation" +#~ msgstr "ОÑтановить прикрытие" + +#~ msgid "Account" +#~ msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" + +#~ msgid "2FA" +#~ msgstr "2FA" + +#~ msgid "Third-party accounts" +#~ msgstr "Учётные запиÑи третих Ñторон" + +#~ msgid "Calendar Feeds" +#~ msgstr "Ленты календарей" + +#~ msgid "Logout" +#~ msgstr "Выйти" + +#~ msgid "UUID" +#~ msgstr "UUID" + +#~ msgid "Selected ICal feed" +#~ msgstr "Лента выбранного iCal" + +#~ msgid "Personal Calendar URL" +#~ msgstr "URL-ÑÑылка ÑобÑтвенного календарÑ" + +#~ msgid "Personal Calendar URLs" +#~ msgstr "URL-ÑÑылка ÑобÑтвенных календарей" + +#~ msgid "Available languages" +#~ msgstr "ДоÑтупные Ñзыки" + +#~ msgid "" +#~ "An unexpected error has\n" +#~ " occured." +#~ msgstr "" +#~ "Произошла Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ \n" +#~ " ошибка." + +#~ msgid "About AlekSIS® — The Free School Information System" +#~ msgstr "Об AlekSIS® — The Free School Information System" + +#~ msgid "Imprint" +#~ msgstr "Отпечаток" + +#~ msgid "Privacy Policy" +#~ msgstr "Политика приватноÑти" + +#~ msgid "years to" +#~ msgstr "–" + +#~ msgid "years " +#~ msgstr "гг. " + +#~ msgid "Create iCal URL" +#~ msgstr "Создать ÑÑылку iCal" + +#, python-format +#~ msgid "Edit iCal URL %(object)s" +#~ msgstr "Редактировать ÑÑылку iCal %(object)s" + +#~ msgid "ICal Feeds" +#~ msgstr "iCal-ленты" + +#~ msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software." +#~ msgstr "ЗдеÑÑŒ находÑÑ‚ÑÑ ÑÑылки на разные ленты календарей в формате iCal (.ics). Ð’Ñ‹ можете Ñоздать их Ñтолько, Ñколько будет необходимо и импортировать их в ПО Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñми." + +#~ msgid "Your iCal URLs" +#~ msgstr "Ваши ÑÑылки iCal" + +#~ msgid "Recent notifications" +#~ msgstr "Свежие уведомлениÑ" + +#~ msgid "More information →" +#~ msgstr "Больше информации →" + +#~ msgid "No notifications available yet." +#~ msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ° ещё недоÑтупны." + +#~ msgid "About AlekSIS®" +#~ msgstr "Об AlekSIS®" + +#~ msgid "AlekSIS® – The Free School Information System" +#~ msgstr "AlekSIS® – The Free School Information System" + +#~ msgid "About AlekSIS" +#~ msgstr "Об AlekSIS" + +#~ msgid "" +#~ "\n" +#~ " This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" +#~ " to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" +#~ " can be used by anyone.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ðта платформа иÑпользует AlekSIS®, веб-инÑтрумент информационной ÑиÑтемы Ð´Ð»Ñ Ð¾Ð±ÑƒÑ‡ÐµÐ½Ð¸Ñ (SIS) при помощи которой\n" +#~ " можно управлÑть и/или публиковать оргинформацию учебных заведений. AlekSIS - беÑплатное ПО\n" +#~ " и его может иÑпользовать любой желающий.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " AlekSIS® – зарегиÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð¾Ñ€Ð³Ð¾Ð²Ð°Ñ Ð¼Ð°Ñ€ÐºÐ° проекта Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом AlekSIS, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€ÐµÐ´Ñтавлена Teckids e.V.\n" +#~ " " + +#~ msgid "Website of AlekSIS" +#~ msgstr "ВебÑайт AlekSIS" + +#~ msgid "Source code" +#~ msgstr "ИÑходный код" + +#~ msgid "Licence information" +#~ msgstr "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" + +#~ msgid "" +#~ "\n" +#~ " The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" +#~ " information from third-party apps, if installed, refer to the respective components below. The\n" +#~ " licences are marked like this:\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ядро и официальные Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ AlekSIS лицензированы под лицензией EUPL, верÑии 1.2 или новее. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸\n" +#~ " о компонентах третих Ñторон, еÑли таковы уÑтановлены, перейдите к ÑоответÑтвующим компонентам ниже.\n" +#~ " Ðти лицензии обозначены такой отметкой:\n" +#~ " " + +#~ msgid "Free/Open Source Licence" +#~ msgstr "БеÑÐ¿Ð»Ð°Ñ‚Ð½Ð°Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Ð¸Ð»Ð¸ Open Source" + +#~ msgid "Other Licence" +#~ msgstr "Ð”Ñ€ÑƒÐ³Ð°Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ" + +#~ msgid "Full licence text" +#~ msgstr "Полный текÑÑ‚ лицензии" + +#~ msgid "More information about the EUPL" +#~ msgstr "Больше информации о EUPL" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " This app is licenced under %(licence)s.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ðто приложение под лицензией %(licence)s.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " Without activated JavaScript the progress status can't be updated.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Без активного JavaScript ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑтьÑÑ Ð½Ðµ Ñможет.\n" +#~ " " + +#~ msgid "Language" +#~ msgstr "Язык" + +#~ msgid "Select language" +#~ msgstr "Выберите Ñзык" + +#~ msgid "" +#~ "\n" +#~ " Your administrator account is not linked to any person. Therefore,\n" +#~ " a dummy person has been linked to your account.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ваша админиÑÑ‚Ñ€Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не Ñоединена на Ñ Ð¾Ð´Ð½Ð¸Ð¼ физлицом. ПоÑтому\n" +#~ " к Вашей учётной запиÑи привÑзано фейковое физлицо.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " Your user account is not linked to a person. This means you\n" +#~ " cannot access any school-related information. Please contact\n" +#~ " the managers of AlekSIS at your school.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не ÑвÑзана Ñ Ñ„Ð¸Ð·Ð»Ð¸Ñ†Ð¾Ð¼. Ðто значит,\n" +#~ " что у Ð’Ð°Ñ Ð½ÐµÑ‚ доÑтупа на к какой учебной информации. ОбратитеÑÑŒ,\n" +#~ " пожалуйÑта, к админиÑтраторам AlekSIS в Вашем учебном заведении.\n" +#~ " " + +#~ msgid "Impersonate" +#~ msgstr "МаÑкировка" + +#~ msgid "Invite user" +#~ msgstr "ПриглаÑить пользователÑ" + +#~ msgid "Contact details" +#~ msgstr "Контактные данные" + +#~ msgid "This person didn't upload a personal photo." +#~ msgstr "Ðта оÑоба не загрузила личное фото." + +#~ msgid "Children" +#~ msgstr "Дети" + +#~ msgid "Please return to your application and enter this code:" +#~ msgstr "ВернитеÑÑŒ, пожалуйÑта, к Ñвоему приложению и впишите Ñтот код:" + +#~ msgid "No internet connection." +#~ msgstr "ОтÑутÑтвует интернет-Ñоединение." + +#~ msgid "The additional_field has been saved." +#~ msgstr "Дополнительное поле Ñохранено." + +#~ msgid "The requested PDF file does not exist" +#~ msgstr "Запрошенный файл PDF не ÑущеÑтвует" + +#~ msgid "The requested task does not exist or is not accessible" +#~ msgstr "Запрошенное задание не ÑущеÑтвует или недоÑтупно" + +#~ msgid "ICal feed updated successfully" +#~ msgstr "Лента iCal уÑпешно обновлена" + +#~ msgid "ICal feed created successfully" +#~ msgstr "Лента iCal уÑпешно Ñоздана" + +#~ msgid "iCal Feeds" +#~ msgstr "iCal-ленты" + +#~ msgid "iCal feed updated successfully" +#~ msgstr "Лента iCal уÑпешно обновлена" + +#~ msgid "iCal feed deleted successfully" +#~ msgstr "Лента iCal уÑпешно удалена" + +#~ msgid "iCal feed created successfully" +#~ msgstr "Лента iCal уÑпешно Ñоздана" diff --git a/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000000000000000000000000000000000..bbc79d5d9fe785b8f3fd5900dc65b2b02ec2eec5 --- /dev/null +++ b/aleksis/core/locale/ru/LC_MESSAGES/djangojs.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" +"PO-Revision-Date: 2022-06-03 01:59+0000\n" +"Last-Translator: Serhii Horichenko <m@sgg.im>\n" +"Language-Team: Russian <https://translate.edugit.org/projects/aleksis/aleksis-core-js/ru/>\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"X-Generator: Weblate 4.12.1\n" + +#: aleksis/core/static/js/main.js:66 +msgid "Today" +msgstr "СегоднÑ" + +#: aleksis/core/static/js/main.js:67 +msgid "Cancel" +msgstr "Отменить" + +#: aleksis/core/static/js/main.js:68 +msgid "OK" +msgstr "OK" + +#~ msgid "This page may contain outdated information since there is no internet connection." +#~ msgstr "Из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚Ð° Ñта Ñтраница можеть отображать уÑтаревшую информацию." diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po index 2973720cd0f3f85a06ca9d68c21a2c09a92961a5..c79394a38e698af3a7ccc7991756d9c7b2a82bd3 100644 --- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po +++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,57 +17,64 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: aleksis/core/apps.py:166 +#: aleksis/core/apps.py:155 msgid "OpenID Connect scope" msgstr "" -#: aleksis/core/apps.py:167 +#: aleksis/core/apps.py:156 msgid "Given name, family name, link to profile and picture if existing." msgstr "" -#: aleksis/core/apps.py:168 +#: aleksis/core/apps.py:157 msgid "Full home postal address" msgstr "" -#: aleksis/core/apps.py:169 +#: aleksis/core/apps.py:158 msgid "Email address" msgstr "" -#: aleksis/core/apps.py:170 +#: aleksis/core/apps.py:159 msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 -#: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 -#: aleksis/core/templates/core/person/full.html:250 msgid "Groups" msgstr "" -#: aleksis/core/data_checks.py:56 +#: aleksis/core/data_checks.py:60 msgid "Ignore problem" msgstr "" -#: aleksis/core/data_checks.py:185 +#: aleksis/core/data_checks.py:188 #, python-brace-format msgid "Solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/data_checks.py:291 +#: aleksis/core/data_checks.py:284 msgid "Deactivate DashboardWidget" msgstr "" -#: aleksis/core/data_checks.py:303 +#: aleksis/core/data_checks.py:296 msgid "Ensure that there are no broken DashboardWidgets." msgstr "" -#: aleksis/core/data_checks.py:304 +#: aleksis/core/data_checks.py:297 msgid "The DashboardWidget was reported broken automatically." msgstr "" -#: aleksis/core/filters.py:42 aleksis/core/templates/core/base.html:105 -#: aleksis/core/templates/core/base.html:106 -#: aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "" + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "" + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 #: aleksis/core/templates/core/person/list.html:24 #: aleksis/core/templates/search/search.html:7 #: aleksis/core/templates/search/search.html:22 @@ -90,11 +97,11 @@ msgstr "" msgid "Content type" msgstr "" -#: aleksis/core/filters.py:113 aleksis/core/models.py:688 +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 msgid "User" msgstr "" -#: aleksis/core/filters.py:135 aleksis/core/models.py:461 +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 msgid "Group" msgstr "" @@ -102,7 +109,7 @@ msgstr "" msgid "Base data" msgstr "" -#: aleksis/core/forms.py:55 +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 msgid "Address" msgstr "" @@ -130,7 +137,7 @@ msgstr "" msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 msgid "School term" msgstr "" @@ -139,8 +146,7 @@ msgid "Common data" msgstr "" #: aleksis/core/forms.py:155 aleksis/core/forms.py:207 -#: aleksis/core/menus.py:254 aleksis/core/models.py:153 -#: aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" @@ -149,18 +155,18 @@ msgstr "" msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:157 aleksis/core/models.py:206 -#: aleksis/core/models.py:514 +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 msgid "Photo" msgstr "" #: aleksis/core/forms.py:199 aleksis/core/forms.py:202 -#: aleksis/core/models.py:73 +#: aleksis/core/models.py:84 msgid "Date" msgstr "" #: aleksis/core/forms.py:200 aleksis/core/forms.py:203 -#: aleksis/core/models.py:81 +#: aleksis/core/models.py:92 msgid "Time" msgstr "" @@ -196,11 +202,11 @@ msgstr "" msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 msgid "First name" msgstr "" -#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 msgid "Last name" msgstr "" @@ -229,11 +235,11 @@ msgid "You must select at least one group or person which should get the permiss msgstr "" #: aleksis/core/forms.py:499 -msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." msgstr "" #: aleksis/core/forms.py:586 -msgid "Adress data" +msgid "Address data" msgstr "" #: aleksis/core/forms.py:598 @@ -248,7 +254,15 @@ msgstr "" msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:775 +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "" + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "" + +#: aleksis/core/forms.py:828 msgid "No valid selection." msgstr "" @@ -272,700 +286,665 @@ msgstr "" msgid "No backup result found!" msgstr "" -#: aleksis/core/menus.py:9 aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:32 -#: aleksis/core/templates/two_factor/core/login.html:95 -msgid "Login" -msgstr "" - -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 -#: aleksis/core/templates/socialaccount/signup.html:23 -msgid "Sign up" -msgstr "" - -#: aleksis/core/menus.py:24 aleksis/core/templates/invitations/enter.html:7 -msgid "Accept invitation" -msgstr "" - -#: aleksis/core/menus.py:33 -msgid "Dashboard" -msgstr "" - -#: aleksis/core/menus.py:41 aleksis/core/models.py:734 -#: aleksis/core/preferences.py:29 -#: aleksis/core/templates/core/notifications.html:4 -#: aleksis/core/templates/core/notifications.html:5 -msgid "Notifications" -msgstr "" - -#: aleksis/core/menus.py:53 -msgid "Account" -msgstr "" - -#: aleksis/core/menus.py:60 -msgid "Stop impersonation" -msgstr "" - -#: aleksis/core/menus.py:69 aleksis/core/templates/core/base.html:80 -msgid "Logout" -msgstr "" - -#: aleksis/core/menus.py:75 -msgid "2FA" -msgstr "" - -#: aleksis/core/menus.py:83 -#: aleksis/core/templates/account/password_change.html:5 -#: aleksis/core/templates/account/password_change.html:6 -#: aleksis/core/templates/account/password_change.html:19 -#: aleksis/core/templates/account/password_reset_from_key.html:5 -#: aleksis/core/templates/account/password_reset_from_key.html:42 -#: aleksis/core/templates/account/password_reset_from_key.html:46 -#: aleksis/core/templates/account/password_reset_from_key_done.html:5 -#: aleksis/core/templates/account/password_reset_from_key_done.html:6 -msgid "Change password" -msgstr "" - -#: aleksis/core/menus.py:95 -msgid "Me" -msgstr "" - -#: aleksis/core/menus.py:104 -#: aleksis/core/templates/dynamic_preferences/form.html:5 -msgid "Preferences" -msgstr "" - -#: aleksis/core/menus.py:113 -msgid "Third-party accounts" -msgstr "" - -#: aleksis/core/menus.py:122 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 -#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 -msgid "Authorized applications" -msgstr "" - -#: aleksis/core/menus.py:133 -msgid "Admin" -msgstr "" - -#: aleksis/core/menus.py:141 aleksis/core/models.py:834 -#: aleksis/core/templates/core/announcement/list.html:7 -#: aleksis/core/templates/core/announcement/list.html:8 -msgid "Announcements" -msgstr "" - -#: aleksis/core/menus.py:152 aleksis/core/models.py:131 -#: aleksis/core/templates/core/school_term/list.html:8 -#: aleksis/core/templates/core/school_term/list.html:9 -msgid "School terms" -msgstr "" - -#: aleksis/core/menus.py:163 -#: aleksis/core/templates/core/dashboard_widget/list.html:8 -#: aleksis/core/templates/core/dashboard_widget/list.html:9 -msgid "Dashboard widgets" -msgstr "" - -#: aleksis/core/menus.py:174 -#: aleksis/core/templates/core/management/data_management.html:6 -#: aleksis/core/templates/core/management/data_management.html:7 -msgid "Data management" -msgstr "" - -#: aleksis/core/menus.py:185 -#: aleksis/core/templates/core/pages/system_status.html:5 -#: aleksis/core/templates/core/pages/system_status.html:7 -msgid "System status" -msgstr "" - -#: aleksis/core/menus.py:196 -msgid "Configuration" -msgstr "" - -#: aleksis/core/menus.py:207 aleksis/core/templates/core/data_check/list.html:9 -#: aleksis/core/templates/core/data_check/list.html:10 -msgid "Data checks" -msgstr "" - -#: aleksis/core/menus.py:213 aleksis/core/templates/core/perms/list.html:13 -#: aleksis/core/templates/core/perms/list.html:14 -msgid "Manage permissions" -msgstr "" - -#: aleksis/core/menus.py:224 -msgid "Backend Admin" -msgstr "" - -#: aleksis/core/menus.py:232 -#: aleksis/core/templates/oauth2_provider/application/list.html:5 -#: aleksis/core/templates/oauth2_provider/application/list.html:6 -msgid "OAuth2 Applications" -msgstr "" - -#: aleksis/core/menus.py:245 -msgid "People" -msgstr "" - -#: aleksis/core/menus.py:276 aleksis/core/models.py:1055 -#: aleksis/core/templates/core/group_type/list.html:8 -#: aleksis/core/templates/core/group_type/list.html:9 -msgid "Group types" -msgstr "" - -#: aleksis/core/menus.py:287 -msgid "Groups and child groups" -msgstr "" - -#: aleksis/core/menus.py:298 aleksis/core/models.py:510 -#: aleksis/core/templates/core/additional_field/list.html:8 -#: aleksis/core/templates/core/additional_field/list.html:9 -msgid "Additional fields" -msgstr "" - -#: aleksis/core/menus.py:309 -msgid "Invite person" -msgstr "" - -#: aleksis/core/menus.py:322 -#: aleksis/core/templates/core/group/child_groups.html:7 -#: aleksis/core/templates/core/group/child_groups.html:9 -msgid "Assign child groups to groups" -msgstr "" - #: aleksis/core/mixins.py:511 msgid "Linked school term" msgstr "" -#: aleksis/core/models.py:71 +#: aleksis/core/models.py:82 msgid "Boolean (Yes/No)" msgstr "" -#: aleksis/core/models.py:72 +#: aleksis/core/models.py:83 msgid "Text (one line)" msgstr "" -#: aleksis/core/models.py:74 +#: aleksis/core/models.py:85 msgid "Date and time" msgstr "" -#: aleksis/core/models.py:75 +#: aleksis/core/models.py:86 msgid "Decimal number" msgstr "" -#: aleksis/core/models.py:76 aleksis/core/models.py:199 +#: aleksis/core/models.py:87 aleksis/core/models.py:210 msgid "E-mail address" msgstr "" -#: aleksis/core/models.py:77 +#: aleksis/core/models.py:88 msgid "Integer" msgstr "" -#: aleksis/core/models.py:78 +#: aleksis/core/models.py:89 msgid "IP address" msgstr "" -#: aleksis/core/models.py:79 +#: aleksis/core/models.py:90 msgid "Boolean or empty (Yes/No/Neither)" msgstr "" -#: aleksis/core/models.py:80 +#: aleksis/core/models.py:91 msgid "Text (multi-line)" msgstr "" -#: aleksis/core/models.py:82 +#: aleksis/core/models.py:93 msgid "URL / Link" msgstr "" -#: aleksis/core/models.py:94 aleksis/core/models.py:1024 +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 msgid "Name" msgstr "" -#: aleksis/core/models.py:96 +#: aleksis/core/models.py:107 msgid "Start date" msgstr "" -#: aleksis/core/models.py:97 +#: aleksis/core/models.py:108 msgid "End date" msgstr "" -#: aleksis/core/models.py:116 +#: aleksis/core/models.py:127 msgid "The start date must be earlier than the end date." msgstr "" -#: aleksis/core/models.py:123 +#: aleksis/core/models.py:134 msgid "There is already a school term for this time or a part of this time." msgstr "" -#: aleksis/core/models.py:152 aleksis/core/models.py:973 +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 msgid "Person" msgstr "" -#: aleksis/core/models.py:155 +#: aleksis/core/models.py:166 msgid "Can view address" msgstr "" -#: aleksis/core/models.py:156 +#: aleksis/core/models.py:167 msgid "Can view contact details" msgstr "" -#: aleksis/core/models.py:157 +#: aleksis/core/models.py:168 msgid "Can view photo" msgstr "" -#: aleksis/core/models.py:158 +#: aleksis/core/models.py:169 msgid "Can view avatar image" msgstr "" -#: aleksis/core/models.py:159 +#: aleksis/core/models.py:170 msgid "Can view persons groups" msgstr "" -#: aleksis/core/models.py:160 +#: aleksis/core/models.py:171 msgid "Can view personal details" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "female" msgstr "" -#: aleksis/core/models.py:170 +#: aleksis/core/models.py:181 msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1227 +#: aleksis/core/models.py:181 +msgid "other" +msgstr "" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:184 +#: aleksis/core/models.py:195 msgid "Additional name(s)" msgstr "" -#: aleksis/core/models.py:188 aleksis/core/models.py:479 +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 msgid "Short name" msgstr "" -#: aleksis/core/models.py:191 +#: aleksis/core/models.py:202 msgid "Street" msgstr "" -#: aleksis/core/models.py:192 +#: aleksis/core/models.py:203 msgid "Street number" msgstr "" -#: aleksis/core/models.py:193 +#: aleksis/core/models.py:204 msgid "Postal code" msgstr "" -#: aleksis/core/models.py:194 +#: aleksis/core/models.py:205 msgid "Place" msgstr "" -#: aleksis/core/models.py:196 aleksis/core/templates/core/person/full.html:172 +#: aleksis/core/models.py:207 msgid "Home phone" msgstr "" -#: aleksis/core/models.py:197 aleksis/core/templates/core/person/full.html:182 +#: aleksis/core/models.py:208 msgid "Mobile phone" msgstr "" -#: aleksis/core/models.py:201 +#: aleksis/core/models.py:212 msgid "Date of birth" msgstr "" -#: aleksis/core/models.py:202 +#: aleksis/core/models.py:213 msgid "Place of birth" msgstr "" -#: aleksis/core/models.py:203 +#: aleksis/core/models.py:214 msgid "Sex" msgstr "" -#: aleksis/core/models.py:210 aleksis/core/models.py:518 +#: aleksis/core/models.py:221 aleksis/core/models.py:550 msgid "This is an official photo, used for official documents and for internal use cases." msgstr "" -#: aleksis/core/models.py:215 aleksis/core/models.py:522 +#: aleksis/core/models.py:226 aleksis/core/models.py:554 msgid "Display picture / Avatar" msgstr "" -#: aleksis/core/models.py:218 aleksis/core/models.py:525 +#: aleksis/core/models.py:229 aleksis/core/models.py:557 msgid "This is a picture or an avatar for public display." msgstr "" -#: aleksis/core/models.py:223 aleksis/core/templates/core/person/full.html:239 +#: aleksis/core/models.py:234 msgid "Guardians / Parents" msgstr "" -#: aleksis/core/models.py:230 +#: aleksis/core/models.py:241 msgid "Primary group" msgstr "" -#: aleksis/core/models.py:233 aleksis/core/models.py:692 -#: aleksis/core/models.py:716 aleksis/core/models.py:801 -#: aleksis/core/models.py:1048 +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 msgid "Description" msgstr "" -#: aleksis/core/models.py:434 +#: aleksis/core/models.py:464 msgid "Title of field" msgstr "" -#: aleksis/core/models.py:436 +#: aleksis/core/models.py:466 msgid "Type of field" msgstr "" -#: aleksis/core/models.py:443 +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "" + +#: aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "" + +#: aleksis/core/models.py:475 msgid "Addtitional field for groups" msgstr "" -#: aleksis/core/models.py:444 +#: aleksis/core/models.py:476 msgid "Addtitional fields for groups" msgstr "" -#: aleksis/core/models.py:464 +#: aleksis/core/models.py:496 msgid "Can assign child groups to groups" msgstr "" -#: aleksis/core/models.py:465 +#: aleksis/core/models.py:497 msgid "Can view statistics about group." msgstr "" -#: aleksis/core/models.py:477 +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 msgid "Long name" msgstr "" -#: aleksis/core/models.py:487 aleksis/core/templates/core/group/full.html:85 +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 msgid "Members" msgstr "" -#: aleksis/core/models.py:490 aleksis/core/templates/core/group/full.html:82 +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 msgid "Owners" msgstr "" -#: aleksis/core/models.py:497 aleksis/core/templates/core/group/full.html:55 +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 msgid "Parent groups" msgstr "" -#: aleksis/core/models.py:505 +#: aleksis/core/models.py:537 msgid "Type of group" msgstr "" -#: aleksis/core/models.py:691 aleksis/core/models.py:715 -#: aleksis/core/models.py:800 +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 #: aleksis/core/templates/core/announcement/list.html:18 msgid "Title" msgstr "" -#: aleksis/core/models.py:694 +#: aleksis/core/models.py:726 msgid "Application" msgstr "" -#: aleksis/core/models.py:700 +#: aleksis/core/models.py:732 msgid "Activity" msgstr "" -#: aleksis/core/models.py:701 +#: aleksis/core/models.py:733 msgid "Activities" msgstr "" -#: aleksis/core/models.py:707 +#: aleksis/core/models.py:739 msgid "Sender" msgstr "" -#: aleksis/core/models.py:712 +#: aleksis/core/models.py:744 msgid "Recipient" msgstr "" -#: aleksis/core/models.py:717 aleksis/core/models.py:1025 +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 msgid "Link" msgstr "" -#: aleksis/core/models.py:719 +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "" + +#: aleksis/core/models.py:757 msgid "Read" msgstr "" -#: aleksis/core/models.py:720 +#: aleksis/core/models.py:758 msgid "Sent" msgstr "" -#: aleksis/core/models.py:733 +#: aleksis/core/models.py:775 msgid "Notification" msgstr "" -#: aleksis/core/models.py:802 +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "" + +#: aleksis/core/models.py:844 msgid "Link to detailed view" msgstr "" -#: aleksis/core/models.py:805 +#: aleksis/core/models.py:847 msgid "Date and time from when to show" msgstr "" -#: aleksis/core/models.py:808 +#: aleksis/core/models.py:850 msgid "Date and time until when to show" msgstr "" -#: aleksis/core/models.py:833 +#: aleksis/core/models.py:875 msgid "Announcement" msgstr "" -#: aleksis/core/models.py:871 +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "" + +#: aleksis/core/models.py:913 msgid "Announcement recipient" msgstr "" -#: aleksis/core/models.py:872 +#: aleksis/core/models.py:914 msgid "Announcement recipients" msgstr "" -#: aleksis/core/models.py:894 +#: aleksis/core/models.py:934 msgid "Widget Title" msgstr "" -#: aleksis/core/models.py:895 +#: aleksis/core/models.py:935 msgid "Activate Widget" msgstr "" -#: aleksis/core/models.py:896 +#: aleksis/core/models.py:936 msgid "Widget is broken" msgstr "" -#: aleksis/core/models.py:899 +#: aleksis/core/models.py:939 msgid "Size on mobile devices" msgstr "" -#: aleksis/core/models.py:900 +#: aleksis/core/models.py:940 msgid "<= 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:905 +#: aleksis/core/models.py:945 msgid "Size on tablet devices" msgstr "" -#: aleksis/core/models.py:906 +#: aleksis/core/models.py:946 msgid "> 600 px, 12 columns" msgstr "" -#: aleksis/core/models.py:911 +#: aleksis/core/models.py:951 msgid "Size on desktop devices" msgstr "" -#: aleksis/core/models.py:912 +#: aleksis/core/models.py:952 msgid "> 992 px, 12 columns" msgstr "" -#: aleksis/core/models.py:917 +#: aleksis/core/models.py:957 msgid "Size on large desktop devices" msgstr "" -#: aleksis/core/models.py:918 +#: aleksis/core/models.py:958 msgid "> 1200 px>, 12 columns" msgstr "" -#: aleksis/core/models.py:949 +#: aleksis/core/models.py:989 msgid "Can edit default dashboard" msgstr "" -#: aleksis/core/models.py:950 +#: aleksis/core/models.py:990 msgid "Dashboard Widget" msgstr "" -#: aleksis/core/models.py:951 +#: aleksis/core/models.py:991 msgid "Dashboard Widgets" msgstr "" -#: aleksis/core/models.py:957 +#: aleksis/core/models.py:997 msgid "URL" msgstr "" -#: aleksis/core/models.py:958 +#: aleksis/core/models.py:998 msgid "Icon URL" msgstr "" -#: aleksis/core/models.py:964 +#: aleksis/core/models.py:1004 msgid "External link widget" msgstr "" -#: aleksis/core/models.py:965 +#: aleksis/core/models.py:1005 msgid "External link widgets" msgstr "" -#: aleksis/core/models.py:970 +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "" + +#: aleksis/core/models.py:1023 msgid "Dashboard widget" msgstr "" -#: aleksis/core/models.py:975 +#: aleksis/core/models.py:1028 msgid "Order" msgstr "" -#: aleksis/core/models.py:976 +#: aleksis/core/models.py:1029 msgid "Part of the default dashboard" msgstr "" -#: aleksis/core/models.py:991 +#: aleksis/core/models.py:1044 msgid "Dashboard widget order" msgstr "" -#: aleksis/core/models.py:992 +#: aleksis/core/models.py:1045 msgid "Dashboard widget orders" msgstr "" -#: aleksis/core/models.py:998 +#: aleksis/core/models.py:1051 msgid "Menu ID" msgstr "" -#: aleksis/core/models.py:1011 +#: aleksis/core/models.py:1064 msgid "Custom menu" msgstr "" -#: aleksis/core/models.py:1012 +#: aleksis/core/models.py:1065 msgid "Custom menus" msgstr "" -#: aleksis/core/models.py:1022 +#: aleksis/core/models.py:1075 msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 -#: aleksis/core/templates/oauth2_provider/application/detail.html:26 -msgid "Icon" -msgstr "" - -#: aleksis/core/models.py:1032 +#: aleksis/core/models.py:1085 msgid "Custom menu item" msgstr "" -#: aleksis/core/models.py:1033 +#: aleksis/core/models.py:1086 msgid "Custom menu items" msgstr "" -#: aleksis/core/models.py:1047 +#: aleksis/core/models.py:1103 msgid "Title of type" msgstr "" -#: aleksis/core/models.py:1054 aleksis/core/templates/core/group/full.html:47 +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 msgid "Group type" msgstr "" -#: aleksis/core/models.py:1068 +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +msgid "Group types" +msgstr "" + +#: aleksis/core/models.py:1124 msgid "Can view system status" msgstr "" -#: aleksis/core/models.py:1069 +#: aleksis/core/models.py:1125 msgid "Can manage data" msgstr "" -#: aleksis/core/models.py:1070 +#: aleksis/core/models.py:1126 msgid "Can impersonate" msgstr "" -#: aleksis/core/models.py:1071 +#: aleksis/core/models.py:1127 msgid "Can use search" msgstr "" -#: aleksis/core/models.py:1072 +#: aleksis/core/models.py:1128 msgid "Can change site preferences" msgstr "" -#: aleksis/core/models.py:1073 +#: aleksis/core/models.py:1129 msgid "Can change person preferences" msgstr "" -#: aleksis/core/models.py:1074 +#: aleksis/core/models.py:1130 msgid "Can change group preferences" msgstr "" -#: aleksis/core/models.py:1075 +#: aleksis/core/models.py:1131 msgid "Can test PDF generation" msgstr "" -#: aleksis/core/models.py:1076 +#: aleksis/core/models.py:1132 msgid "Can invite persons" msgstr "" -#: aleksis/core/models.py:1112 +#: aleksis/core/models.py:1168 msgid "Related data check task" msgstr "" -#: aleksis/core/models.py:1120 +#: aleksis/core/models.py:1176 msgid "Issue solved" msgstr "" -#: aleksis/core/models.py:1121 +#: aleksis/core/models.py:1177 msgid "Notification sent" msgstr "" -#: aleksis/core/models.py:1134 +#: aleksis/core/models.py:1190 msgid "Data check result" msgstr "" -#: aleksis/core/models.py:1135 +#: aleksis/core/models.py:1191 msgid "Data check results" msgstr "" -#: aleksis/core/models.py:1137 +#: aleksis/core/models.py:1193 msgid "Can run data checks" msgstr "" -#: aleksis/core/models.py:1138 +#: aleksis/core/models.py:1194 msgid "Can solve data check problems" msgstr "" -#: aleksis/core/models.py:1145 +#: aleksis/core/models.py:1201 msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1233 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1181 +#: aleksis/core/models.py:1237 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1183 +#: aleksis/core/models.py:1240 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1243 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1192 +#: aleksis/core/models.py:1250 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1251 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1198 +#: aleksis/core/models.py:1256 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1201 +#: aleksis/core/models.py:1259 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1213 +#: aleksis/core/models.py:1263 +msgid "Back URL" +msgstr "" + +#: aleksis/core/models.py:1264 +msgid "Progress title" +msgstr "" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +msgid "Success message" +msgstr "" + +#: aleksis/core/models.py:1267 +msgid "Redirect on success URL" +msgstr "" + +#: aleksis/core/models.py:1269 +msgid "Additional button title" +msgstr "" + +#: aleksis/core/models.py:1271 +msgid "Additional button URL" +msgstr "" + +#: aleksis/core/models.py:1273 +msgid "Additional button icon" +msgstr "" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +msgid "Background task completed successfully" +msgstr "" + +#: aleksis/core/models.py:1301 +msgid "The background task '{}' has been completed successfully." +msgstr "" + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1214 +#: aleksis/core/models.py:1332 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1230 +#: aleksis/core/models.py:1348 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1268 +#: aleksis/core/models.py:1386 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1278 +#: aleksis/core/models.py:1396 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" +#: aleksis/core/models.py:1441 +msgid "Can view room timetable" +msgstr "" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + #: aleksis/core/preferences.py:25 msgid "General" msgstr "" @@ -1054,148 +1033,163 @@ msgstr "" msgid "Channels to use for notifications" msgstr "" -#: aleksis/core/preferences.py:209 +#: aleksis/core/preferences.py:208 +msgid "Select Design" +msgstr "" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 msgid "Regular expression to match primary group, e.g. '^Class .*'" msgstr "" -#: aleksis/core/preferences.py:220 +#: aleksis/core/preferences.py:235 msgid "Field on person to match primary group against" msgstr "" -#: aleksis/core/preferences.py:232 +#: aleksis/core/preferences.py:247 msgid "Automatically create new persons for new users" msgstr "" -#: aleksis/core/preferences.py:241 +#: aleksis/core/preferences.py:256 msgid "Automatically link existing persons to new users by their e-mail address" msgstr "" -#: aleksis/core/preferences.py:252 +#: aleksis/core/preferences.py:267 msgid "Display name of the school" msgstr "" -#: aleksis/core/preferences.py:263 +#: aleksis/core/preferences.py:278 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: aleksis/core/preferences.py:271 +#: aleksis/core/preferences.py:286 msgid "Allow users to change their passwords" msgstr "" -#: aleksis/core/preferences.py:279 +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "" + +#: aleksis/core/preferences.py:302 msgid "Enable signup" msgstr "" -#: aleksis/core/preferences.py:287 +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "" + +#: aleksis/core/preferences.py:318 msgid "Enable invitations" msgstr "" -#: aleksis/core/preferences.py:295 +#: aleksis/core/preferences.py:326 msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" msgstr "" -#: aleksis/core/preferences.py:303 +#: aleksis/core/preferences.py:334 msgid "Size of packets. (Default 5: abcde)" msgstr "" -#: aleksis/core/preferences.py:314 +#: aleksis/core/preferences.py:345 msgid "Allowed Grant Flows for OAuth applications" msgstr "" -#: aleksis/core/preferences.py:328 -msgid "Available languages" -msgstr "" - -#: aleksis/core/preferences.py:341 +#: aleksis/core/preferences.py:358 msgid "Send emails if data checks detect problems" msgstr "" -#: aleksis/core/preferences.py:352 +#: aleksis/core/preferences.py:369 msgid "Email recipients for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:363 +#: aleksis/core/preferences.py:380 msgid "Email recipient groups for data checks problem emails" msgstr "" -#: aleksis/core/preferences.py:372 +#: aleksis/core/preferences.py:389 msgid "Show dashboard to users without login" msgstr "" -#: aleksis/core/preferences.py:381 +#: aleksis/core/preferences.py:398 msgid "Allow users to edit their dashboard" msgstr "" -#: aleksis/core/preferences.py:392 +#: aleksis/core/preferences.py:409 msgid "Fields on person model which are editable by themselves." msgstr "" -#: aleksis/core/preferences.py:407 +#: aleksis/core/preferences.py:424 msgid "Editable fields on person model which should trigger a notification on change" msgstr "" -#: aleksis/core/preferences.py:421 +#: aleksis/core/preferences.py:438 msgid "Contact for notification if a person changes their data" msgstr "" -#: aleksis/core/preferences.py:432 +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "" + +#: aleksis/core/preferences.py:459 msgid "PDF file expiration duration" msgstr "" -#: aleksis/core/preferences.py:433 +#: aleksis/core/preferences.py:460 msgid "in minutes" msgstr "" -#: aleksis/core/preferences.py:443 +#: aleksis/core/preferences.py:470 msgid "Automatically update the dashboard and its widgets" msgstr "" -#: aleksis/core/preferences.py:453 +#: aleksis/core/preferences.py:480 msgid "Automatically update the dashboard and its widgets sitewide" msgstr "" -#: aleksis/core/preferences.py:463 +#: aleksis/core/preferences.py:490 msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:529 +#: aleksis/core/settings.py:539 msgid "English" msgstr "" -#: aleksis/core/settings.py:530 +#: aleksis/core/settings.py:540 msgid "German" msgstr "" -#: aleksis/core/tables.py:24 +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "" + +#: aleksis/core/tables.py:25 #: aleksis/core/templates/core/announcement/list.html:36 -#: aleksis/core/templates/core/group/full.html:24 -#: aleksis/core/templates/core/person/full.html:26 -#: aleksis/core/templates/core/person/full.html:98 +#: aleksis/core/templates/core/group/full.html:26 #: aleksis/core/templates/oauth2_provider/application/detail.html:17 msgid "Edit" msgstr "" -#: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:138 +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" -#: aleksis/core/tables.py:61 aleksis/core/tables.py:62 -#: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:136 +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 #: aleksis/core/templates/core/announcement/list.html:42 -#: aleksis/core/templates/core/group/full.html:31 +#: aleksis/core/templates/core/group/full.html:33 #: aleksis/core/templates/core/pages/delete.html:22 -#: aleksis/core/templates/core/person/full.html:33 -#: aleksis/core/templates/core/person/full.html:105 #: aleksis/core/templates/oauth2_provider/application/detail.html:21 msgid "Delete" msgstr "" #: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 #: aleksis/core/templates/oauth2_provider/authorize.html:54 -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:24 msgid "Error" msgstr "" @@ -1224,7 +1218,7 @@ msgstr "" #: aleksis/core/templates/500.html:10 msgid "" "An unexpected error has\n" -" occured." +" occurred." msgstr "" #: aleksis/core/templates/500.html:13 @@ -1235,6 +1229,10 @@ msgid "" " " msgstr "" +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "" + #: aleksis/core/templates/503.html:10 msgid "" "The maintenance mode is currently enabled. Please try again\n" @@ -1290,6 +1288,17 @@ msgstr "" msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "" + #: aleksis/core/templates/account/password_change.html:12 msgid "Forgot your current password? Click here to reset it:" msgstr "" @@ -1403,6 +1412,11 @@ msgstr "" msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "" + #: aleksis/core/templates/account/signup_closed.html:5 #: aleksis/core/templates/account/signup_closed.html:6 msgid "Signup closed" @@ -1474,7 +1488,7 @@ msgid "Publish new announcement" msgstr "" #: aleksis/core/templates/core/announcement/form.html:34 -msgid "Save und publish announcement" +msgid "Save and publish announcement" msgstr "" #: aleksis/core/templates/core/announcement/list.html:19 @@ -1493,22 +1507,6 @@ msgstr "" msgid "There are no announcements." msgstr "" -#: aleksis/core/templates/core/base.html:78 -msgid "Logged in as" -msgstr "" - -#: aleksis/core/templates/core/base.html:179 -msgid "About AlekSIS® — The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/base.html:187 -msgid "Imprint" -msgstr "" - -#: aleksis/core/templates/core/base.html:195 -msgid "Privacy Policy" -msgstr "" - #: aleksis/core/templates/core/base_print.html:74 msgid "Powered by AlekSIS®" msgstr "" @@ -1538,6 +1536,11 @@ msgstr "" msgid "Edit %(widget)s" msgstr "" +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "" + #: aleksis/core/templates/core/dashboard_widget/list.html:15 msgid "Create dashboard widget" msgstr "" @@ -1553,6 +1556,11 @@ msgstr "" msgid "Edit default dashboard" msgstr "" +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "" + #: aleksis/core/templates/core/data_check/list.html:15 msgid "Check data again" msgstr "" @@ -1646,6 +1654,11 @@ msgstr "" msgid "Default dashboard" msgstr "" +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "" + #: aleksis/core/templates/core/group/child_groups.html:18 msgid "" "\n" @@ -1724,34 +1737,32 @@ msgstr "" msgid "Edit group" msgstr "" -#: aleksis/core/templates/core/group/full.html:38 -#: aleksis/core/templates/core/person/full.html:40 -#: aleksis/core/templates/core/person/full.html:112 +#: aleksis/core/templates/core/group/full.html:40 msgid "Change preferences" msgstr "" -#: aleksis/core/templates/core/group/full.html:64 +#: aleksis/core/templates/core/group/full.html:68 msgid "Statistics" msgstr "" -#: aleksis/core/templates/core/group/full.html:67 +#: aleksis/core/templates/core/group/full.html:73 msgid "Count of members" msgstr "" -#: aleksis/core/templates/core/group/full.html:71 +#: aleksis/core/templates/core/group/full.html:81 msgid "Average age" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 +#: aleksis/core/templates/core/group/full.html:90 msgid "Age range" msgstr "" -#: aleksis/core/templates/core/group/full.html:76 -msgid "years to" -msgstr "" - -#: aleksis/core/templates/core/group/full.html:76 -msgid "years " +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " msgstr "" #: aleksis/core/templates/core/group/list.html:14 @@ -1784,7 +1795,7 @@ msgstr "" msgid "Home" msgstr "" -#: aleksis/core/templates/core/index.html:49 +#: aleksis/core/templates/core/index.html:34 msgid "" "\n" " You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" @@ -1792,101 +1803,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/index.html:59 +#: aleksis/core/templates/core/index.html:44 msgid "Last activities" msgstr "" -#: aleksis/core/templates/core/index.html:77 +#: aleksis/core/templates/core/index.html:62 msgid "No activities available yet." msgstr "" -#: aleksis/core/templates/core/index.html:82 -msgid "Recent notifications" -msgstr "" - -#: aleksis/core/templates/core/index.html:98 -#: aleksis/core/templates/core/notifications.html:23 -msgid "More information →" -msgstr "" - -#: aleksis/core/templates/core/index.html:105 -#: aleksis/core/templates/core/notifications.html:30 -msgid "No notifications available yet." -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:6 -msgid "About AlekSIS®" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:7 -msgid "AlekSIS® – The Free School Information System" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:15 -msgid "About AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:17 -msgid "" -"\n" -" This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" -" to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" -" can be used by anyone.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:24 -msgid "" -"\n" -" AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:30 -msgid "Website of AlekSIS" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:31 -msgid "Source code" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:40 -msgid "Licence information" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:42 -msgid "" -"\n" -" The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" -" information from third-party apps, if installed, refer to the respective components below. The\n" -" licences are marked like this:\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:50 -msgid "Free/Open Source Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:51 -msgid "Other Licence" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:55 -msgid "Full licence text" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:56 -msgid "More information about the EUPL" -msgstr "" - -#: aleksis/core/templates/core/pages/about.html:95 -#, python-format -msgid "" -"\n" -" This app is licenced under %(licence)s.\n" -" " -msgstr "" - #: aleksis/core/templates/core/pages/delete.html:6 #, python-format msgid "Delete %(object_name)s" @@ -1900,99 +1824,92 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/pages/progress.html:27 -msgid "" -"\n" -" Without activated JavaScript the progress status can't be updated.\n" -" " -msgstr "" - -#: aleksis/core/templates/core/pages/progress.html:47 -#: aleksis/core/templates/two_factor/core/otp_required.html:19 -msgid "Go back" +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" msgstr "" #: aleksis/core/templates/core/pages/system_status.html:12 msgid "System checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:21 +#: aleksis/core/templates/core/pages/system_status.html:22 msgid "Maintenance mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:23 +#: aleksis/core/templates/core/pages/system_status.html:24 msgid "" "\n" -" Only admin and visitors from internal IPs can access thesite.\n" +" Only admin and visitors from internal IPs can access the site.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:34 +#: aleksis/core/templates/core/pages/system_status.html:36 msgid "Maintenance mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:35 +#: aleksis/core/templates/core/pages/system_status.html:37 msgid "Everyone can access the site." msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:45 +#: aleksis/core/templates/core/pages/system_status.html:47 msgid "Debug mode enabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:47 +#: aleksis/core/templates/core/pages/system_status.html:49 msgid "" "\n" " The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:54 +#: aleksis/core/templates/core/pages/system_status.html:56 msgid "Debug mode disabled" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:56 +#: aleksis/core/templates/core/pages/system_status.html:58 msgid "" "\n" " Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:69 +#: aleksis/core/templates/core/pages/system_status.html:71 msgid "System health checks" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:75 +#: aleksis/core/templates/core/pages/system_status.html:77 msgid "Service" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:76 -#: aleksis/core/templates/core/pages/system_status.html:115 +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 msgid "Status" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:77 +#: aleksis/core/templates/core/pages/system_status.html:79 msgid "Time taken" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:96 +#: aleksis/core/templates/core/pages/system_status.html:100 msgid "seconds" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:107 +#: aleksis/core/templates/core/pages/system_status.html:111 msgid "Celery task results" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:112 +#: aleksis/core/templates/core/pages/system_status.html:116 #: aleksis/core/templates/templated_email/celery_failure.email:9 #: aleksis/core/templates/templated_email/celery_failure.email:28 msgid "Task" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:113 +#: aleksis/core/templates/core/pages/system_status.html:117 msgid "ID" msgstr "" -#: aleksis/core/templates/core/pages/system_status.html:114 +#: aleksis/core/templates/core/pages/system_status.html:118 msgid "Date done" msgstr "" @@ -2033,37 +1950,29 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Changed by" -msgstr "" - -#: aleksis/core/templates/core/partials/crud_events.html:15 -msgid "Unknown" +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:15 -msgid "Language" +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" msgstr "" -#: aleksis/core/templates/core/partials/language_form.html:27 -msgid "Select language" +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:12 -msgid "" -"\n" -" Your administrator account is not linked to any person. Therefore,\n" -" a dummy person has been linked to your account.\n" -" " +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" msgstr "" -#: aleksis/core/templates/core/partials/no_person.html:19 +#: aleksis/core/templates/core/partials/splash_screen.html:11 msgid "" "\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " msgstr "" #: aleksis/core/templates/core/perms/assign.html:12 @@ -2079,6 +1988,11 @@ msgstr "" msgid "Assign" msgstr "" +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "" + #: aleksis/core/templates/core/perms/list.html:21 msgid "Assign a new permission" msgstr "" @@ -2122,28 +2036,6 @@ msgstr "" msgid "Edit person" msgstr "" -#: aleksis/core/templates/core/person/full.html:47 -#: aleksis/core/templates/core/person/full.html:119 -msgid "Impersonate" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:54 -#: aleksis/core/templates/core/person/full.html:126 -msgid "Invite user" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:133 -msgid "Contact details" -msgstr "" - -#: aleksis/core/templates/core/person/full.html:224 -msgid "This person didn't upload a personal photo." -msgstr "" - -#: aleksis/core/templates/core/person/full.html:232 -msgid "Children" -msgstr "" - #: aleksis/core/templates/core/person/list.html:21 msgid "Filter persons" msgstr "" @@ -2163,6 +2055,10 @@ msgstr "" msgid "Edit school term" msgstr "" +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "" + #: aleksis/core/templates/dynamic_preferences/form.html:9 msgid "Site preferences" msgstr "" @@ -2196,6 +2092,10 @@ msgstr "" msgid "site preferences page" msgstr "" +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2284,6 +2184,11 @@ msgstr "" msgid "Edit OAuth2 Application" msgstr "" +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/application/list.html:11 msgid "Register new application" msgstr "" @@ -2315,14 +2220,6 @@ msgstr "" msgid "Disallow" msgstr "" -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:12 -msgid "Success!" -msgstr "" - -#: aleksis/core/templates/oauth2_provider/authorized-oob.html:14 -msgid "Please return to your application and enter this code:" -msgstr "" - #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 #: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 @@ -2337,6 +2234,11 @@ msgstr "" msgid "Revoke" msgstr "" +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "" + #: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 msgid "No authorized applications." msgstr "" @@ -2345,16 +2247,14 @@ msgstr "" msgid "Network error" msgstr "" -#: aleksis/core/templates/offline.html:8 -msgid "" -"No internet\n" -" connection." +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." msgstr "" -#: aleksis/core/templates/offline.html:12 +#: aleksis/core/templates/offline.html:14 msgid "" "\n" -" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" " administrators:\n" " " @@ -2595,7 +2495,7 @@ msgstr "" #: aleksis/core/templates/two_factor/_base_focus.html:6 #: aleksis/core/templates/two_factor/core/otp_required.html:22 #: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:87 +#: aleksis/core/templates/two_factor/profile/profile.html:88 msgid "Enable Two-Factor Authentication" msgstr "" @@ -2635,6 +2535,12 @@ msgstr "" msgid "Generate Tokens" msgstr "" +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "" + #: aleksis/core/templates/two_factor/core/login.html:27 #, python-format msgid "Login for %(name)s" @@ -2699,15 +2605,15 @@ msgstr "" msgid "Or, alternatively, use one of your backup phones:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:121 +#: aleksis/core/templates/two_factor/core/login.html:122 msgid "As a last resort, you can use a backup token:" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:124 +#: aleksis/core/templates/two_factor/core/login.html:125 msgid "Use Backup Token" msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:135 +#: aleksis/core/templates/two_factor/core/login.html:136 msgid "Use alternative login options" msgstr "" @@ -2729,6 +2635,10 @@ msgid "" " security." msgstr "" +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + #: aleksis/core/templates/two_factor/core/phone_register.html:5 #: aleksis/core/templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" @@ -2944,184 +2854,176 @@ msgid "" " " msgstr "" -#: aleksis/core/util/notifications.py:63 +#: aleksis/core/util/notifications.py:64 msgid "E-Mail" msgstr "" -#: aleksis/core/util/notifications.py:64 +#: aleksis/core/util/notifications.py:65 msgid "SMS" msgstr "" -#: aleksis/core/util/pdf.py:118 +#: aleksis/core/util/pdf.py:151 msgid "Progress: Generate PDF file" msgstr "" -#: aleksis/core/util/pdf.py:119 +#: aleksis/core/util/pdf.py:152 msgid "Generating PDF file …" msgstr "" -#: aleksis/core/util/pdf.py:120 +#: aleksis/core/util/pdf.py:153 msgid "The PDF file has been generated successfully." msgstr "" -#: aleksis/core/util/pdf.py:121 +#: aleksis/core/util/pdf.py:154 msgid "There was a problem while generating the PDF file." msgstr "" -#: aleksis/core/util/pdf.py:124 +#: aleksis/core/util/pdf.py:157 msgid "Download PDF" msgstr "" -#: aleksis/core/views.py:285 +#: aleksis/core/views.py:278 msgid "The school term has been created." msgstr "" -#: aleksis/core/views.py:297 +#: aleksis/core/views.py:290 msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:417 +#: aleksis/core/views.py:394 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:436 aleksis/core/views.py:446 +#: aleksis/core/views.py:413 aleksis/core/views.py:423 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:496 +#: aleksis/core/views.py:473 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:593 +#: aleksis/core/views.py:556 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:609 +#: aleksis/core/views.py:572 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:677 +#: aleksis/core/views.py:641 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:696 +#: aleksis/core/views.py:660 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:720 +#: aleksis/core/views.py:684 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:734 +#: aleksis/core/views.py:698 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:766 -msgid "The additional_field has been saved." +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." msgstr "" -#: aleksis/core/views.py:800 +#: aleksis/core/views.py:765 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:825 +#: aleksis/core/views.py:790 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:855 +#: aleksis/core/views.py:821 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:856 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:889 +#: aleksis/core/views.py:857 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:890 +#: aleksis/core/views.py:858 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:891 +#: aleksis/core/views.py:859 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:907 +#: aleksis/core/views.py:876 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:917 +#: aleksis/core/views.py:886 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:949 +#: aleksis/core/views.py:919 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:979 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:989 +#: aleksis/core/views.py:959 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1060 +#: aleksis/core/views.py:1030 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1062 +#: aleksis/core/views.py:1032 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1138 +#: aleksis/core/views.py:1103 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1229 +#: aleksis/core/views.py:1200 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1239 +#: aleksis/core/views.py:1210 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1249 +#: aleksis/core/views.py:1220 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1259 +#: aleksis/core/views.py:1230 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1269 +#: aleksis/core/views.py:1240 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1337 -msgid "The requested PDF file does not exist" -msgstr "" - -#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 -msgid "The requested task does not exist or is not accessible" -msgstr "" - -#: aleksis/core/views.py:1388 +#: aleksis/core/views.py:1349 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1395 +#: aleksis/core/views.py:1356 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1466 +#: aleksis/core/views.py:1432 msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1477 +#: aleksis/core/views.py:1443 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po index dfec73c5c894d3d686092593be9c21a811cd0535..726d9cab18b9d431a74d68ffb2df35db6aff97b5 100644 --- a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -28,7 +28,3 @@ msgstr "" #: aleksis/core/static/js/main.js:68 msgid "OK" msgstr "" - -#: aleksis/core/static/js/main.js:191 -msgid "This page may contain outdated information since there is no internet connection." -msgstr "" diff --git a/aleksis/core/locale/uk/LC_MESSAGES/django.po b/aleksis/core/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000000000000000000000000000000000000..f116a864f4022f2a361945644150f4facd23e6f9 --- /dev/null +++ b/aleksis/core/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,3617 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" +"PO-Revision-Date: 2022-07-03 06:14+0000\n" +"Last-Translator: Serhii Horichenko <m@sgg.im>\n" +"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/aleksis-core/uk/>\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"X-Generator: Weblate 4.12.1\n" + +#: aleksis/core/apps.py:155 +msgid "OpenID Connect scope" +msgstr "Межа дії OpenID Connect" + +#: aleksis/core/apps.py:156 +msgid "Given name, family name, link to profile and picture if existing." +msgstr "Ім'Ñ, прізвище, поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° профіль та фото, Ñкщо Ñ” в наÑвноÑті." + +#: aleksis/core/apps.py:157 +msgid "Full home postal address" +msgstr "Повна Ð´Ð¾Ð¼Ð°ÑˆÐ½Ñ Ð¿Ð¾ÑˆÑ‚Ð¾Ð²Ð° адреÑа" + +#: aleksis/core/apps.py:158 +msgid "Email address" +msgstr "Ел.адреÑа" + +#: aleksis/core/apps.py:159 +msgid "Home and mobile phone" +msgstr "Домашній та мобільний телефони" + +#: aleksis/core/apps.py:160 aleksis/core/forms.py:220 +#: aleksis/core/models.py:494 aleksis/core/templates/core/group/list.html:8 +#: aleksis/core/templates/core/group/list.html:9 +msgid "Groups" +msgstr "Групи" + +#: aleksis/core/data_checks.py:60 +msgid "Ignore problem" +msgstr "Ігнорувати проблему" + +#: aleksis/core/data_checks.py:188 +#, python-brace-format +msgid "Solve option '{solve_option_obj.verbose_name}' " +msgstr "Варіант розв'ÑÐ·Ð°Ð½Ð½Ñ '{solve_option_obj.verbose_name}' " + +#: aleksis/core/data_checks.py:284 +msgid "Deactivate DashboardWidget" +msgstr "Вимкнути віджет інформпанелі" + +#: aleksis/core/data_checks.py:296 +msgid "Ensure that there are no broken DashboardWidgets." +msgstr "ПереконайтеÑÑ Ñƒ відÑутноÑті збійних віджетів на інформпанелі." + +#: aleksis/core/data_checks.py:297 +msgid "The DashboardWidget was reported broken automatically." +msgstr "Віджет інформпанелі повідомив про збій в автоматичному режимі." + +#: aleksis/core/data_checks.py:320 +#, python-format +msgid "Validate field %s of model %s." +msgstr "Перевірте поле %s моделі %s." + +#: aleksis/core/data_checks.py:322 +#, python-format +msgid "The field %s couldn't be validated successfully." +msgstr "Поле %s не вдалоÑÑ ÑƒÑпішно перевірити." + +#: aleksis/core/filters.py:42 aleksis/core/templates/core/group/list.html:20 +#: aleksis/core/templates/core/person/list.html:24 +#: aleksis/core/templates/search/search.html:7 +#: aleksis/core/templates/search/search.html:22 +msgid "Search" +msgstr "Пошук" + +#: aleksis/core/filters.py:59 +msgid "Search by name" +msgstr "Пошук за ім'Ñм" + +#: aleksis/core/filters.py:71 +msgid "Search by contact details" +msgstr "Пошук за контактними даними" + +#: aleksis/core/filters.py:92 +msgid "Permission" +msgstr "Дозвіл" + +#: aleksis/core/filters.py:100 +msgid "Content type" +msgstr "Тип зміÑту" + +#: aleksis/core/filters.py:113 aleksis/core/models.py:720 +msgid "User" +msgstr "КориÑтувач" + +#: aleksis/core/filters.py:135 aleksis/core/models.py:493 +msgid "Group" +msgstr "Група" + +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 +msgid "Base data" +msgstr "ОÑновні дані" + +#: aleksis/core/forms.py:55 aleksis/core/tables.py:47 +msgid "Address" +msgstr "ÐдреÑа" + +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 +msgid "Contact data" +msgstr "Контактні дані" + +#: aleksis/core/forms.py:58 +msgid "Advanced personal data" +msgstr "Додаткові оÑобиÑті дані" + +#: aleksis/core/forms.py:106 +msgid "New user" +msgstr "Ðовий кориÑтувач" + +#: aleksis/core/forms.py:106 +msgid "Create a new account" +msgstr "Створити новий обліковий запиÑ" + +#: aleksis/core/forms.py:132 +msgid "You cannot set a new username when also selecting an existing user." +msgstr "Обравши вже Ñ–Ñнуючого кориÑтувача неможливо Ñтворити новий логін." + +#: aleksis/core/forms.py:136 +msgid "This username is already in use." +msgstr "Такий логін вже зайнÑтий." + +#: aleksis/core/forms.py:153 aleksis/core/models.py:141 +msgid "School term" +msgstr "Ðавчальний рік" + +#: aleksis/core/forms.py:154 +msgid "Common data" +msgstr "Загальні дані" + +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 +#: aleksis/core/models.py:164 aleksis/core/templates/core/person/list.html:8 +#: aleksis/core/templates/core/person/list.html:9 +msgid "Persons" +msgstr "ОÑоби" + +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 +msgid "Additional data" +msgstr "Додаткові дані" + +#: aleksis/core/forms.py:157 aleksis/core/models.py:217 +#: aleksis/core/models.py:546 aleksis/core/tables.py:46 +msgid "Photo" +msgstr "Фото" + +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 +#: aleksis/core/models.py:84 +msgid "Date" +msgstr "Дата" + +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 +#: aleksis/core/models.py:92 +msgid "Time" +msgstr "ЧаÑ" + +#: aleksis/core/forms.py:233 +msgid "From when until when should the announcement be displayed?" +msgstr "З Ñкого по Ñкий Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ відображатиÑÑ Ñ†Ðµ оголошеннÑ?" + +#: aleksis/core/forms.py:236 +msgid "Who should see the announcement?" +msgstr "Хто повинен бачити це оголошеннÑ?" + +#: aleksis/core/forms.py:237 +msgid "Write your announcement:" +msgstr "Складіть Ñвоє оголошенÑ:" + +#: aleksis/core/forms.py:276 +msgid "You are not allowed to create announcements which are only valid in the past." +msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ð¸Ð½ÑƒÐ»Ð¾Ð³Ð¾ Вам Ñтворювати не дозволено." + +#: aleksis/core/forms.py:280 +msgid "The from date and time must be earlier then the until date and time." +msgstr "Дата Ñ– Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ повинні бути раніше за дату Ñ– Ñ‡Ð°Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ." + +#: aleksis/core/forms.py:289 +msgid "You need at least one recipient." +msgstr "Вам потрібен принаймні один отримувач." + +#: aleksis/core/forms.py:398 +msgid "Invitation code" +msgstr "Код запрошеннÑ" + +#: aleksis/core/forms.py:399 +msgid "Please enter your invitation code." +msgstr "Ðапишіть, будь лаÑка, Ñвій код запрошеннÑ." + +#: aleksis/core/forms.py:418 aleksis/core/models.py:192 +msgid "First name" +msgstr "Ім'Ñ" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:193 +msgid "Last name" +msgstr "Прізвище" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "Цією ел.адреÑою хтоÑÑŒ кориÑтуєтьÑÑ" + +#: aleksis/core/forms.py:456 +msgid "Who should get the permission?" +msgstr "Хто повинен отримати такий дозвіл?" + +#: aleksis/core/forms.py:457 +msgid "On what?" +msgstr "Ð’ разі чого?" + +#: aleksis/core/forms.py:483 +msgid "Select objects which the permission should be granted for:" +msgstr "Оберіть об'єкти, до Ñких буде наданий дозвіл:" + +#: aleksis/core/forms.py:486 +msgid "Grant the permission for all objects" +msgstr "Ðадати дозвіл до вÑÑ–Ñ… об'єктів" + +#: aleksis/core/forms.py:494 +msgid "You must select at least one group or person which should get the permission." +msgstr "Ви повинні обрати принаймні одну групу або оÑобу, хто буде мати дозвіл." + +#: aleksis/core/forms.py:499 +#, fuzzy +#| msgid "You must grant the permission to all objects and/or to some objects." +msgid "You must grant the permission to all objects or to specific objects." +msgstr "Ви повинні надати дозвіл до вÑÑ–Ñ… та/або до деÑких об'єктів." + +#: aleksis/core/forms.py:586 +msgid "Address data" +msgstr "Дані адреÑи" + +#: aleksis/core/forms.py:598 +msgid "Account data" +msgstr "Дані облікового запиÑу" + +#: aleksis/core/forms.py:605 +msgid "Password" +msgstr "Пароль" + +#: aleksis/core/forms.py:608 +msgid "Password (again)" +msgstr "Пароль (ще раз)" + +#: aleksis/core/forms.py:761 +msgid "The selected action does not exist." +msgstr "Обрана Ð´Ñ–Ñ Ð½Ðµ Ñ–Ñнує." + +#: aleksis/core/forms.py:772 +msgid "You do not have permission to run {} on all selected objects." +msgstr "У Ð’Ð°Ñ Ð²Ñ–Ð´Ñутній дозвіл на запуÑк {} на уÑÑ–Ñ… обраних об'єктах." + +#: aleksis/core/forms.py:828 +msgid "No valid selection." +msgstr "Ðеправильний вибір." + +#: aleksis/core/health_checks.py:21 +msgid "There are unresolved data problems." +msgstr "ІÑнують нерозв'Ñзані проблеми з даними." + +#: aleksis/core/health_checks.py:40 +msgid "Error accessing backup storage: {}" +msgstr "Помилка доÑтупу до резервного Ñховища: {}" + +#: aleksis/core/health_checks.py:50 +msgid "Last backup {}!" +msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð° ÐºÐ¾Ð¿Ñ–Ñ {}!" + +#: aleksis/core/health_checks.py:52 +msgid "No backup found!" +msgstr "Резервна ÐºÐ¾Ð¿Ñ–Ñ Ð½Ðµ знайдена!" + +#: aleksis/core/health_checks.py:79 +msgid "No backup result found!" +msgstr "Результат резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ðµ знайдений!" + +#: aleksis/core/mixins.py:511 +msgid "Linked school term" +msgstr "Пов'Ñзаний навчальний рік" + +#: aleksis/core/models.py:82 +msgid "Boolean (Yes/No)" +msgstr "Логічне (Так/ÐÑ–)" + +#: aleksis/core/models.py:83 +msgid "Text (one line)" +msgstr "ТекÑÑ‚ (один Ñ€Ñдок)" + +#: aleksis/core/models.py:85 +msgid "Date and time" +msgstr "Дата Ñ– чаÑ" + +#: aleksis/core/models.py:86 +msgid "Decimal number" +msgstr "ДеÑÑтичне чиÑло" + +#: aleksis/core/models.py:87 aleksis/core/models.py:210 +msgid "E-mail address" +msgstr "ÐдреÑа ел.пошти" + +#: aleksis/core/models.py:88 +msgid "Integer" +msgstr "Ціле" + +#: aleksis/core/models.py:89 +msgid "IP address" +msgstr "IP адреÑа" + +#: aleksis/core/models.py:90 +msgid "Boolean or empty (Yes/No/Neither)" +msgstr "Логічне або порожнє (Так/ÐÑ–/Ðічого)" + +#: aleksis/core/models.py:91 +msgid "Text (multi-line)" +msgstr "ТекÑÑ‚ (багаторÑдковий)" + +#: aleksis/core/models.py:93 +msgid "URL / Link" +msgstr "URL / ПоÑиланнÑ" + +#: aleksis/core/models.py:105 aleksis/core/models.py:1077 +msgid "Name" +msgstr "Повне ім'Ñ" + +#: aleksis/core/models.py:107 +msgid "Start date" +msgstr "Дата початку" + +#: aleksis/core/models.py:108 +msgid "End date" +msgstr "Дата закінченнÑ" + +#: aleksis/core/models.py:127 +msgid "The start date must be earlier than the end date." +msgstr "Початкова дата повинна бути раніше кінцевої." + +#: aleksis/core/models.py:134 +msgid "There is already a school term for this time or a part of this time." +msgstr "Ðа цей Ñ‡Ð°Ñ Ð°Ð±Ð¾ на чаÑтину цього чаÑу вже припадає навчальний рік." + +#: aleksis/core/models.py:142 +#: aleksis/core/templates/core/school_term/list.html:8 +#: aleksis/core/templates/core/school_term/list.html:9 +msgid "School terms" +msgstr "Ðавчальний рік" + +#: aleksis/core/models.py:163 aleksis/core/models.py:1026 +msgid "Person" +msgstr "ОÑоба" + +#: aleksis/core/models.py:166 +msgid "Can view address" +msgstr "Може бачити адреÑу" + +#: aleksis/core/models.py:167 +msgid "Can view contact details" +msgstr "Може бачити контактні дані" + +#: aleksis/core/models.py:168 +msgid "Can view photo" +msgstr "Може бачити фото" + +#: aleksis/core/models.py:169 +msgid "Can view avatar image" +msgstr "Може бачити аватар" + +#: aleksis/core/models.py:170 +msgid "Can view persons groups" +msgstr "Може бачити групи оÑоби" + +#: aleksis/core/models.py:171 +msgid "Can view personal details" +msgstr "Може бачити оÑобиÑті дані" + +#: aleksis/core/models.py:181 +msgid "female" +msgstr "жін" + +#: aleksis/core/models.py:181 +msgid "male" +msgstr "чол" + +#: aleksis/core/models.py:181 +msgid "other" +msgstr "інший" + +#: aleksis/core/models.py:189 aleksis/core/models.py:1345 +msgid "Linked user" +msgstr "Пов'Ñзаний кориÑтувач" + +#: aleksis/core/models.py:195 +msgid "Additional name(s)" +msgstr "Додаткові імена" + +#: aleksis/core/models.py:199 aleksis/core/models.py:511 +#: aleksis/core/models.py:1431 +msgid "Short name" +msgstr "Коротке ім'Ñ" + +#: aleksis/core/models.py:202 +msgid "Street" +msgstr "ВулицÑ" + +#: aleksis/core/models.py:203 +msgid "Street number" +msgstr "Ðомер будинку" + +#: aleksis/core/models.py:204 +msgid "Postal code" +msgstr "Поштовий індекÑ" + +#: aleksis/core/models.py:205 +msgid "Place" +msgstr "МіÑто" + +#: aleksis/core/models.py:207 +msgid "Home phone" +msgstr "Домашній телефон" + +#: aleksis/core/models.py:208 +msgid "Mobile phone" +msgstr "Мобільний телефон" + +#: aleksis/core/models.py:212 +msgid "Date of birth" +msgstr "Дата народженнÑ" + +#: aleksis/core/models.py:213 +msgid "Place of birth" +msgstr "МіÑце народженнÑ" + +#: aleksis/core/models.py:214 +msgid "Sex" +msgstr "Стать" + +#: aleksis/core/models.py:221 aleksis/core/models.py:550 +msgid "This is an official photo, used for official documents and for internal use cases." +msgstr "Це офіційне фото, Ñке викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² та внутрішніх потреб." + +#: aleksis/core/models.py:226 aleksis/core/models.py:554 +msgid "Display picture / Avatar" +msgstr "Відобразити фото/аватар" + +#: aleksis/core/models.py:229 aleksis/core/models.py:557 +msgid "This is a picture or an avatar for public display." +msgstr "Це фото або аватар Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ відображеннÑ." + +#: aleksis/core/models.py:234 +msgid "Guardians / Parents" +msgstr "Опікуни / батьки" + +#: aleksis/core/models.py:241 +msgid "Primary group" +msgstr "ОÑновна група" + +#: aleksis/core/models.py:244 aleksis/core/models.py:724 +#: aleksis/core/models.py:748 aleksis/core/models.py:843 +#: aleksis/core/models.py:1104 +msgid "Description" +msgstr "ОпиÑ" + +#: aleksis/core/models.py:464 +msgid "Title of field" +msgstr "Ðазва полÑ" + +#: aleksis/core/models.py:466 +msgid "Type of field" +msgstr "Тип полÑ" + +#: aleksis/core/models.py:468 +msgid "Required" +msgstr "Ðеобхідне" + +#: aleksis/core/models.py:469 +msgid "Help text / description" +msgstr "Допоміжний текÑÑ‚/опиÑ" + +#: aleksis/core/models.py:475 +msgid "Addtitional field for groups" +msgstr "Додаткове поле Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿" + +#: aleksis/core/models.py:476 +msgid "Addtitional fields for groups" +msgstr "Додаткові Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿" + +#: aleksis/core/models.py:496 +msgid "Can assign child groups to groups" +msgstr "Може призначати підлеглі групи до груп" + +#: aleksis/core/models.py:497 +msgid "Can view statistics about group." +msgstr "Може бачити ÑтатиÑтику групи." + +#: aleksis/core/models.py:509 aleksis/core/models.py:1432 +msgid "Long name" +msgstr "Довге ім'Ñ" + +#: aleksis/core/models.py:519 aleksis/core/templates/core/group/full.html:105 +msgid "Members" +msgstr "УчаÑники" + +#: aleksis/core/models.py:522 aleksis/core/templates/core/group/full.html:102 +msgid "Owners" +msgstr "ВлаÑники" + +#: aleksis/core/models.py:529 aleksis/core/templates/core/group/full.html:59 +msgid "Parent groups" +msgstr "БатьківÑькі групи" + +#: aleksis/core/models.py:537 +msgid "Type of group" +msgstr "Тип групи" + +#: aleksis/core/models.py:542 +#: aleksis/core/templates/core/additional_field/list.html:8 +#: aleksis/core/templates/core/additional_field/list.html:9 +msgid "Additional fields" +msgstr "Додаткові полÑ" + +#: aleksis/core/models.py:723 aleksis/core/models.py:747 +#: aleksis/core/models.py:842 aleksis/core/models.py:1262 +#: aleksis/core/templates/core/announcement/list.html:18 +msgid "Title" +msgstr "Ðазва" + +#: aleksis/core/models.py:726 +msgid "Application" +msgstr "Додаток" + +#: aleksis/core/models.py:732 +msgid "Activity" +msgstr "ÐктивніÑть" + +#: aleksis/core/models.py:733 +msgid "Activities" +msgstr "ÐктивноÑті" + +#: aleksis/core/models.py:739 +msgid "Sender" +msgstr "Відправник" + +#: aleksis/core/models.py:744 +msgid "Recipient" +msgstr "Отримувач" + +#: aleksis/core/models.py:749 aleksis/core/models.py:1078 +msgid "Link" +msgstr "ПоÑиланнÑ" + +#: aleksis/core/models.py:752 aleksis/core/models.py:1079 +#: aleksis/core/models.py:1392 +#: aleksis/core/templates/oauth2_provider/application/detail.html:26 +msgid "Icon" +msgstr "Іконка" + +#: aleksis/core/models.py:755 +msgid "Send notification at" +msgstr "ÐадіÑлати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾" + +#: aleksis/core/models.py:757 +msgid "Read" +msgstr "Читати" + +#: aleksis/core/models.py:758 +msgid "Sent" +msgstr "ÐадіÑлано" + +#: aleksis/core/models.py:775 +msgid "Notification" +msgstr "СповіщеннÑ" + +#: aleksis/core/models.py:776 aleksis/core/preferences.py:29 +msgid "Notifications" +msgstr "СповіщеннÑ" + +#: aleksis/core/models.py:844 +msgid "Link to detailed view" +msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° детальний переглÑд" + +#: aleksis/core/models.py:847 +msgid "Date and time from when to show" +msgstr "Дата Ñ– чаÑ, з Ñкого показувати" + +#: aleksis/core/models.py:850 +msgid "Date and time until when to show" +msgstr "Дата Ñ– чаÑ, до Ñкого показувати" + +#: aleksis/core/models.py:875 +msgid "Announcement" +msgstr "ОголошеннÑ" + +#: aleksis/core/models.py:876 +#: aleksis/core/templates/core/announcement/list.html:7 +#: aleksis/core/templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "ОголошеннÑ" + +#: aleksis/core/models.py:913 +msgid "Announcement recipient" +msgstr "Отримувач оголошеннÑ" + +#: aleksis/core/models.py:914 +msgid "Announcement recipients" +msgstr "Отримувачі оголошеннÑ" + +#: aleksis/core/models.py:934 +msgid "Widget Title" +msgstr "Ðазва віджета" + +#: aleksis/core/models.py:935 +msgid "Activate Widget" +msgstr "Ðктивувати віджет" + +#: aleksis/core/models.py:936 +msgid "Widget is broken" +msgstr "Віджет зламавÑÑ" + +#: aleksis/core/models.py:939 +msgid "Size on mobile devices" +msgstr "Розмір на мобільних" + +#: aleksis/core/models.py:940 +msgid "<= 600 px, 12 columns" +msgstr "<= 600 пікÑ, 12 Ñтовпчиків" + +#: aleksis/core/models.py:945 +msgid "Size on tablet devices" +msgstr "Розмір на планшетах" + +#: aleksis/core/models.py:946 +msgid "> 600 px, 12 columns" +msgstr "> 600 пікÑ, 12 Ñтовпчиків" + +#: aleksis/core/models.py:951 +msgid "Size on desktop devices" +msgstr "Розмір на ПК" + +#: aleksis/core/models.py:952 +msgid "> 992 px, 12 columns" +msgstr "> 992 пікÑ, 12 Ñтовпчиків" + +#: aleksis/core/models.py:957 +msgid "Size on large desktop devices" +msgstr "Розмір на великих екранах" + +#: aleksis/core/models.py:958 +msgid "> 1200 px>, 12 columns" +msgstr "> 1200 пікÑ, 12 Ñтовпчиків" + +#: aleksis/core/models.py:989 +msgid "Can edit default dashboard" +msgstr "Може редагувати типову/Ñтандартну інформпанель" + +#: aleksis/core/models.py:990 +msgid "Dashboard Widget" +msgstr "Віджет інформпанелі" + +#: aleksis/core/models.py:991 +msgid "Dashboard Widgets" +msgstr "Віджети інформпанелі" + +#: aleksis/core/models.py:997 +msgid "URL" +msgstr "URL" + +#: aleksis/core/models.py:998 +msgid "Icon URL" +msgstr "Іконка URL" + +#: aleksis/core/models.py:1004 +msgid "External link widget" +msgstr "Зовнішнє поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° віджет" + +#: aleksis/core/models.py:1005 +msgid "External link widgets" +msgstr "Зовнішні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° віджети" + +#: aleksis/core/models.py:1011 +msgid "Content" +msgstr "ЗміÑÑ‚" + +#: aleksis/core/models.py:1017 +msgid "Static content widget" +msgstr "Віджет з поÑтійним зміÑтом" + +#: aleksis/core/models.py:1018 +msgid "Static content widgets" +msgstr "Віджети з поÑтійним зміÑтом" + +#: aleksis/core/models.py:1023 +msgid "Dashboard widget" +msgstr "Віджет інформпанелі" + +#: aleksis/core/models.py:1028 +msgid "Order" +msgstr "ПорÑдок" + +#: aleksis/core/models.py:1029 +msgid "Part of the default dashboard" +msgstr "ЧаÑтина типової інформпанелі" + +#: aleksis/core/models.py:1044 +msgid "Dashboard widget order" +msgstr "ПорÑдок віджету на інформпанелі" + +#: aleksis/core/models.py:1045 +msgid "Dashboard widget orders" +msgstr "ПорÑдок віджетів на інформпанелі" + +#: aleksis/core/models.py:1051 +msgid "Menu ID" +msgstr "Меню ID" + +#: aleksis/core/models.py:1064 +msgid "Custom menu" +msgstr "КориÑтувацьке меню" + +#: aleksis/core/models.py:1065 +msgid "Custom menus" +msgstr "КориÑтувацькі меню" + +#: aleksis/core/models.py:1075 +msgid "Menu" +msgstr "Меню" + +#: aleksis/core/models.py:1085 +msgid "Custom menu item" +msgstr "Пункт кориÑтувацького меню" + +#: aleksis/core/models.py:1086 +msgid "Custom menu items" +msgstr "Пункти кориÑтувацького меню" + +#: aleksis/core/models.py:1103 +msgid "Title of type" +msgstr "Ðазва типу" + +#: aleksis/core/models.py:1110 aleksis/core/templates/core/group/full.html:50 +msgid "Group type" +msgstr "Тип групи" + +#: aleksis/core/models.py:1111 +#: aleksis/core/templates/core/group_type/list.html:8 +#: aleksis/core/templates/core/group_type/list.html:9 +msgid "Group types" +msgstr "Типи груп" + +#: aleksis/core/models.py:1124 +msgid "Can view system status" +msgstr "Може переглÑдати Ñтан ÑиÑтеми" + +#: aleksis/core/models.py:1125 +msgid "Can manage data" +msgstr "Може керувати даними" + +#: aleksis/core/models.py:1126 +msgid "Can impersonate" +msgstr "Може маÑкуватиÑÑ" + +#: aleksis/core/models.py:1127 +msgid "Can use search" +msgstr "Може шукати" + +#: aleksis/core/models.py:1128 +msgid "Can change site preferences" +msgstr "Може змінювати влаÑтивоÑті Ñайту" + +#: aleksis/core/models.py:1129 +msgid "Can change person preferences" +msgstr "Може змінювати влаÑтивоÑті оÑоби" + +#: aleksis/core/models.py:1130 +msgid "Can change group preferences" +msgstr "Може змінювати влаÑтивоÑті групи" + +#: aleksis/core/models.py:1131 +msgid "Can test PDF generation" +msgstr "Може генерувати теÑтові PDF" + +#: aleksis/core/models.py:1132 +msgid "Can invite persons" +msgstr "Може запрошувати оÑіб" + +#: aleksis/core/models.py:1168 +msgid "Related data check task" +msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ пов'Ñзаних даних" + +#: aleksis/core/models.py:1176 +msgid "Issue solved" +msgstr "Проблема вирішена" + +#: aleksis/core/models.py:1177 +msgid "Notification sent" +msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ñлане" + +#: aleksis/core/models.py:1190 +msgid "Data check result" +msgstr "Результат перевірки даних" + +#: aleksis/core/models.py:1191 +msgid "Data check results" +msgstr "Результати перевірки даних" + +#: aleksis/core/models.py:1193 +msgid "Can run data checks" +msgstr "Може запуÑкати перевірки даних" + +#: aleksis/core/models.py:1194 +msgid "Can solve data check problems" +msgstr "Може розв'Ñзувати проблеми перевірки даних" + +#: aleksis/core/models.py:1201 +msgid "E-Mail address" +msgstr "ÐдреÑа ел.пошти" + +#: aleksis/core/models.py:1233 +msgid "Owner" +msgstr "ВлаÑник" + +#: aleksis/core/models.py:1237 +msgid "File expires at" +msgstr "Файл дійÑний до" + +#: aleksis/core/models.py:1240 +msgid "Generated HTML file" +msgstr "Згенерований файл HTML" + +#: aleksis/core/models.py:1243 +msgid "Generated PDF file" +msgstr "Згенерований файл PDF" + +#: aleksis/core/models.py:1250 +msgid "PDF file" +msgstr "Файл PDF" + +#: aleksis/core/models.py:1251 +msgid "PDF files" +msgstr "Файли PDF" + +#: aleksis/core/models.py:1256 +msgid "Task result" +msgstr "Результат завданнÑ" + +#: aleksis/core/models.py:1259 +msgid "Task user" +msgstr "КориÑтувач завданнÑ" + +#: aleksis/core/models.py:1263 +#, fuzzy +#| msgid "Back" +msgid "Back URL" +msgstr "Ðазад" + +#: aleksis/core/models.py:1264 +#, fuzzy +#| msgid "Progress: Generate PDF file" +msgid "Progress title" +msgstr "Перебіг: Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ PDF" + +#: aleksis/core/models.py:1265 +msgid "Error message" +msgstr "" + +#: aleksis/core/models.py:1266 +#, fuzzy +#| msgid "Success!" +msgid "Success message" +msgstr "УÑпіх!" + +#: aleksis/core/models.py:1267 +#, fuzzy +#| msgid "Redirect URIs" +msgid "Redirect on success URL" +msgstr "ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ URI-адреÑ" + +#: aleksis/core/models.py:1269 +#, fuzzy +#| msgid "Additional attributes" +msgid "Additional button title" +msgstr "Додаткові атрибути" + +#: aleksis/core/models.py:1271 +#, fuzzy +#| msgid "Additional data" +msgid "Additional button URL" +msgstr "Додаткові дані" + +#: aleksis/core/models.py:1273 +#, fuzzy +#| msgid "Additional attributes" +msgid "Additional button icon" +msgstr "Додаткові атрибути" + +#: aleksis/core/models.py:1275 +msgid "Result fetched" +msgstr "" + +#: aleksis/core/models.py:1300 +#, fuzzy +#| msgid "ICal feed deleted successfully" +msgid "Background task completed successfully" +msgstr "Стрічка iCal уÑпішно видалена" + +#: aleksis/core/models.py:1301 +#, fuzzy +#| msgid "The PDF file has been generated successfully." +msgid "The background task '{}' has been completed successfully." +msgstr "Файл PDF уÑпішно Ñтворений." + +#: aleksis/core/models.py:1307 +msgid "Background task failed" +msgstr "" + +#: aleksis/core/models.py:1308 +msgid "The background task '{}' has failed." +msgstr "" + +#: aleksis/core/models.py:1317 +msgid "Background task" +msgstr "" + +#: aleksis/core/models.py:1331 +msgid "Task user assignment" +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача завданнÑ" + +#: aleksis/core/models.py:1332 +msgid "Task user assignments" +msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів завданнÑ" + +#: aleksis/core/models.py:1348 +msgid "Additional attributes" +msgstr "Додаткові атрибути" + +#: aleksis/core/models.py:1386 +msgid "Allowed scopes that clients can request" +msgstr "Дозволені межі дії, Ñкі можуть запитувати клієнти" + +#: aleksis/core/models.py:1396 +msgid "This image will be shown as icon in the authorization flow. It should be squared." +msgstr "Це Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ іконкою під Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ—. Воно повинне бути квадратним." + +#: aleksis/core/models.py:1441 +#, fuzzy +#| msgid "Can view avatar image" +msgid "Can view room timetable" +msgstr "Може бачити аватар" + +#: aleksis/core/models.py:1443 +msgid "Room" +msgstr "" + +#: aleksis/core/models.py:1444 +msgid "Rooms" +msgstr "" + +#: aleksis/core/preferences.py:25 +msgid "General" +msgstr "Загальне" + +#: aleksis/core/preferences.py:26 +msgid "School" +msgstr "Школа / навч.заклад" + +#: aleksis/core/preferences.py:27 +msgid "Theme" +msgstr "Тема" + +#: aleksis/core/preferences.py:28 +msgid "Mail" +msgstr "Пошта" + +#: aleksis/core/preferences.py:30 +msgid "Footer" +msgstr "Ðижній колонтитул (footer)" + +#: aleksis/core/preferences.py:31 +msgid "Accounts" +msgstr "Облікові запиÑи" + +#: aleksis/core/preferences.py:32 +msgid "Authentication" +msgstr "ÐвторизаціÑ" + +#: aleksis/core/preferences.py:33 +msgid "Internationalisation" +msgstr "ІнтернаціоналізаціÑ" + +#: aleksis/core/preferences.py:43 +msgid "Site title" +msgstr "Ðазва Ñайту" + +#: aleksis/core/preferences.py:55 +msgid "Site description" +msgstr "ÐžÐ¿Ð¸Ñ Ñайту" + +#: aleksis/core/preferences.py:65 +msgid "Primary colour" +msgstr "ОÑновний колір" + +#: aleksis/core/preferences.py:77 +msgid "Secondary colour" +msgstr "Додатковий колір" + +#: aleksis/core/preferences.py:89 +msgid "Logo" +msgstr "Логотип" + +#: aleksis/core/preferences.py:100 +msgid "Favicon" +msgstr "Favicon" + +#: aleksis/core/preferences.py:111 +msgid "PWA-Icon" +msgstr "Іконка PWA" + +#: aleksis/core/preferences.py:121 +msgid "PWA-Icon is maskable" +msgstr "Іконка PWA може бути з маÑкою" + +#: aleksis/core/preferences.py:133 +msgid "Mail out name" +msgstr "Ім'Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð½Ð¸ÐºÐ°" + +#: aleksis/core/preferences.py:144 +msgid "Mail out address" +msgstr "ÐдреÑа відправника" + +#: aleksis/core/preferences.py:157 +msgid "Link to privacy policy" +msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° політику приватноÑті" + +#: aleksis/core/preferences.py:169 +msgid "Link to imprint" +msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° відбиток" + +#: aleksis/core/preferences.py:180 +msgid "Name format for addressing" +msgstr "Формат імені у лиÑтуванні" + +#: aleksis/core/preferences.py:197 +msgid "Channels to use for notifications" +msgstr "Канали Ð´Ð»Ñ Ñповіщень" + +#: aleksis/core/preferences.py:208 +#, fuzzy +#| msgid "Selected persons" +msgid "Select Design" +msgstr "Позначені оÑоби" + +#: aleksis/core/preferences.py:211 +msgid "Light mode" +msgstr "" + +#: aleksis/core/preferences.py:224 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "РегулÑрний вираз Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ оÑновної групи, напр. '^Class .*'" + +#: aleksis/core/preferences.py:235 +msgid "Field on person to match primary group against" +msgstr "Поле щодо оÑоби Ð´Ð»Ñ ÑпівÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð· оÑновною групою" + +#: aleksis/core/preferences.py:247 +msgid "Automatically create new persons for new users" +msgstr "Ðові оÑоби Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… кориÑтувачів Ñтворювати автоматично" + +#: aleksis/core/preferences.py:256 +msgid "Automatically link existing persons to new users by their e-mail address" +msgstr "Пов'Ñзувати Ñ–Ñнуючих оÑіб з новими кориÑтувачами автоматично за ел.адреÑами" + +#: aleksis/core/preferences.py:267 +msgid "Display name of the school" +msgstr "Ðазва школи / навч.закладу Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" + +#: aleksis/core/preferences.py:278 +msgid "Official name of the school, e.g. as given by supervisory authority" +msgstr "Офіційна назва школи / навч.закладу, напр. Ñк у державному Ñвідоцтві" + +#: aleksis/core/preferences.py:286 +msgid "Allow users to change their passwords" +msgstr "Дозволити кориÑтувачам змінювати Ñвої паролі" + +#: aleksis/core/preferences.py:294 +msgid "Allow users to reset their passwords" +msgstr "Дозволити кориÑтувачам Ñкидати Ñвої паролі" + +#: aleksis/core/preferences.py:302 +msgid "Enable signup" +msgstr "Увімкнути реєÑтрацію" + +#: aleksis/core/preferences.py:310 +msgid "Regular expression for allowed usernames" +msgstr "РегулÑрний вираз Ð´Ð»Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ… логінів" + +#: aleksis/core/preferences.py:318 +msgid "Enable invitations" +msgstr "Увімкнути запрошеннÑ" + +#: aleksis/core/preferences.py:326 +msgid "Length of invite code. (Default 3: abcde-acbde-abcde)" +msgstr "Довжина запрошувального коду. (Типово 3: abcde-acbde-abcde)" + +#: aleksis/core/preferences.py:334 +msgid "Size of packets. (Default 5: abcde)" +msgstr "Розмір пакетів. (Типово 5: abcde)" + +#: aleksis/core/preferences.py:345 +msgid "Allowed Grant Flows for OAuth applications" +msgstr "Дозволені потоки грантів Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑ–Ð² з OAuth" + +#: aleksis/core/preferences.py:358 +msgid "Send emails if data checks detect problems" +msgstr "Ð’ разі виÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ даних надіÑлати ел.лиÑÑ‚" + +#: aleksis/core/preferences.py:369 +msgid "Email recipients for data checks problem emails" +msgstr "Ел.адреÑи отримувачів Ð´Ð»Ñ Ð»Ð¸Ñтів з проблемами перевірки даних" + +#: aleksis/core/preferences.py:380 +msgid "Email recipient groups for data checks problem emails" +msgstr "Ел.адреÑи груп Ð´Ð»Ñ Ð»Ð¸Ñтів з проблемами перевірки даних" + +#: aleksis/core/preferences.py:389 +msgid "Show dashboard to users without login" +msgstr "Відображати інформпанель анонімним кориÑтувачам" + +#: aleksis/core/preferences.py:398 +msgid "Allow users to edit their dashboard" +msgstr "Дозволити кориÑтувачам редагувати Ñвою інформпанель" + +#: aleksis/core/preferences.py:409 +msgid "Fields on person model which are editable by themselves." +msgstr "ÐŸÐ¾Ð»Ñ Ð· опиÑом оÑоби, Ñкі можна редагувати ÑамоÑтійно." + +#: aleksis/core/preferences.py:424 +msgid "Editable fields on person model which should trigger a notification on change" +msgstr "Змінювані Ð¿Ð¾Ð»Ñ Ð· опиÑом оÑоби, Ñкі повинні Ñповіщати щодо редагуваннÑ" + +#: aleksis/core/preferences.py:438 +msgid "Contact for notification if a person changes their data" +msgstr "Контакт Ð´Ð»Ñ Ñповіщень, Ñкщо хтоÑÑŒ змінює Ñвої дані" + +#: aleksis/core/preferences.py:449 +msgid "Prefer personal photos over avatars" +msgstr "Віддавати перевагу оÑобиÑтим фото заміÑть аватарів" + +#: aleksis/core/preferences.py:459 +msgid "PDF file expiration duration" +msgstr "Термін придатноÑті файла PDF" + +#: aleksis/core/preferences.py:460 +msgid "in minutes" +msgstr "у хвилинах" + +#: aleksis/core/preferences.py:470 +msgid "Automatically update the dashboard and its widgets" +msgstr "Ðвтоматично оновлювати інформпанель та Ñ—Ñ— віджети" + +#: aleksis/core/preferences.py:480 +msgid "Automatically update the dashboard and its widgets sitewide" +msgstr "Ðвтоматично оновлювати інформпанель та Ñ—Ñ— віджети (Ð´Ð»Ñ Ð²Ñього Ñайту)" + +#: aleksis/core/preferences.py:490 +msgid "Country for phone number parsing" +msgstr "Країна Ð´Ð»Ñ Ñ€Ð¾Ð·Ð±Ð¾Ñ€Ñƒ номера телефона" + +#: aleksis/core/settings.py:539 +msgid "English" +msgstr "ÐнглійÑька" + +#: aleksis/core/settings.py:540 +msgid "German" +msgstr "Ðімецька" + +#: aleksis/core/settings.py:541 +msgid "Ukrainian" +msgstr "УкраїнÑька" + +#: aleksis/core/tables.py:25 +#: aleksis/core/templates/core/announcement/list.html:36 +#: aleksis/core/templates/core/group/full.html:26 +#: aleksis/core/templates/oauth2_provider/application/detail.html:17 +msgid "Edit" +msgstr "Редагувати" + +#: aleksis/core/tables.py:27 aleksis/core/tables.py:148 +#: aleksis/core/tables.py:192 +#: aleksis/core/templates/core/announcement/list.html:22 +msgid "Actions" +msgstr "Дії" + +#: aleksis/core/tables.py:115 aleksis/core/tables.py:116 +#: aleksis/core/tables.py:130 aleksis/core/tables.py:146 +#: aleksis/core/tables.py:190 +#: aleksis/core/templates/core/announcement/list.html:42 +#: aleksis/core/templates/core/group/full.html:33 +#: aleksis/core/templates/core/pages/delete.html:22 +#: aleksis/core/templates/oauth2_provider/application/detail.html:21 +msgid "Delete" +msgstr "Видалити" + +#: aleksis/core/templates/403.html:14 aleksis/core/templates/500.html:10 +#: aleksis/core/templates/oauth2_provider/authorize.html:54 +msgid "Error" +msgstr "Помилка" + +#: aleksis/core/templates/403.html:14 +msgid "" +"You are not allowed to access the requested page or\n" +" object." +msgstr "" +"У Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” доÑтупу до запитуваної Ñторінки або\n" +" об'єкту." + +#: aleksis/core/templates/403.html:19 aleksis/core/templates/404.html:16 +msgid "" +"\n" +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " +msgstr "" +"\n" +" Якщо Ви думаєте, що це помилка AlekSIS, звернітьÑÑ, будь лаÑка,\n" +" до адмініÑтраторів Ñайту:\n" +" " + +#: aleksis/core/templates/404.html:12 +msgid "" +"\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" +" " +msgstr "" +"\n" +" Якщо Ви були перенаправлені поÑиланнÑм із зовнішньої Ñторінки,\n" +" ймовірно, це поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð²Ð¶Ðµ заÑтаріло.\n" +" " + +#: aleksis/core/templates/500.html:10 +msgid "" +"An unexpected error has\n" +" occurred." +msgstr "" +"СталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð°\n" +" помилка." + +#: aleksis/core/templates/500.html:13 +msgid "" +"\n" +" Your site administrators will automatically be notified about this\n" +" error. You can also contact them directly:\n" +" " +msgstr "" +"\n" +" ÐдмініÑтратори Ñайту будуть Ñповіщені щодо цієї помилки автоматично.\n" +" Ви також можете звернутиÑÑ Ð´Ð¾ них безпоÑередньо:\n" +" " + +#: aleksis/core/templates/500.html:21 +msgid "Retry" +msgstr "Спробувати ще" + +#: aleksis/core/templates/503.html:10 +msgid "" +"The maintenance mode is currently enabled. Please try again\n" +" later." +msgstr "" +"Сайт перебуває зараз на обÑлуговуванні. Спробуйте зайти\n" +" пізніше." + +#: aleksis/core/templates/503.html:13 +msgid "" +"\n" +" This page is currently unavailable. If this error persists, contact your site administrators:\n" +" " +msgstr "" +"\n" +" Ð¦Ñ Ñторінка наразі недоÑтупна. Якщо Ñ†Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° виникне знову, звернітьÑÑ Ð´Ð¾ адмініÑтраторів Ñайту:\n" +" " + +#: aleksis/core/templates/account/account_inactive.html:5 +#: aleksis/core/templates/account/account_inactive.html:6 +msgid "Account inactive" +msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ð¹" + +#: aleksis/core/templates/account/account_inactive.html:14 +msgid "Account inactive." +msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ð¹." + +#: aleksis/core/templates/account/account_inactive.html:17 +msgid "" +"\n" +" This account is currently inactive. If you think this is an\n" +" error, please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" Цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– неактивний. Якщо Ви думаєте,\n" +" що це помилка, звернітьÑÑ Ð´Ð¾ адмініÑтраторів Ñайту.\n" +" " + +#: aleksis/core/templates/account/email/base_message.txt:5 +msgid "Hello!" +msgstr "Привіт!" + +#: aleksis/core/templates/account/email/base_message.txt:9 +msgid "Your AlekSIS team" +msgstr "Команда AlekSIS" + +#: aleksis/core/templates/account/email_confirm.html:5 +#: aleksis/core/templates/account/email_confirm.html:6 +#: aleksis/core/templates/account/email_confirm.html:17 +#: aleksis/core/templates/socialaccount/login.html:17 +msgid "Confirm" +msgstr "Підтвердити" + +#: aleksis/core/templates/account/email_confirm.html:12 +#, python-format +msgid "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail address for user %(user_display)s." +msgstr "Підтвердіть, будь лаÑка, що <a href=\"mailto:%(email)s\">%(email)s</a> Ñ” адреÑою ел.пошти Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача %(user_display)s." + +#: aleksis/core/templates/account/email_confirm.html:25 +#, python-format +msgid "This e-mail confirmation link expired or is invalid. Please <a href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." +msgstr "Це поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ».пошти протерміноване або недійÑне. Зробіть, будь лаÑка, Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ <a href=\"%(email_url)s\">новий запит</a>." + +#: aleksis/core/templates/account/password_change.html:5 +#: aleksis/core/templates/account/password_change.html:6 +#: aleksis/core/templates/account/password_change.html:19 +#: aleksis/core/templates/account/password_reset_from_key.html:5 +#: aleksis/core/templates/account/password_reset_from_key.html:42 +#: aleksis/core/templates/account/password_reset_from_key.html:46 +#: aleksis/core/templates/account/password_reset_from_key_done.html:5 +#: aleksis/core/templates/account/password_reset_from_key_done.html:6 +msgid "Change password" +msgstr "Змінити пароль" + +#: aleksis/core/templates/account/password_change.html:12 +msgid "Forgot your current password? Click here to reset it:" +msgstr "Забули Ñвій пароль? ÐатиÑніть тут Ð´Ð»Ñ ÑкиданнÑ:" + +#: aleksis/core/templates/account/password_change.html:12 +msgid "Forgot Password?" +msgstr "Забули пароль?" + +#: aleksis/core/templates/account/password_change_disabled.html:5 +#: aleksis/core/templates/account/password_change_disabled.html:6 +msgid "Changing of password disabled" +msgstr "Зміна паролю вимкнена" + +#: aleksis/core/templates/account/password_change_disabled.html:13 +msgid "Changing of password disabled." +msgstr "Зміна паролю вимкнена." + +#: aleksis/core/templates/account/password_change_disabled.html:15 +msgid "" +"\n" +" Users are not allowed to edit their own passwords. If you think\n" +" this is an error please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" КориÑтувачам не дозволÑєтьÑÑ Ð·Ð¼Ñ–Ð½ÑŽÐ²Ð°Ñ‚Ð¸ Ñвої паролі.\n" +" Якщо Ви думаєте, що це помилка, звернітьÑÑ Ð´Ð¾ адмініÑтраторів Ñайту.\n" +" " + +#: aleksis/core/templates/account/password_reset.html:5 +#: aleksis/core/templates/account/password_reset.html:15 +#: aleksis/core/templates/account/password_reset.html:23 +#: aleksis/core/templates/account/password_reset_done.html:5 +#: aleksis/core/templates/account/verification_email_required.html:5 +#: aleksis/core/templates/account/verification_email_required.html:6 +#: aleksis/core/templates/two_factor/core/login.html:100 +msgid "Reset password" +msgstr "Скинути пароль" + +#: aleksis/core/templates/account/password_reset.html:17 +msgid "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." +msgstr "Забули пароль? Вкажіть нижче Ñвою ел.пошту Ñ– ми надішлемо Вам лиÑта Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ." + +#: aleksis/core/templates/account/password_reset.html:30 +msgid "" +"Please contact one of your site administrators, if you\n" +" have any trouble resetting your password:" +msgstr "" +"Якщо у Ð’Ð°Ñ Ð²Ð¸Ð½Ð¸ÐºÐ»Ð° проблема зі ÑкиданнÑм паролÑ,\n" +" звернітьÑÑ, будь лаÑка, до адмініÑтраторів Ñайту:" + +#: aleksis/core/templates/account/password_reset_done.html:15 +msgid "Password reset mail sent" +msgstr "ЛиÑÑ‚ Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð°Ð´Ñ–Ñланий" + +#: aleksis/core/templates/account/password_reset_done.html:18 +#: aleksis/core/templates/account/verification_email_required.html:16 +msgid "" +"\n" +" We have sent you an e-mail. Please contact one of your site\n" +" administrators if you do not receive it within a few minutes.\n" +" " +msgstr "" +"\n" +" Ми надіÑлали Вам ел.лиÑта. Якщо Ви його не отримаєте протÑгом\n" +" декількох хвилин, звернітьÑÑ, будь лаÑка, до адмініÑтраторів Ñайту.\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:15 +msgid "Bad token" +msgstr "ÐеÑправний токен" + +#: aleksis/core/templates/account/password_reset_from_key.html:19 +#, python-format +msgid "" +"\n" +" The password reset link was invalid, possibly because it has already been used. Please request a <a href=\"%(passwd_reset_url)s\"\n" +" class=\"blue-text text-lighten-2\">new password reset</a>.\n" +" " +msgstr "" +"\n" +" ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ´Ñ–Ð¹Ñне або, ймовірно, вже викориÑтане. Зробіть, будь лаÑка, <a href=\"%(passwd_reset_url)s\"\n" +" class=\"blue-text text-lighten-2\">новий запит на ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ</a>.\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:25 +msgid "" +"\n" +" If this issue persists, please contact one of your site\n" +" administrators\n" +" " +msgstr "" +"\n" +" Якщо проблема доÑÑ– приÑутнÑ, звернітьÑÑ, будь лаÑка, до\n" +" адмініÑтраторів Ñайту\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:56 +#: aleksis/core/templates/account/password_reset_from_key_done.html:15 +msgid "" +"\n" +" Your password is now changed!\n" +" " +msgstr "" +"\n" +" Ваш пароль змінений!\n" +" " + +#: aleksis/core/templates/account/password_reset_from_key.html:61 +msgid "Back to login" +msgstr "Ðазад до входу" + +#: aleksis/core/templates/account/password_reset_from_key_done.html:13 +msgid "Password changed!" +msgstr "Пароль змінений!" + +#: aleksis/core/templates/account/password_set.html:5 +#: aleksis/core/templates/account/password_set.html:6 +#: aleksis/core/templates/account/password_set.html:12 +msgid "Set password" +msgstr "Створіть пароль" + +#: aleksis/core/templates/account/signup.html:5 +#: aleksis/core/templates/account/signup.html:6 +#: aleksis/core/templates/socialaccount/signup.html:5 +#: aleksis/core/templates/socialaccount/signup.html:6 +msgid "Signup" +msgstr "РеєÑтраціÑ" + +#: aleksis/core/templates/account/signup.html:12 +#, python-format +msgid "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." +msgstr "Вже маєте обліковий запиÑ? Тоді можете <a href=\"%(login_url)s\">увіти</a>." + +#: aleksis/core/templates/account/signup.html:22 +#: aleksis/core/templates/socialaccount/signup.html:23 +msgid "Sign up" +msgstr "ЗареєÑтруватиÑÑ" + +#: aleksis/core/templates/account/signup_closed.html:5 +#: aleksis/core/templates/account/signup_closed.html:6 +msgid "Signup closed" +msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð°" + +#: aleksis/core/templates/account/signup_closed.html:14 +msgid "Signup closed." +msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð°." + +#: aleksis/core/templates/account/signup_closed.html:17 +msgid "" +"\n" +" This sign up is currently closed. If you think this is an\n" +" error, please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– закрита. Якщо Ви думаєте, що це помилка,\n" +" можете звернутиÑÑ Ð´Ð¾ адмініÑтраторів Ñайту.\n" +" " + +#: aleksis/core/templates/account/verification_email_required.html:14 +msgid "Password reset mail sent!" +msgstr "ЛиÑÑ‚ Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð°Ð´Ñ–Ñланий!" + +#: aleksis/core/templates/account/verification_sent.html:5 +#: aleksis/core/templates/account/verification_sent.html:6 +msgid "Verify your email address" +msgstr "Перевірте Ñвою адреÑу ел.пошти" + +#: aleksis/core/templates/account/verification_sent.html:14 +msgid "Verify your email!" +msgstr "Перевірте Ñвою ел.пошту!" + +#: aleksis/core/templates/account/verification_sent.html:16 +msgid "" +"\n" +" This part of the site requires us to verify that you are who you claim to be.\n" +" For this purpose, we require that you verify ownership of your e-mail address.\n" +" " +msgstr "" +"\n" +" Ð¦Ñ Ñ‡Ð°Ñтина Ñайту вимагає перевірки, що Ви - Ñаме той/та, хто має бути.\n" +" Саме Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ нам необхідно перевірити, що адреÑа ел.пошти належить Ñаме Вам.\n" +" " + +#: aleksis/core/templates/account/verification_sent.html:22 +msgid "" +"\n" +" We have sent an e-mail to you for verification.\n" +" Please click on the link inside this e-mail. Please\n" +" contact us if you do not receive it within a few minutes.\n" +" " +msgstr "" +"\n" +" Ми надіÑлали Вам Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ ел.лиÑта.\n" +" Будь лаÑка, перейдіть за вказаним там поÑиланнÑм. Якщо Ви не отримаєте\n" +" лиÑта протÑгом декількох хвилин, звернітьÑÑ, будь лаÑка, до наÑ.\n" +" " + +#: aleksis/core/templates/core/additional_field/edit.html:6 +#: aleksis/core/templates/core/additional_field/edit.html:7 +msgid "Edit additional field" +msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ полÑ" + +#: aleksis/core/templates/core/additional_field/list.html:14 +msgid "Create additional field" +msgstr "Створити додаткове поле" + +#: aleksis/core/templates/core/announcement/form.html:14 +#: aleksis/core/templates/core/announcement/form.html:21 +msgid "Edit announcement" +msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ" + +#: aleksis/core/templates/core/announcement/form.html:16 +msgid "Publish announcement" +msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ" + +#: aleksis/core/templates/core/announcement/form.html:23 +#: aleksis/core/templates/core/announcement/list.html:13 +msgid "Publish new announcement" +msgstr "РозміÑтити нове оголошеннÑ" + +#: aleksis/core/templates/core/announcement/form.html:34 +msgid "Save and publish announcement" +msgstr "Зберегти та розміÑтити оголошеннÑ" + +#: aleksis/core/templates/core/announcement/list.html:19 +msgid "Valid from" +msgstr "ДійÑне з" + +#: aleksis/core/templates/core/announcement/list.html:20 +msgid "Valid until" +msgstr "ДійÑне до" + +#: aleksis/core/templates/core/announcement/list.html:21 +msgid "Recipients" +msgstr "Отримувачі" + +#: aleksis/core/templates/core/announcement/list.html:50 +msgid "There are no announcements." +msgstr "Оголошень немає." + +#: aleksis/core/templates/core/base_print.html:74 +msgid "Powered by AlekSIS®" +msgstr "БазуєтьÑÑ Ð½Ð° AlekSIS®" + +#: aleksis/core/templates/core/dashboard_widget/create.html:8 +#: aleksis/core/templates/core/dashboard_widget/create.html:12 +#, python-format +msgid "Create %(widget)s" +msgstr "Створити %(widget)s" + +#: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:10 +msgid "This widget is currently not available." +msgstr "Цей віджет зараз недоÑтупний." + +#: aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html:14 +#, python-format +msgid "" +"\n" +" There is a problem getting the widget \"%(title)s\".\n" +" There is no need for you to take any action.\n" +" " +msgstr "" +"\n" +" Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¶ÐµÑ‚Ð° \"%(title)s\" виникла проблема.\n" +" Вам нічого робити не потрібно.\n" +" " + +#: aleksis/core/templates/core/dashboard_widget/edit.html:8 +#: aleksis/core/templates/core/dashboard_widget/edit.html:12 +#, python-format +msgid "Edit %(widget)s" +msgstr "Редагувати %(widget)s" + +#: aleksis/core/templates/core/dashboard_widget/list.html:8 +#: aleksis/core/templates/core/dashboard_widget/list.html:9 +msgid "Dashboard widgets" +msgstr "Віджети інформпанелі" + +#: aleksis/core/templates/core/dashboard_widget/list.html:15 +msgid "Create dashboard widget" +msgstr "Створити віджет Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ñ–" + +#: aleksis/core/templates/core/dashboard_widget/list.html:22 +#, python-format +msgid "Create %(name)s" +msgstr "Створити %(name)s" + +#: aleksis/core/templates/core/dashboard_widget/list.html:32 +#: aleksis/core/templates/core/edit_dashboard.html:8 +#: aleksis/core/templates/core/edit_dashboard.html:15 +msgid "Edit default dashboard" +msgstr "Редагувати типову/Ñтандартну інформпанель" + +#: aleksis/core/templates/core/data_check/list.html:9 +#: aleksis/core/templates/core/data_check/list.html:10 +msgid "Data checks" +msgstr "Перевірки даних" + +#: aleksis/core/templates/core/data_check/list.html:15 +msgid "Check data again" +msgstr "Перевірити дані ще раз" + +#: aleksis/core/templates/core/data_check/list.html:22 +msgid "The system detected some problems with your data." +msgstr "СиÑтема виÑвила деÑкі проблеми з Вашими даними." + +#: aleksis/core/templates/core/data_check/list.html:23 +msgid "" +"Please go through all data and check whether some extra action is\n" +" needed." +msgstr "" +"Будь лаÑка, уважно переглÑньте уÑÑ– дані Ñ– перевірте чи не потрібно\n" +" щоÑÑŒ зробити." + +#: aleksis/core/templates/core/data_check/list.html:31 +msgid "Everything is fine." +msgstr "Ð’Ñе чудово." + +#: aleksis/core/templates/core/data_check/list.html:32 +msgid "The system hasn't detected any problems with your data." +msgstr "СиÑтема не виÑвила жодних проблем з Вашими даними." + +#: aleksis/core/templates/core/data_check/list.html:40 +msgid "Detected problems" +msgstr "ВиÑвлені проблеми" + +#: aleksis/core/templates/core/data_check/list.html:45 +msgid "Affected object" +msgstr "Залежні об'єкти" + +#: aleksis/core/templates/core/data_check/list.html:46 +msgid "Detected problem" +msgstr "ВиÑвлена проблема" + +#: aleksis/core/templates/core/data_check/list.html:47 +msgid "Show details" +msgstr "Детальніше" + +#: aleksis/core/templates/core/data_check/list.html:48 +msgid "Options to solve the problem" +msgstr "Варіанти Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸" + +#: aleksis/core/templates/core/data_check/list.html:63 +msgid "Show object" +msgstr "ПереглÑнути об'єкт" + +#: aleksis/core/templates/core/data_check/list.html:86 +msgid "Registered checks" +msgstr "ЗареєÑтровані перевірки" + +#: aleksis/core/templates/core/data_check/list.html:90 +msgid "" +"\n" +" The system will check for the following problems:\n" +" " +msgstr "" +"\n" +" СиÑтема перевірить наÑвніÑть таких проблем:\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:6 +#: aleksis/core/templates/core/edit_dashboard.html:13 +#: aleksis/core/templates/core/index.html:17 +msgid "Edit dashboard" +msgstr "Редагувати інформпанель" + +#: aleksis/core/templates/core/edit_dashboard.html:24 +msgid "" +"\n" +" On this page you can arrange your personal dashboard. You can drag any items from \"Available widgets\" to \"Your\n" +" Dashboard\" or change the order by moving the widgets. After you have finished, please don't forget to click on\n" +" \"Save\".\n" +" " +msgstr "" +"\n" +" Ðа цій Ñторінці Ви можете впорÑдкувати Ñвою інформпанель. ПеретÑгуйте будь-Ñкі елементи з \"ДоÑтупних віджетів\"\n" +" до \"Своєї інформпанелі\" або змінюйте порÑдок, перетÑгуючи віджети. ПіÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ забудьте натиÑнути\n" +" \"Зберегти\".\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:30 +msgid "" +"\n" +" On this page you can arrange the default dashboard which is shown when a user doesn't arrange his own\n" +" dashboard. You can drag any items from \"Available widgets\" to \"Default Dashboard\" or change the order\n" +" by moving the widgets. After you have finished, please don't forget to click on \"Save\".\n" +" " +msgstr "" +"\n" +" Ðа цій Ñторінці Ви можете впорÑдкувати типову/Ñтандартну інформпанель, Ñка відображаєтьÑÑ, Ñкщо кориÑтувач\n" +" не впорÑдкував влаÑну. ПеретÑгуйте будь-Ñкі елементи з \"ДоÑтупних віджетів\" до \"Типової інформпанелі\" або змінюйте \n" +" порÑдок, перетÑгуючи віджети. ПіÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ забудьте натиÑнути \"Зберегти\".\n" +" " + +#: aleksis/core/templates/core/edit_dashboard.html:48 +msgid "Available widgets" +msgstr "ДоÑтупні віджети" + +#: aleksis/core/templates/core/edit_dashboard.html:57 +msgid "Your dashboard" +msgstr "Ваша інформпанель" + +#: aleksis/core/templates/core/edit_dashboard.html:59 +msgid "Default dashboard" +msgstr "Типова інформпанель" + +#: aleksis/core/templates/core/group/child_groups.html:7 +#: aleksis/core/templates/core/group/child_groups.html:9 +msgid "Assign child groups to groups" +msgstr "Призначити підлеглі групи до груп" + +#: aleksis/core/templates/core/group/child_groups.html:18 +msgid "" +"\n" +" You can use this to assign child groups to groups. Please use the filters below to select groups you want to\n" +" change and click \"Next\".\n" +" " +msgstr "" +"\n" +" Ви можете ÑкориÑтатиÑÑ Ñ†Ð¸Ð¼ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð»ÐµÐ³Ð»Ð¸Ñ… груп до оÑновних. Ð”Ð»Ñ Ð¾Ð±Ñ€Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿,\n" +" Ñкі хочете змінити, ÑкориÑтайтеÑÑ, будь лаÑка, фільтрами, що нижче та натиÑніÑть \"Далі\".\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:31 +msgid "Update selection" +msgstr "Оновити вибір" + +#: aleksis/core/templates/core/group/child_groups.html:35 +msgid "Clear all filters" +msgstr "ОчиÑтити фільтри" + +#: aleksis/core/templates/core/group/child_groups.html:39 +msgid "Currently selected groups" +msgstr "Позначені зараз групи" + +#: aleksis/core/templates/core/group/child_groups.html:52 +msgid "Start assigning child groups for this groups" +msgstr "Розпочати Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð»ÐµÐ³Ð»Ð¸Ñ… груп до цих груп" + +#: aleksis/core/templates/core/group/child_groups.html:61 +msgid "" +"\n" +" Please select some groups in order to go on with assigning.\n" +" " +msgstr "" +"\n" +" Оберіть, будь лаÑка, декілька груп у порÑдку, за Ñким призначати.\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:72 +msgid "Current group:" +msgstr "Поточна група:" + +#: aleksis/core/templates/core/group/child_groups.html:78 +msgid "Please be careful!" +msgstr "Обережно, будь лаÑка!" + +#: aleksis/core/templates/core/group/child_groups.html:79 +msgid "" +"\n" +" If you click \"Back\" or \"Next\" the current group assignments are not saved.\n" +" If you click \"Save\", you will overwrite all existing child group relations for this group with what you\n" +" selected on this page.\n" +" " +msgstr "" +"\n" +" Якщо натиÑнете \"Ðазад\" або \"Далі\" Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— групи не збережутьÑÑ.\n" +" Якщо натиÑнете \"Зберегти\", уÑÑ– Ñ–Ñнуючі зв'Ñзки підлеглої групи з цією групою будуть замінені на\n" +" обрані на цій Ñторінці.\n" +" " + +#: aleksis/core/templates/core/group/child_groups.html:93 +#: aleksis/core/templates/core/group/child_groups.html:128 +#: aleksis/core/templates/oauth2_provider/application/detail.html:9 +#: aleksis/core/templates/two_factor/_wizard_actions.html:15 +#: aleksis/core/templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "Ðазад" + +#: aleksis/core/templates/core/group/child_groups.html:99 +#: aleksis/core/templates/core/group/child_groups.html:134 +#: aleksis/core/templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "ÐаÑтупний" + +#: aleksis/core/templates/core/group/child_groups.html:106 +#: aleksis/core/templates/core/group/child_groups.html:141 +#: aleksis/core/templates/core/partials/save_button.html:3 +msgid "Save" +msgstr "Зберегти" + +#: aleksis/core/templates/core/group/child_groups.html:112 +#: aleksis/core/templates/core/group/child_groups.html:147 +msgid "Save and next" +msgstr "Зберегти Ñ– йти далі" + +#: aleksis/core/templates/core/group/edit.html:11 +#: aleksis/core/templates/core/group/edit.html:12 +msgid "Edit group" +msgstr "Редагувати групу" + +#: aleksis/core/templates/core/group/full.html:40 +msgid "Change preferences" +msgstr "Змінити влаÑтивоÑті" + +#: aleksis/core/templates/core/group/full.html:68 +msgid "Statistics" +msgstr "СтатиÑтика" + +#: aleksis/core/templates/core/group/full.html:73 +msgid "Count of members" +msgstr "КількіÑть учаÑників" + +#: aleksis/core/templates/core/group/full.html:81 +msgid "Average age" +msgstr "Середній вік" + +#: aleksis/core/templates/core/group/full.html:90 +msgid "Age range" +msgstr "Віковий діапазон" + +#: aleksis/core/templates/core/group/full.html:93 +#, python-format +msgid "" +"\n" +" %(min)s years to %(max)s years\n" +" " +msgstr "" +"\n" +" %(min)s років до %(max)s років\n" +" " + +#: aleksis/core/templates/core/group/list.html:14 +msgid "Create group" +msgstr "Створити групу" + +#: aleksis/core/templates/core/group/list.html:17 +msgid "Filter groups" +msgstr "Фільтрувати групи" + +#: aleksis/core/templates/core/group/list.html:24 +#: aleksis/core/templates/core/person/list.html:28 +msgid "Clear" +msgstr "ОчиÑтити" + +#: aleksis/core/templates/core/group/list.html:28 +msgid "Selected groups" +msgstr "Вибрані групи" + +#: aleksis/core/templates/core/group_type/edit.html:6 +#: aleksis/core/templates/core/group_type/edit.html:7 +msgid "Edit group type" +msgstr "Редагувати тип групи" + +#: aleksis/core/templates/core/group_type/list.html:14 +msgid "Create group type" +msgstr "Створити тип групи" + +#: aleksis/core/templates/core/index.html:4 +msgid "Home" +msgstr "Додому" + +#: aleksis/core/templates/core/index.html:34 +msgid "" +"\n" +" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n" +" customise your personal dashboard.\n" +" " +msgstr "" +"\n" +" Ви ще не налаштували Ñвою інформпанель, тож поки що бачите типову/Ñтандартну. Ð”Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ \n" +" влаÑної інформпанелі клацніть \"Редагувати інформпанель\".\n" +" " + +#: aleksis/core/templates/core/index.html:44 +msgid "Last activities" +msgstr "ОÑтанні дії" + +#: aleksis/core/templates/core/index.html:62 +msgid "No activities available yet." +msgstr "Дії поки що не доÑтупні." + +#: aleksis/core/templates/core/pages/delete.html:6 +#, python-format +msgid "Delete %(object_name)s" +msgstr "Видалити %(object_name)s" + +#: aleksis/core/templates/core/pages/delete.html:13 +#, python-format +msgid "" +"\n" +" Do you really want to delete the %(object_name)s \"%(object)s\"?\n" +" " +msgstr "" +"\n" +" Ви дійно хочете видалити %(object_name)s \"%(object)s\"?\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:5 +#: aleksis/core/templates/core/pages/system_status.html:7 +msgid "System status" +msgstr "Стан ÑиÑтеми" + +#: aleksis/core/templates/core/pages/system_status.html:12 +msgid "System checks" +msgstr "СиÑтемні перевірки" + +#: aleksis/core/templates/core/pages/system_status.html:22 +msgid "Maintenance mode enabled" +msgstr "Ðктивований режим обÑлуговуваннÑ" + +#: aleksis/core/templates/core/pages/system_status.html:24 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access the site.\n" +" " +msgstr "" +"\n" +" ДоÑтуп до Ñайту мають лише адмініÑтратор та відвідувачі з внутрішніми IP-адреÑами.\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:36 +msgid "Maintenance mode disabled" +msgstr "Режим обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹" + +#: aleksis/core/templates/core/pages/system_status.html:37 +msgid "Everyone can access the site." +msgstr "ДоÑтуп до Ñайту мають уÑÑ–." + +#: aleksis/core/templates/core/pages/system_status.html:47 +msgid "Debug mode enabled" +msgstr "Ðктивований режим налагодженнÑ" + +#: aleksis/core/templates/core/pages/system_status.html:49 +msgid "" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " +msgstr "" +"\n" +" Веб-Ñервер кидає під Ñ‡Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº інформацію щодо налагодженнÑ. Ðе викориÑтовуйте в продакшені!\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:56 +msgid "Debug mode disabled" +msgstr "Режим Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹" + +#: aleksis/core/templates/core/pages/system_status.html:58 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " +msgstr "" +"\n" +" Режим Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¸Ð¹. Ð’ разі збоїв відображатимутьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð²Ñ– Ñторінки помилок.\n" +" " + +#: aleksis/core/templates/core/pages/system_status.html:71 +msgid "System health checks" +msgstr "Перевірки роботи ÑиÑтеми" + +#: aleksis/core/templates/core/pages/system_status.html:77 +msgid "Service" +msgstr "Служба" + +#: aleksis/core/templates/core/pages/system_status.html:78 +#: aleksis/core/templates/core/pages/system_status.html:119 +msgid "Status" +msgstr "Стан" + +#: aleksis/core/templates/core/pages/system_status.html:79 +msgid "Time taken" +msgstr "ТриваліÑть" + +#: aleksis/core/templates/core/pages/system_status.html:100 +msgid "seconds" +msgstr "Ñек" + +#: aleksis/core/templates/core/pages/system_status.html:111 +msgid "Celery task results" +msgstr "Результати Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Celery" + +#: aleksis/core/templates/core/pages/system_status.html:116 +#: aleksis/core/templates/templated_email/celery_failure.email:9 +#: aleksis/core/templates/templated_email/celery_failure.email:28 +msgid "Task" +msgstr "ЗавданнÑ" + +#: aleksis/core/templates/core/pages/system_status.html:117 +msgid "ID" +msgstr "ID" + +#: aleksis/core/templates/core/pages/system_status.html:118 +msgid "Date done" +msgstr "Ð§Ð°Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ" + +#: aleksis/core/templates/core/pages/test_pdf.html:7 +#: aleksis/core/templates/core/pages/test_pdf.html:8 +msgid "Test PDF generation" +msgstr "Спроба генерації PDF" + +#: aleksis/core/templates/core/pages/test_pdf.html:14 +msgid "" +"\n" +" This simple view can be used to ensure the correct function of the built-in PDF generation system.\n" +" " +msgstr "" +"\n" +" Цей проÑтий виглÑд допоможе перевірити коректніÑть налаштувань вбудованої ÑиÑтеми генерації PDF.\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:8 +#: aleksis/core/templates/core/partials/announcements.html:35 +#, python-format +msgid "" +"\n" +" Valid for %(from)s\n" +" " +msgstr "" +"\n" +" ДійÑний на %(from)s\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:12 +#, python-format +msgid "" +"\n" +" Valid from %(from)s until %(until)s\n" +" " +msgstr "" +"\n" +" ДійÑний з %(from)s до %(until)s\n" +" " + +#: aleksis/core/templates/core/partials/announcements.html:39 +#, python-format +msgid "" +"\n" +" Valid for %(from)s – %(until)s\n" +" " +msgstr "" +"\n" +" ДійÑний на %(from)s – %(until)s\n" +" " + +#: aleksis/core/templates/core/partials/avatar_content.html:14 +#: aleksis/core/templates/core/partials/avatar_content.html:15 +msgid "Avatar" +msgstr "Ðватар" + +#: aleksis/core/templates/core/partials/avatar_content.html:18 +#: aleksis/core/templates/core/partials/avatar_content.html:19 +msgid "Identicon" +msgstr "Ідентифікатор (іконка)" + +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Changed by" +msgstr "Змінене" + +#: aleksis/core/templates/core/partials/crud_events.html:15 +msgid "Unknown" +msgstr "Ðевідомо" + +#: aleksis/core/templates/core/partials/splash_screen.html:11 +msgid "" +"\n" +" This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue.\n" +" " +msgstr "" + +#: aleksis/core/templates/core/perms/assign.html:12 +#: aleksis/core/templates/core/perms/assign.html:13 +msgid "Assign permission" +msgstr "Призначити дозвіл" + +#: aleksis/core/templates/core/perms/assign.html:17 +msgid "Selected permission" +msgstr "Обраний дозвіл" + +#: aleksis/core/templates/core/perms/assign.html:26 +msgid "Assign" +msgstr "Призначити" + +#: aleksis/core/templates/core/perms/list.html:13 +#: aleksis/core/templates/core/perms/list.html:14 +msgid "Manage permissions" +msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð°Ð¼Ð¸" + +#: aleksis/core/templates/core/perms/list.html:21 +msgid "Assign a new permission" +msgstr "Призначити новий дозвіл" + +#: aleksis/core/templates/core/perms/list.html:25 +msgid "Select" +msgstr "Обрати" + +#: aleksis/core/templates/core/perms/list.html:34 +msgid "Global (user)" +msgstr "Глобально (кориÑтувач)" + +#: aleksis/core/templates/core/perms/list.html:38 +msgid "Global (group)" +msgstr "Глобально (група)" + +#: aleksis/core/templates/core/perms/list.html:42 +msgid "Object (user)" +msgstr "Об'єкт (кориÑтувач)" + +#: aleksis/core/templates/core/perms/list.html:46 +msgid "Object (group)" +msgstr "Об'єкт (група)" + +#: aleksis/core/templates/core/perms/list.html:52 +msgid "Filter permissions" +msgstr "Фільтр дозволів" + +#: aleksis/core/templates/core/perms/list.html:58 +msgid "Update" +msgstr "Оновити" + +#: aleksis/core/templates/core/person/create.html:12 +#: aleksis/core/templates/core/person/create.html:13 +#: aleksis/core/templates/core/person/list.html:17 +msgid "Create person" +msgstr "Створити оÑобу" + +#: aleksis/core/templates/core/person/edit.html:12 +#: aleksis/core/templates/core/person/edit.html:13 +msgid "Edit person" +msgstr "Редагувати оÑобу" + +#: aleksis/core/templates/core/person/list.html:21 +msgid "Filter persons" +msgstr "Фільтр оÑіб" + +#: aleksis/core/templates/core/person/list.html:32 +msgid "Selected persons" +msgstr "Позначені оÑоби" + +#: aleksis/core/templates/core/school_term/create.html:6 +#: aleksis/core/templates/core/school_term/create.html:7 +#: aleksis/core/templates/core/school_term/list.html:14 +msgid "Create school term" +msgstr "Створити Ðавчальний рік" + +#: aleksis/core/templates/core/school_term/edit.html:6 +#: aleksis/core/templates/core/school_term/edit.html:7 +msgid "Edit school term" +msgstr "Редагувати Ðавчальний рік" + +#: aleksis/core/templates/dynamic_preferences/form.html:5 +msgid "Preferences" +msgstr "ВлаÑтивоÑті" + +#: aleksis/core/templates/dynamic_preferences/form.html:9 +msgid "Site preferences" +msgstr "ВлаÑтивоÑті Ñайту" + +#: aleksis/core/templates/dynamic_preferences/form.html:11 +msgid "My preferences" +msgstr "Мої влаÑтивоÑті" + +#: aleksis/core/templates/dynamic_preferences/form.html:13 +#, python-format +msgid "Preferences for %(instance)s" +msgstr "ВлаÑтивоÑті %(instance)s" + +#: aleksis/core/templates/dynamic_preferences/form.html:25 +msgid "Save preferences" +msgstr "Зберегти влаÑтивоÑті" + +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð°" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð°." + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— увімкніть відповідний Ñ‡ÐµÐºÐ±Ð¾ÐºÑ Ð² розділі авторизації на " + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "Ñторінці влаÑтивоÑтей Ñайту" + +#: aleksis/core/templates/invitations/enter.html:7 +msgid "Accept invitation" +msgstr "ПрийнÑти запрошеннÑ" + +#: aleksis/core/templates/invitations/enter.html:21 +msgid "Accept your invitation" +msgstr "ПрийнÑÑ‚Ñ‚Ñ Ð’Ð°ÑˆÐ¾Ð³Ð¾ запрошеннÑ" + +#: aleksis/core/templates/invitations/enter.html:25 +msgid "" +"\n" +" Please enter your invitation code to register\n" +" your new user account:\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñ€ÐµÑ”Ñтрації Вашого нового облікового запиÑу\n" +" напишіть Ñвій код запрошеннÑ:\n" +" " + +#: aleksis/core/templates/invitations/enter.html:37 +msgid "Accept invite" +msgstr "ПрийнÑти запрошеннÑ" + +#: aleksis/core/templates/invitations/forms/_invite.html:9 +#: aleksis/core/templates/invitations/forms/_invite.html:10 +#: aleksis/core/templates/invitations/forms/_invite.html:21 +msgid "Invite" +msgstr "ЗапрошеннÑ" + +#: aleksis/core/templates/invitations/forms/_invite.html:17 +msgid "Invite by email address" +msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÐµÐ».поштою" + +#: aleksis/core/templates/invitations/forms/_invite.html:26 +msgid "Generate invitation code" +msgstr "Створити код запрошеннÑ" + +#: aleksis/core/templates/invitations/forms/_invite.html:29 +msgid "Generate code" +msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð´Ñƒ" + +#: aleksis/core/templates/invitations/forms/_invite.html:33 +msgid "Invitations" +msgstr "ЗапрошеннÑ" + +#: aleksis/core/templates/invitations/messages/invite_accepted.txt:3 +#, python-format +msgid "The invitation for %(email)s has been accepted." +msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ %(email)s було прийнÑте." + +#: aleksis/core/templates/oauth2_provider/application/create.html:5 +#: aleksis/core/templates/oauth2_provider/application/create.html:6 +msgid "Register OAuth2 Application" +msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑƒ OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/create.html:14 +#: aleksis/core/templates/oauth2_provider/application/edit.html:14 +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:24 +#: aleksis/core/templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "СкаÑувати" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:5 +msgid "OAuth2 Application" +msgstr "Додаток OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:39 +msgid "Client id" +msgstr "КлієнтÑьке ID" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:47 +msgid "Client secret" +msgstr "КлієнтÑький Ñекрет" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:55 +msgid "Client type" +msgstr "КлієнтÑький тип" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:63 +msgid "Allowed scopes" +msgstr "Дозволені межі дії" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:71 +msgid "Redirect URIs" +msgstr "ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ URI-адреÑ" + +#: aleksis/core/templates/oauth2_provider/application/detail.html:79 +msgid "Skip Authorisation" +msgstr "ПропуÑтити авторизацію" + +#: aleksis/core/templates/oauth2_provider/application/edit.html:5 +#: aleksis/core/templates/oauth2_provider/application/edit.html:6 +msgid "Edit OAuth2 Application" +msgstr "Редагувати додаток OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/list.html:5 +#: aleksis/core/templates/oauth2_provider/application/list.html:6 +msgid "OAuth2 Applications" +msgstr "Додатки OAuth2" + +#: aleksis/core/templates/oauth2_provider/application/list.html:11 +msgid "Register new application" +msgstr "ЗареєÑтрувати новий додаток" + +#: aleksis/core/templates/oauth2_provider/application/list.html:25 +msgid "No applications defined." +msgstr "Додатки не визначені." + +#: aleksis/core/templates/oauth2_provider/authorize.html:5 +#: aleksis/core/templates/socialaccount/login.html:5 +#: aleksis/core/templates/socialaccount/login.html:6 +msgid "Authorize" +msgstr "Ðвторизувати" + +#: aleksis/core/templates/oauth2_provider/authorize.html:23 +#, python-format +msgid "Authorize %(name)s" +msgstr "Ðвторизувати %(name)s" + +#: aleksis/core/templates/oauth2_provider/authorize.html:25 +msgid "The application requests access to the following scopes:" +msgstr "Додаток запитує дозвіл до таких меж дії:" + +#: aleksis/core/templates/oauth2_provider/authorize.html:40 +msgid "Allow" +msgstr "Дозволити" + +#: aleksis/core/templates/oauth2_provider/authorize.html:43 +msgid "Disallow" +msgstr "Заборонити" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:6 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:23 +msgid "Revoke access" +msgstr "Відкликати доÑтуп" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:12 +msgid "Are you sure to revoke the access for this application?" +msgstr "Ви дійÑно хочете відкликати доÑтуп Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ додатку?" + +#: aleksis/core/templates/oauth2_provider/authorized-token-delete.html:20 +msgid "Revoke" +msgstr "Відкликати" + +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5 +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6 +msgid "Authorized applications" +msgstr "Ðвторизовані додатки" + +#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:33 +msgid "No authorized applications." +msgstr "Ðвторизованих додатків немає." + +#: aleksis/core/templates/offline.html:5 +msgid "Network error" +msgstr "Помилка мережі" + +#: aleksis/core/templates/offline.html:10 +msgid "Page not available offline." +msgstr "" + +#: aleksis/core/templates/offline.html:14 +#, fuzzy +#| msgid "" +#| "\n" +#| " There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi\n" +#| " or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +#| " administrators:\n" +#| " " +msgid "" +"\n" +" This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi\n" +" or mobile data is turned on and try again. If you think you are connected, please contact the system\n" +" administrators:\n" +" " +msgstr "" +"\n" +" Під Ñ‡Ð°Ñ Ð´Ð¾Ñтупу до цієї Ñторінки виникла помилка. Можливо, у Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° з інтернетом. ПереконайтеÑÑ, що Ваш WiFi\n" +" або мобільний інтернет увімкнені та Ñпробуйте ще раз. Якщо Ви думаєте, що із з'єднаннÑм вÑе добре, звернітьÑÑ\n" +" до ÑиÑтемних адмініÑтраторів:\n" +" " + +#: aleksis/core/templates/search/search.html:8 +msgid "Global Search" +msgstr "Глобальний пошук" + +#: aleksis/core/templates/search/search.html:15 +msgid "Search Term" +msgstr "Пошуковий термін" + +#: aleksis/core/templates/search/search.html:26 +msgid "Results" +msgstr "Результати" + +#: aleksis/core/templates/search/search.html:38 +msgid "No search results could be found to your search." +msgstr "За Вашим пошуковим запитом результатів немає." + +#: aleksis/core/templates/search/search.html:87 +msgid "Please enter a search term above." +msgstr "Ðапишіть, будь лаÑка, вище пошуковий термін." + +#: aleksis/core/templates/socialaccount/authentication_error.html:5 +#: aleksis/core/templates/socialaccount/authentication_error.html:6 +msgid "Third-party Account Login Failure" +msgstr "Помилка входу Ñтороннього облікового запиÑу" + +#: aleksis/core/templates/socialaccount/authentication_error.html:13 +msgid "Third-party Account Login Failure." +msgstr "Помилка входу облікового запиÑу третьої Ñторони." + +#: aleksis/core/templates/socialaccount/authentication_error.html:15 +msgid "" +"\n" +" An error occurred while attempting to login via your third-party account.\n" +" Please contact one of your site administrators.\n" +" " +msgstr "" +"\n" +" Під Ñ‡Ð°Ñ Ñпроби входу з Вашим Ñтороннім обліковим запиÑом виникла помилка входу.\n" +" ЗвернітьÑÑ, будь лаÑка, до адмініÑтратора Ñайту.\n" +" " + +#: aleksis/core/templates/socialaccount/connections.html:5 +#: aleksis/core/templates/socialaccount/connections.html:6 +msgid "Connections" +msgstr "З'єднаннÑ" + +#: aleksis/core/templates/socialaccount/connections.html:24 +msgid "Remove" +msgstr "Видалити" + +#: aleksis/core/templates/socialaccount/connections.html:34 +msgid "You currently have no third-party accounts connected to this account." +msgstr "Зараз у Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” облікових запиÑів третіх Ñторін, з'єднаних з цим обліковим запиÑом." + +#: aleksis/core/templates/socialaccount/connections.html:37 +msgid "Add a Third-party Account" +msgstr "Додати Ñторонній обліковий запиÑ" + +#: aleksis/core/templates/socialaccount/login.html:12 +#, python-format +msgid "You are about to connect a new third party account from %(provider)s." +msgstr "Ви приєднуєте новий обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони від %(provider)s." + +#: aleksis/core/templates/socialaccount/login.html:23 +#, python-format +msgid "You are about to sign in using a third party account from %(provider)s." +msgstr "Ви авторизуєтеÑÑ Ð·Ð° допомогою Ñтороннього облікового запиÑу від %(provider)s." + +#: aleksis/core/templates/socialaccount/login.html:28 +msgid "Continue" +msgstr "Продовжити" + +#: aleksis/core/templates/socialaccount/login_cancelled.html:5 +#: aleksis/core/templates/socialaccount/login_cancelled.html:6 +#: aleksis/core/templates/socialaccount/login_cancelled.html:13 +msgid "Login cancelled" +msgstr "Вхід ÑкаÑований" + +#: aleksis/core/templates/socialaccount/login_cancelled.html:15 +#, python-format +msgid "" +"\n" +" You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s\">sign in</a>.\n" +" " +msgstr "" +"\n" +" Схоже, що Ви ÑкаÑували вхід до нашого Ñайту з одним із Ваших облікових запиÑів. Якщо це ÑталоÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ð²Ð¾, Ви можете <a href=\"%(login_url)s\">продовжити вхід тут</a>.\n" +" " + +#: aleksis/core/templates/socialaccount/signup.html:12 +#, python-format +msgid "" +"You are about to use your %(provider_name)s account to login to\n" +" %(site_name)s. As a final step, please complete the following form:" +msgstr "" +"Ви на шлÑху до викориÑÑ‚Ð°Ð½Ð½Ñ Ñвого облікового запиÑу у %(provider_name)s\n" +" Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ на %(site_name)s. Заповніть, будь лаÑка, Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ†ÑŽ форму:" + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:12 +#, python-format +msgid "" +"\n" +" Login with %(name)s\n" +" " +msgstr "" +"\n" +" Вхід з %(name)s\n" +" " + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:21 +#, python-format +msgid "" +"\n" +" Login with %(name)s\n" +" " +msgstr "" +"\n" +" Вхід з %(name)s\n" +" " + +#: aleksis/core/templates/socialaccount/snippets/provider_list.html:30 +msgid "" +"\n" +" No third-party account providers available.\n" +" " +msgstr "" +"\n" +" Провайдери Ñторонніх облікових запиÑів недоÑтупні.\n" +" " + +#: aleksis/core/templates/templated_email/base.email:5 +#: aleksis/core/templates/templated_email/base.email:16 +msgid "Hello" +msgstr "Привіт" + +#: aleksis/core/templates/templated_email/celery_failure.email:4 +#, python-format +msgid "Celery task %(task_name)s failed!" +msgstr "Збій у Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Celery з назвою %(task_name)s!" + +#: aleksis/core/templates/templated_email/celery_failure.email:7 +#, python-format +msgid "the celery task %(task_name)s failed with following information:" +msgstr "у Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Celery %(task_name)s виникла проблема:" + +#: aleksis/core/templates/templated_email/celery_failure.email:10 +#: aleksis/core/templates/templated_email/celery_failure.email:29 +msgid "Task ID" +msgstr "ID завданнÑ" + +#: aleksis/core/templates/templated_email/celery_failure.email:11 +#: aleksis/core/templates/templated_email/celery_failure.email:30 +msgid "Raised exception" +msgstr "Викинутий винÑток" + +#: aleksis/core/templates/templated_email/celery_failure.email:12 +#: aleksis/core/templates/templated_email/celery_failure.email:31 +msgid "Positional arguments" +msgstr "Ðргументи" + +#: aleksis/core/templates/templated_email/celery_failure.email:15 +#: aleksis/core/templates/templated_email/celery_failure.email:38 +msgid "Keyword arguments" +msgstr "Ðргументи з ключовими Ñловами" + +#: aleksis/core/templates/templated_email/celery_failure.email:22 +#, python-format +msgid "" +"\n" +" the celery task %(task_name)s failed with following information:\n" +" " +msgstr "" +"\n" +" у Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Celery %(task_name)s виникла проблема:\n" +" " + +#: aleksis/core/templates/templated_email/data_checks.email:3 +msgid "The system detected some new problems with your data." +msgstr "СиÑтема виÑвила деÑкі нові проблеми з Вашими даними." + +#: aleksis/core/templates/templated_email/data_checks.email:6 +msgid "" +"the system detected some new problems with your data.\n" +"Please take some time to inspect them and solve the issues or mark them as ignored." +msgstr "" +"ÑиÑтема виÑвила деÑкі нові проблеми з Вашими даними.\n" +"Приділіть, будь лаÑка, трохи чаÑу Ð´Ð»Ñ Ñ—Ñ… перевірки та Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ або позначте Ñ—Ñ… Ð´Ð»Ñ Ñ–Ð³Ð½Ð¾Ñ€Ñƒ." + +#: aleksis/core/templates/templated_email/data_checks.email:15 +msgid "" +"\n" +" the system detected some new problems with your data.\n" +" Please take some time to inspect them and solve the issues or mark them as ignored.\n" +" " +msgstr "" +"\n" +" ÑиÑтема виÑвила деÑкі нові проблеми з Вашими даними.\n" +" Приділіть, будь лаÑка, трохи чаÑу Ð´Ð»Ñ Ñ—Ñ… перевірки та Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ або позначте Ñ—Ñ… Ð´Ð»Ñ Ñ–Ð³Ð½Ð¾Ñ€Ñƒ.\n" +" " + +#: aleksis/core/templates/templated_email/data_checks.email:23 +msgid "Problem description" +msgstr "ÐžÐ¿Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸" + +#: aleksis/core/templates/templated_email/data_checks.email:24 +msgid "Count of objects with new problems" +msgstr "КількіÑть об'єктів з новими проблемами" + +#: aleksis/core/templates/templated_email/notification.email:4 +msgid "New notification for" +msgstr "Ðове ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ" + +#: aleksis/core/templates/templated_email/notification.email:6 +#: aleksis/core/templates/templated_email/notification.email:20 +#, python-format +msgid "Hello %(notification_user)s," +msgstr "Привіт, %(notification_user)s," + +#: aleksis/core/templates/templated_email/notification.email:9 +#: aleksis/core/templates/templated_email/notification.email:23 +msgid "we got a new notification for you:" +msgstr "у Ð½Ð°Ñ Ð´Ð»Ñ Ð’Ð°Ñ Ð½Ð¾Ð²Ðµ ÑповіщеннÑ:" + +#: aleksis/core/templates/templated_email/notification.email:15 +#: aleksis/core/templates/templated_email/notification.email:29 +msgid "More information" +msgstr "Більше інформаціЇ" + +#: aleksis/core/templates/templated_email/notification.email:17 +#, python-format +msgid "Sent by %(trans_sender)s at %(trans_created_at)s" +msgstr "ÐадіÑлано %(trans_sender)s о %(trans_created_at)s" + +#: aleksis/core/templates/templated_email/notification.email:34 +#, python-format +msgid "" +"\n" +" Sent by %(trans_sender)s at %(trans_created_at)s\n" +" " +msgstr "" +"\n" +" ÐадіÑлано %(trans_sender)s о %(trans_created_at)s\n" +" " + +#: aleksis/core/templates/templated_email/person_changed.email:4 +#, python-format +msgid "%(person)s changed their data!" +msgstr "%(person)s змінили Ñвої дані!" + +#: aleksis/core/templates/templated_email/person_changed.email:7 +#, python-format +msgid "the person %(person)s recently changed the following fields:" +msgstr "оÑоба %(person)s щойно змінила такі полÑ:" + +#: aleksis/core/templates/templated_email/person_changed.email:15 +#, python-format +msgid "" +"\n" +" the person %(person)s recently changed the following fields:\n" +" " +msgstr "" +"\n" +" оÑоба %(person)s щойно змінила такі полÑ:\n" +" " + +#: aleksis/core/templates/two_factor/_base_focus.html:6 +#: aleksis/core/templates/two_factor/core/otp_required.html:22 +#: aleksis/core/templates/two_factor/core/setup.html:5 +#: aleksis/core/templates/two_factor/profile/profile.html:88 +msgid "Enable Two-Factor Authentication" +msgstr "Увімкнути двох-факторну автентифікацію" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:5 +#: aleksis/core/templates/two_factor/core/backup_tokens.html:9 +#: aleksis/core/templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "Резервні Токени" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" +"\n" +" Резервні токени можуть бути викориÑтані коли Ваші оÑновний та резервний\n" +" телефонні номери не доÑтупні. Резервні токени, що нижче, можуть бути викориÑтані\n" +" Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ на вході. Коли Ви викориÑтаєте уÑÑ– резервні токени, Ви\n" +" зможете згенерувати новий набір резервних токенів. ДійÑними будуть лише токени,\n" +" що нижче.\n" +" " + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" +"\n" +" Роздрукуйте ці токени та збережіть в надійному міÑці.\n" +" " + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "У Ð’Ð°Ñ Ð¿Ð¾ÐºÐ¸ що немає резервних кодів." + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "Ðазад до безпеки облікового запиÑу" + +#: aleksis/core/templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "Створити Токени" + +#: aleksis/core/templates/two_factor/core/login.html:6 +#: aleksis/core/templates/two_factor/core/login.html:32 +#: aleksis/core/templates/two_factor/core/login.html:95 +msgid "Login" +msgstr "Увійти" + +#: aleksis/core/templates/two_factor/core/login.html:27 +#, python-format +msgid "Login for %(name)s" +msgstr "Увійти Ð´Ð»Ñ %(name)s" + +#: aleksis/core/templates/two_factor/core/login.html:30 +msgid "Login with username and password" +msgstr "Увійдіть за допомогою логіна та паролÑ" + +#: aleksis/core/templates/two_factor/core/login.html:38 +msgid "" +"You have no permission to view this page. Please login with an other\n" +" account." +msgstr "" +"Ви не маєте дозволу на переглÑд цієї Ñторінки. Увійдіть, будь лаÑка,\n" +" з іншим обліковим запиÑом." + +#: aleksis/core/templates/two_factor/core/login.html:47 +msgid "Please login with your account to use the external application." +msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ додатку увійдіть, будь лаÑка, у Ñвій обліковий запиÑ." + +#: aleksis/core/templates/two_factor/core/login.html:54 +msgid "Please login to see this page." +msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду цієї Ñторінки, будь лаÑка, увійдіть." + +#: aleksis/core/templates/two_factor/core/login.html:65 +msgid "" +"\n" +" We are calling your phone right now, please enter the\n" +" digits you hear.\n" +" " +msgstr "" +"\n" +" Ми зателефонуємо зараз на Ваш номер. Ðапишіть, будь лаÑка, цифри,\n" +" Ñкі Ви почуєте.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:70 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we\n" +" sent.\n" +" " +msgstr "" +"\n" +" Ми надіÑлали Вам текÑтове повідомленнÑ. Ðапишіть, будь лаÑка, отриманий\n" +" токен.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:75 +msgid "" +"\n" +" Please enter the tokens generated by your token\n" +" generator.\n" +" " +msgstr "" +"\n" +" Ðапишіть, будь лаÑка, токен, з Вашого\n" +" генератора токенів.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:81 +msgid "" +"\n" +" Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ ÑкориÑтайтеÑÑ Ñ„Ð¾Ñ€Ð¼Ð¾ÑŽ Ð´Ð»Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… токенів.\n" +" Ці токени були згенеровані, щоб Ви Ñ—Ñ… роздрукували та зберігали у надійному міÑці.\n" +" Щоб увійти напишіть, будь лаÑка, один з резервних токенів.\n" +" " + +#: aleksis/core/templates/two_factor/core/login.html:109 +msgid "Device currently not available?" +msgstr "Зараз приÑтрій недоÑтупний?" + +#: aleksis/core/templates/two_factor/core/login.html:111 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "Ðбо можете ÑкориÑтатиÑÑ Ð¾Ð´Ð½Ð¸Ð¼ зі Ñвоїх резервних телефонів:" + +#: aleksis/core/templates/two_factor/core/login.html:122 +msgid "As a last resort, you can use a backup token:" +msgstr "Ð’ ÑкоÑті оÑтанньої можливоÑті можете ÑкориÑтатиÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ð¼ токеном:" + +#: aleksis/core/templates/two_factor/core/login.html:125 +msgid "Use Backup Token" +msgstr "СкориÑтатиÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ð¼ токеном" + +#: aleksis/core/templates/two_factor/core/login.html:136 +msgid "Use alternative login options" +msgstr "СкориÑтайтеÑÑ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð¸Ð¼Ð¸ можливоÑÑ‚Ñми Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ" + +#: aleksis/core/templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "Дозвіл відÑутній" + +#: aleksis/core/templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" +"Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду запитуванної Ñторінки, з оглÑду на безпеку, необхідна додаткова\n" +" перевірка кориÑтувача з викориÑтаннÑм двохфакторної автентифікації.\n" +" Ð”Ð»Ñ Ð´Ð¾Ñтупу до цієї Ñторінки Вам потрібно увімкнути ці функції безпеки." + +#: aleksis/core/templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" +"Двохфакторна Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñƒ Вашому обліковому запиÑÑ–\n" +" вимкнена. Ð”Ð»Ñ Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ обліковки увімкніть двохфакторну\n" +" автентифікацію." + +#: aleksis/core/templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "Ðазад" + +#: aleksis/core/templates/two_factor/core/phone_register.html:5 +#: aleksis/core/templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "Додати резервний телефон" + +#: aleksis/core/templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" +"Ви додаєте у Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ð¹ номер телефону.\n" +" Він буде викориÑтаний в разі неможливоÑті реєÑтрації з Вашим\n" +" оÑновним номером." + +#: aleksis/core/templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" +"Ми надіÑлали токен на Ваш номер. Ðапишіть,\n" +" будь лаÑка, отриманий токен." + +#: aleksis/core/templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" +"\n" +" Ви вÑтановлюєте Ð´Ð»Ñ Ñвого облікового запиÑу новий рівень безпеки.\n" +" Ð”Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð´Ð²Ð¾Ñ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації пройдіть декілька кроків\n" +" майÑтра налаштуваннÑ.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" +"\n" +" Оберіть, будь лаÑка, метод автентифікації, Ñкий Ви хочете викориÑтовувати:\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" favourite two factor authentication (TOTP) app to scan the QR code below.\n" +" Then, enter the token generated by the app.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоби почати викориÑÑ‚Ð°Ð½Ð½Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° токенів, ÑкориÑтйтеÑÑ, будь лаÑка, Ñвоїм\n" +" улюбленим додатком Ð´Ð»Ñ Ð´Ð²Ð¾Ñ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації (TOTP) та відÑкануйте QR-код, що нижче.\n" +" ПіÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ напишіть отриманий генератором токен.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" +"\n" +" Ðапишіть, будь лаÑка, номер телефону, на Ñкий Ви хочете\n" +" отримувати текÑтові повідомленнÑ. Ðа наÑтупному кроці він буде перевірений.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" +"\n" +" Ðапишіть, будь лаÑка, номер телефону, на Ñкий Ви хочете\n" +" отримувати дзвінки. Ðа наÑтупному кроці він буде перевірений.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" +"\n" +" Ми зараз телефонуємо на Ваш номер, – напишіть, будь лаÑка, цифри, Ñкі Ви почуєте.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" +"\n" +" Ми надіÑлали Вам текÑтове повідомленнÑ. Ðапишіть, будь лаÑка, отримані токени.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" +"\n" +" Ми помітили, що Ñ–Ñнує проблема з викориÑтаннÑм обраного методу авторизації. ПовернітьÑÑ,\n" +" будь лаÑка, назад, та переконайтеÑÑ, що необхідні дані вказані правильно\n" +" Ñ– Ñпробуйте увійте ще раз, або ж ÑкориÑтайтеÑÑ Ñ–Ð½ÑˆÐ¸Ð¼ варіантом входу. Якщо ж\n" +" проблема залишаєтьÑÑ, звернітьÑÑ Ð´Ð¾ адмініÑтратора Ñайту.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" +"\n" +" Ð”Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— та перевірки Вашого YubiKey напишіть,\n" +" будь лаÑка, нижче токен. Ваш YubiKey буде прив'Ñзаний до Вашого\n" +" облікового запиÑу.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:5 +#: aleksis/core/templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "Двохфакторна Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑƒÑпішно увімкнена" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" +"\n" +" Вітаємо з уÑпішним налаштуваннÑм двохфакторної автентифікації.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:24 +#: aleksis/core/templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "Ðазад до Профілю" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:28 +#: aleksis/core/templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "Створити резервні коди" + +#: aleksis/core/templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" +"\n" +" Між іншим, може так ÑтатиÑÑ, що Ви не матимете доÑтупу до Ñвого оÑновного\n" +" приÑтрою з токенами. Ð”Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²ÐºÐ¸ Ñтворіть резервні коди\n" +" або додайте номер телефону.\n" +" " + +#: aleksis/core/templates/two_factor/core/setup_complete.html:52 +#: aleksis/core/templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "Додати номер телефону" + +#: aleksis/core/templates/two_factor/profile/disable.html:5 +#: aleksis/core/templates/two_factor/profile/disable.html:9 +#: aleksis/core/templates/two_factor/profile/profile.html:63 +#: aleksis/core/templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "Вимкнути двохфакторну автентифікацію" + +#: aleksis/core/templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "Ви вимикаєте двохфакторну автентифікацію. Це знизить захиÑÑ‚ Вашого облікового запиÑу. Ви впевнені?" + +#: aleksis/core/templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "Вимкнути" + +#: aleksis/core/templates/two_factor/profile/profile.html:5 +#: aleksis/core/templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "Безпека облікового запиÑу" + +#: aleksis/core/templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "Токени будуть Ñтворені Вашим генератором токенів." + +#: aleksis/core/templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "ОÑновний метод: %(primary)s" + +#: aleksis/core/templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "Токени будуть Ñтворені Вашим YubiKey." + +#: aleksis/core/templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "Резервні номери телефонів" + +#: aleksis/core/templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" +"Якщо Ваш оÑновний метод не буде доÑтупний, ми зможемо\n" +" надіÑлати резервні токени на вказані нижче телефонні номери." + +#: aleksis/core/templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "СкаÑувати реєÑтрацію" + +#: aleksis/core/templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" +"Якщо у Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” з Ñобою жодного приÑтрою, Ви можете\n" +" отримати доÑтуп з викориÑтаннÑм резервних токенів." + +#: aleksis/core/templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +"\n" +" У Ð’Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð²ÑÑ Ð»Ð¸ÑˆÐµ один резервний токен.\n" +" " +msgstr[1] "" +"\n" +" У Ð’Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¸ÑÑ %(counter)s резервних токени.\n" +" " +msgstr[2] "" +"\n" +" У Ð’Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð¾ÑÑ %(counter)s резервних токенів.\n" +" " +msgstr[3] "" +"\n" +" У Ð’Ð°Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð²ÑÑ %(counter)s резервний токен.\n" +" " + +#: aleksis/core/templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "Показати коди" + +#: aleksis/core/templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" +"\n" +" Хоча ми рішуче заÑтерігаємо Ð’Ð°Ñ Ñ†Ðµ не робити, Ви можете \n" +" також вимкнути двохфакторну автентифікацію Ð´Ð»Ñ Ñвого облікового запиÑу.\n" +" " + +#: aleksis/core/templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" +"\n" +" Двохфакторна Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð´Ð»Ñ Ð’Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу\n" +" не активована. Ð”Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ облікового запиÑу увімкніть\n" +" двохфакторну автентифікацію.\n" +" " + +#: aleksis/core/util/notifications.py:64 +msgid "E-Mail" +msgstr "Ел.пошта" + +#: aleksis/core/util/notifications.py:65 +msgid "SMS" +msgstr "SMS" + +#: aleksis/core/util/pdf.py:151 +msgid "Progress: Generate PDF file" +msgstr "Перебіг: Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ PDF" + +#: aleksis/core/util/pdf.py:152 +msgid "Generating PDF file …" +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ PDF …" + +#: aleksis/core/util/pdf.py:153 +msgid "The PDF file has been generated successfully." +msgstr "Файл PDF уÑпішно Ñтворений." + +#: aleksis/core/util/pdf.py:154 +msgid "There was a problem while generating the PDF file." +msgstr "Під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ PDF виникла проблема." + +#: aleksis/core/util/pdf.py:157 +msgid "Download PDF" +msgstr "Звантажити PDF" + +#: aleksis/core/views.py:278 +msgid "The school term has been created." +msgstr "Ðавчальний рік Ñтворений." + +#: aleksis/core/views.py:290 +msgid "The school term has been saved." +msgstr "Ðавчальний рік збережений." + +#: aleksis/core/views.py:394 +msgid "The child groups were successfully saved." +msgstr "Підлеглі групи збережені." + +#: aleksis/core/views.py:413 aleksis/core/views.py:423 +msgid "The person has been saved." +msgstr "ОÑоба збережена." + +#: aleksis/core/views.py:473 +msgid "The group has been saved." +msgstr "Група збережена." + +#: aleksis/core/views.py:556 +msgid "The announcement has been saved." +msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ðµ." + +#: aleksis/core/views.py:572 +msgid "The announcement has been deleted." +msgstr "ÐžÐ³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ðµ." + +#: aleksis/core/views.py:641 +msgid "The requested preference registry does not exist" +msgstr "Журналу із запитаними влаÑтивоÑÑ‚Ñми не Ñ–Ñнує" + +#: aleksis/core/views.py:660 +msgid "The preferences have been saved successfully." +msgstr "ВлаÑтивоÑті збережені." + +#: aleksis/core/views.py:684 +msgid "The person has been deleted." +msgstr "ОÑоба видалена." + +#: aleksis/core/views.py:698 +msgid "The group has been deleted." +msgstr "Група видалена." + +#: aleksis/core/views.py:730 +msgid "The additional field has been saved." +msgstr "Додаткове поле збережене." + +#: aleksis/core/views.py:765 +msgid "The additional field has been deleted." +msgstr "Додаткове поле видалене." + +#: aleksis/core/views.py:790 +msgid "The group type has been saved." +msgstr "Тип групи збережений." + +#: aleksis/core/views.py:821 +msgid "The group type has been deleted." +msgstr "Тип групи видалений." + +#: aleksis/core/views.py:856 +msgid "Progress: Run data checks" +msgstr "Перебіг: ЗапуÑк перевірки даних" + +#: aleksis/core/views.py:857 +msgid "Run data checks …" +msgstr "ЗапуÑкаєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° даних …" + +#: aleksis/core/views.py:858 +msgid "The data checks were run successfully." +msgstr "Перевірка даних уÑпішно запущена." + +#: aleksis/core/views.py:859 +msgid "There was a problem while running data checks." +msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку перевірки даних виникла проблема." + +#: aleksis/core/views.py:876 +#, python-brace-format +msgid "The solve option '{solve_option_obj.verbose_name}' " +msgstr "Варіант розв'ÑÐ·Ð°Ð½Ð½Ñ \"{solve_option_obj.verbose_name}\" " + +#: aleksis/core/views.py:886 +msgid "The requested solve option does not exist" +msgstr "Запитаний варіант розв'ÑÐ·Ð°Ð½Ð½Ñ Ð½Ðµ Ñ–Ñнує" + +#: aleksis/core/views.py:919 +msgid "The dashboard widget has been saved." +msgstr "Віджет інформпанелі збережений." + +#: aleksis/core/views.py:949 +msgid "The dashboard widget has been created." +msgstr "Віджет інформпанелі Ñтворений." + +#: aleksis/core/views.py:959 +msgid "The dashboard widget has been deleted." +msgstr "Віджет інформпанелі видалений." + +#: aleksis/core/views.py:1030 +msgid "Your dashboard configuration has been saved successfully." +msgstr "Ваша ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð¿Ð°Ð½ÐµÐ»Ñ– збережена." + +#: aleksis/core/views.py:1032 +msgid "The configuration of the default dashboard has been saved successfully." +msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ñ—/Ñтандартної інформпанелі збережена." + +#: aleksis/core/views.py:1103 +#, python-brace-format +msgid "The invitation was successfully created. The invitation code is {code}" +msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно Ñтворене. Код запрошеннÑ: {code}" + +#: aleksis/core/views.py:1200 +msgid "We have successfully assigned the permissions." +msgstr "Ми уÑпішно призначили дозволи." + +#: aleksis/core/views.py:1210 +msgid "The global user permission has been deleted." +msgstr "Глобальний кориÑтувацький дозвіл видалений." + +#: aleksis/core/views.py:1220 +msgid "The global group permission has been deleted." +msgstr "Глобальний груповий дозвіл видалений." + +#: aleksis/core/views.py:1230 +msgid "The object user permission has been deleted." +msgstr "Об'єктний кориÑтувацький дозвіл видалений." + +#: aleksis/core/views.py:1240 +msgid "The object group permission has been deleted." +msgstr "Об'єктний груповий дозвіл видалений." + +#: aleksis/core/views.py:1349 +msgid "The third-party account could not be disconnected because it is the only login method available." +msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони не можна від'єднати оÑкільки він єдиний ÑпоÑіб Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ." + +#: aleksis/core/views.py:1356 +msgid "The third-party account has been successfully disconnected." +msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ‚Ñ€ÐµÑ‚ÑŒÐ¾Ñ— Ñторони уÑпішно від'єднаний." + +#: aleksis/core/views.py:1432 +msgid "Person was invited successfully and an email with further instructions has been send to them." +msgstr "ОÑоба уÑпішно запрошена. ЛиÑÑ‚ з інÑтрукціÑми щодо наÑтупних дій надіÑланий на Ñ—Ñ— ел.пошту." + +#: aleksis/core/views.py:1443 +msgid "Person was already invited." +msgstr "ОÑоба вже була запрошена." + +#~ msgid "Birthday Calendar" +#~ msgstr "Календар Днів ÐародженнÑ" + +#~ msgid "A Calendar of Birthdays" +#~ msgstr "Календар Днів ÐародженнÑ" + +#, python-format +#~ msgid "%(name)s's birthday" +#~ msgstr "%(name)s має День ÐародженнÑ" + +#, python-format +#~ msgid "%(name)s was born on %(birthday)s" +#~ msgstr "%(name)s народивÑÑ(-лаÑÑ) %(birthday)s" + +#~ msgid "Dashboard" +#~ msgstr "Інформпанель" + +#~ msgid "Admin" +#~ msgstr "Ðдмін" + +#~ msgid "Data management" +#~ msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ð¼Ð¸" + +#~ msgid "Configuration" +#~ msgstr "КонфігураціÑ" + +#~ msgid "Backend Admin" +#~ msgstr "ÐдмініÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐºÐµÐ½Ð´Ñƒ" + +#~ msgid "People" +#~ msgstr "Люди" + +#~ msgid "Groups and child groups" +#~ msgstr "Групи та підлеглі групи" + +#~ msgid "Invite person" +#~ msgstr "ЗапроÑити оÑобу" + +#~ msgid "Stop impersonation" +#~ msgstr "Зупинити маÑкуваннÑ" + +#~ msgid "Account" +#~ msgstr "Обліковий запиÑ" + +#~ msgid "2FA" +#~ msgstr "2FA" + +#~ msgid "Third-party accounts" +#~ msgstr "Обліковки третіх Ñторін" + +#~ msgid "Calendar Feeds" +#~ msgstr "Канали календарів" + +#~ msgid "Logout" +#~ msgstr "Вийти" + +#~ msgid "UUID" +#~ msgstr "UUID" + +#~ msgid "Selected ICal feed" +#~ msgstr "Стрічка обраного iCal" + +#~ msgid "Personal Calendar URL" +#~ msgstr "URL-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¾ÑобиÑтого календарÑ" + +#~ msgid "Personal Calendar URLs" +#~ msgstr "URL-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¾ÑобиÑтих календарів" + +#~ msgid "Available languages" +#~ msgstr "ДоÑтупні мови" + +#~ msgid "" +#~ "An unexpected error has\n" +#~ " occured." +#~ msgstr "" +#~ "СталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð°\n" +#~ " помилка." + +#~ msgid "About AlekSIS® — The Free School Information System" +#~ msgstr "Щодо AlekSIS® — The Free School Information System" + +#~ msgid "Imprint" +#~ msgstr "Відбиток" + +#~ msgid "Privacy Policy" +#~ msgstr "Політика приватноÑті" + +#~ msgid "years to" +#~ msgstr "–" + +#~ msgid "years " +#~ msgstr "рр. " + +#~ msgid "Create iCal URL" +#~ msgstr "Створити поÑÐ¸Ð»Ð°Ð½Ð½Ñ iCal" + +#, python-format +#~ msgid "Edit iCal URL %(object)s" +#~ msgstr "Редагувати поÑÐ¸Ð»Ð°Ð½Ð½Ñ iCal %(object)s" + +#~ msgid "ICal Feeds" +#~ msgstr "iCal-Ñтрічки" + +#~ msgid "These are URLs for different Calendar Feeds in the iCal (.ics) format. You can create as many as you want and import them in your calendar software." +#~ msgstr "Тут міÑÑ‚ÑтьÑÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° різні Ñтрічки календарів у форматі iCal (.ics). Ви можете Ñтворити Ñ—Ñ… Ñтільки, Ñкільки Вам необхідно та імпортувати Ñ—Ñ… у ПЗ Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з календарÑми." + +#~ msgid "Your iCal URLs" +#~ msgstr "Ваші поÑÐ¸Ð»Ð°Ð½Ð½Ñ iCal" + +#~ msgid "Recent notifications" +#~ msgstr "Свіжі ÑповіщеннÑ" + +#~ msgid "More information →" +#~ msgstr "Більше інформації →" + +#~ msgid "No notifications available yet." +#~ msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ¸ що не доÑтупні." + +#~ msgid "About AlekSIS®" +#~ msgstr "Щодо AlekSIS®" + +#~ msgid "AlekSIS® – The Free School Information System" +#~ msgstr "AlekSIS® – The Free School Information System" + +#~ msgid "About AlekSIS" +#~ msgstr "Щодо AlekSIS" + +#~ msgid "" +#~ "\n" +#~ " This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used\n" +#~ " to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and\n" +#~ " can be used by anyone.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ð¦Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð° базуєтьÑÑ Ð½Ð° AlekSIS®, веб-інÑтрументі інформаційної ÑиÑтеми Ð´Ð»Ñ Ð½Ð°Ð²Ñ‡Ð°Ð½Ð½Ñ (SIS) за допомогою Ñкої\n" +#~ " можна керувати та/або виÑвітлювати організаційні елементи навчальних закладів. AlekSIS - безплатне ПЗ\n" +#~ " Ñ– ним може кориÑтуватиÑÑ Ð±ÑƒÐ´ÑŒ-хто.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " AlekSIS® – зареєÑтрована торгова марка проекту з відкритим програмним кодом AlekSIS, що предÑтавлена Teckids e.V.\n" +#~ " " + +#~ msgid "Website of AlekSIS" +#~ msgstr "Веб-Ñайт AlekSIS" + +#~ msgid "Source code" +#~ msgstr "Програмний код" + +#~ msgid "Licence information" +#~ msgstr "Ліцензійна інформаціÑ" + +#~ msgid "" +#~ "\n" +#~ " The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence\n" +#~ " information from third-party apps, if installed, refer to the respective components below. The\n" +#~ " licences are marked like this:\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ядро та офіційні додатки AlekSIS ліцензовані EUPL, верÑÑ–Ñ— 1.2 та новіше. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—\n" +#~ " щодо додатків третіх Ñторін, Ñкщо такі вÑтановлені, перейдіть до відповідних компонентів нижче.\n" +#~ " Ці ліцензії мають таку позначку:\n" +#~ " " + +#~ msgid "Free/Open Source Licence" +#~ msgstr "Безкоштовна або Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¾Ð³Ð¾ Коду (Open Source)" + +#~ msgid "Other Licence" +#~ msgstr "Інша ліцензіÑ" + +#~ msgid "Full licence text" +#~ msgstr "Повний текÑÑ‚ ліцензії" + +#~ msgid "More information about the EUPL" +#~ msgstr "Більше інформації щодо EUPL" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " This app is licenced under %(licence)s.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Цей додаток ліцензований під %(licence)s.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " Without activated JavaScript the progress status can't be updated.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Без активованого JavaScript ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð½Ðµ зможе оновлюватиÑÑ.\n" +#~ " " + +#~ msgid "Language" +#~ msgstr "Мова" + +#~ msgid "Select language" +#~ msgstr "Оберіть мову" + +#~ msgid "" +#~ "\n" +#~ " Your administrator account is not linked to any person. Therefore,\n" +#~ " a dummy person has been linked to your account.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ваш адмініÑтративний обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ поєднаний з жодною оÑобою. Через це\n" +#~ " до Вашого облікового запиÑу приєднана фейкова оÑоба.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " Your user account is not linked to a person. This means you\n" +#~ " cannot access any school-related information. Please contact\n" +#~ " the managers of AlekSIS at your school.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ пов'Ñзаний з фізоÑобою. Це означає,\n" +#~ " що Ви не маєте жодного доÑтупу до навчальної інформації. ЗвернітьÑÑ,\n" +#~ " будь лаÑка, до адмініÑтраторів AlekSIS у Вашому навчальному закладі.\n" +#~ " " + +#~ msgid "Impersonate" +#~ msgstr "МаÑкуваннÑ" + +#~ msgid "Invite user" +#~ msgstr "ЗапроÑити кориÑтувача" + +#~ msgid "Contact details" +#~ msgstr "Контактні дані" + +#~ msgid "This person didn't upload a personal photo." +#~ msgstr "Ð¦Ñ Ð¾Ñоба не завантажила оÑобиÑте фото." + +#~ msgid "Children" +#~ msgstr "Діти" + +#~ msgid "Please return to your application and enter this code:" +#~ msgstr "ПовернітьÑÑ, будь лаÑка, до Ñвого додатку та впишіть цей код:" + +#~ msgid "No internet connection." +#~ msgstr "Ðемає інтернет-з'єднаннÑ." + +#~ msgid "The additional_field has been saved." +#~ msgstr "Додаткове поле збережене." + +#~ msgid "The requested PDF file does not exist" +#~ msgstr "Запитаний файл PDF не Ñ–Ñнує" + +#~ msgid "The requested task does not exist or is not accessible" +#~ msgstr "Запитане Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½Ðµ Ñ–Ñнує або не доÑтупне" + +#~ msgid "ICal feed updated successfully" +#~ msgstr "Стрічка iCal уÑпішно оновлена" + +#~ msgid "ICal feed created successfully" +#~ msgstr "Стрічка iCal уÑпішно Ñтворена" + +#~ msgid "iCal Feeds" +#~ msgstr "iCal-Ñтрічки" + +#~ msgid "iCal feed updated successfully" +#~ msgstr "Стрічка iCal уÑпішно оновлена" + +#~ msgid "iCal feed deleted successfully" +#~ msgstr "Стрічка iCal уÑпішно видалена" + +#~ msgid "iCal feed created successfully" +#~ msgstr "Стрічка iCal уÑпішно Ñтворена" diff --git a/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po b/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000000000000000000000000000000000..2e94bca8c985daae37975ff0222ad26f40ec2ed8 --- /dev/null +++ b/aleksis/core/locale/uk/LC_MESSAGES/djangojs.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-22 20:49+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: aleksis/core/static/js/main.js:66 +msgid "Today" +msgstr "Сьогодні" + +#: aleksis/core/static/js/main.js:67 +msgid "Cancel" +msgstr "СкаÑувати" + +#: aleksis/core/static/js/main.js:68 +msgid "OK" +msgstr "OK" + +#~ msgid "This page may contain outdated information since there is no internet connection." +#~ msgstr "Через відÑутніÑть інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ†Ñ Ñторінка може міÑтити заÑтарілу інформацію." diff --git a/aleksis/core/management/__init__.py b/aleksis/core/management/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/aleksis/core/management/commands/convert_urls_to_routes.py b/aleksis/core/management/commands/convert_urls_to_routes.py new file mode 100644 index 0000000000000000000000000000000000000000..e484988ef8bb2c37014daa91d18ab4ee41864255 --- /dev/null +++ b/aleksis/core/management/commands/convert_urls_to_routes.py @@ -0,0 +1,102 @@ +from re import match, sub + +from django.apps import apps +from django.core.management.base import BaseCommand, CommandError + +from aleksis.core.util.core_helpers import get_app_module + + +def camelcase(value: str) -> str: + """Convert a string to camelcase.""" + titled = value.replace("_", " ").title().replace(" ", "") + return titled[0].lower() + titled[1:] + + +class Command(BaseCommand): + help = "Convert Django URLs for an app into vue-router routes" # noqa + + def add_arguments(self, parser): + parser.add_argument("app", type=str) + + def handle(self, *args, **options): + app = options["app"] + app_camel_case = camelcase(app) + + app_config = apps.get_app_config(app) + app_config_name = f"{app_config.__module__}.{app_config.__class__.__name__}" + + # Import urls from app + urls = get_app_module(app_config_name, "urls") + if not urls: + raise CommandError(f"No url patterns found in app {app}") + urlpatterns = urls.urlpatterns + + # Import menu from app and structure as dict by url name + menus = get_app_module(app_config_name, "menus") + menu_by_urls = {} + if "NAV_MENU_CORE" in menus.MENUS: + menu = menus.MENUS["NAV_MENU_CORE"] + menu_by_urls = {m["url"]: m for m in menu} + + for menu_item in menu: + if "submenu" in menu_item: + for submenu_item in menu_item["submenu"]: + menu_by_urls[submenu_item["url"]] = submenu_item + + for url in urlpatterns: + # Convert route name and url pattern to vue-router format + menu = menu_by_urls[url.name] if url.name in menu_by_urls else None + route_name = f"{app_camel_case}.{camelcase(url.name)}" + url_pattern = url.pattern._route + new_url_pattern_list = [] + for url_pattern_part in url_pattern.split("/"): + if match(r"<[\w,:,*]*>", url_pattern_part): + url_pattern_part = sub(r"(<(?P<val>[\w,:,*]*)>)", r":\g<val>", url_pattern_part) + new_url_pattern_list.append(":" + url_pattern_part.split(":")[-1]) + else: + new_url_pattern_list.append(url_pattern_part) + url_pattern = "/".join(new_url_pattern_list) + + # Start building route + route = "{\n" + route += f' path: "{url_pattern}",\n' + route += ( + ' component: () => import("aleksis.core/components/LegacyBaseTemplate.vue"),\n' + ) + route += f' name: "{route_name}",\n' + + if menu: + # Convert icon to Vuetify format + icon = None + if menu.get("vuetify_icon"): + icon = menu["vuetify_icon"] + elif menu.get("svg_icon"): + icon = menu["svg_icon"].replace(":", "-") + elif menu.get("icon"): + icon = "mdi-" + menu["icon"] + + if icon: + icon = icon.replace("_", "-") + + # Get permission for menu item + permission = None + if menu.get("validators"): + possible_validators = [ + v + for v in menu["validators"] + if v[0] == "aleksis.core.util.predicates.permission_validator" + ] + if possible_validators: + permission = possible_validators[0][1] + + route += " meta: {\n" + route += " inMenu: true,\n" + route += f' titleKey: "{menu["name"]}", // Needs manual work\n' + if icon: + route += f' icon: "{icon}",\n' + if permission: + route += f' permission: "{permission}",\n' + route += " },\n" + route += "}," + + print(route) diff --git a/aleksis/core/management/commands/vite.py b/aleksis/core/management/commands/vite.py new file mode 100644 index 0000000000000000000000000000000000000000..57370441b37a9db241a8a8a0bebbd8f8f00f5753 --- /dev/null +++ b/aleksis/core/management/commands/vite.py @@ -0,0 +1,29 @@ +import os + +from django.conf import settings + +from django_yarnpkg.management.base import BaseYarnCommand +from django_yarnpkg.yarn import yarn_adapter + +from ...util.frontend_helpers import run_vite, write_vite_values + + +class Command(BaseYarnCommand): + help = "Create Vite bundles for AlekSIS" # noqa + + def add_arguments(self, parser): + parser.add_argument("command", choices=["build", "serve"], nargs="?", default="build") + parser.add_argument("--no-install", action="store_true", default=False) + + def handle(self, *args, **options): + super(Command, self).handle(*args, **options) + + # Inject settings into Vite + write_vite_values(os.path.join(settings.NODE_MODULES_ROOT, "django-vite-values.json")) + + # Install Node dependencies + if not options["no_install"]: + yarn_adapter.install(settings.YARN_INSTALLED_APPS) + + # Run Vite build + run_vite([options["command"]]) diff --git a/aleksis/core/management/commands/webpack_bundle.py b/aleksis/core/management/commands/webpack_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..1b324ae200e993dba15119fb16335091217d7200 --- /dev/null +++ b/aleksis/core/management/commands/webpack_bundle.py @@ -0,0 +1,16 @@ +import warnings + +from .vite import Command as ViteCommand + + +class Command(ViteCommand): + help = "Create Vite bundles for AlekSIS (legacy command alias)" # noqa + + def handle(self, *args, **options): + warnings.warn( + "webpack_bundle is deprecated and will be removed " + "in AlekSIS-Core 4.0. Use the new vite command instead.", + UserWarning, + ) + + super().handle(*args, **options) diff --git a/aleksis/core/menus.py b/aleksis/core/menus.py deleted file mode 100644 index 7938539c53327936d86d6c08334834e8e2a4fb0a..0000000000000000000000000000000000000000 --- a/aleksis/core/menus.py +++ /dev/null @@ -1,332 +0,0 @@ -from django.conf import settings -from django.utils.translation import gettext_lazy as _ - -from .util.core_helpers import unread_notifications_badge - -MENUS = { - "NAV_MENU_CORE": [ - { - "name": _("Login"), - "url": settings.LOGIN_URL, - "icon": "lock_open", - "validators": ["menu_generator.validators.is_anonymous"], - }, - { - "name": _("Sign up"), - "url": "account_signup", - "icon": "how_to_reg", - "validators": [ - "menu_generator.validators.is_anonymous", - ("aleksis.core.util.predicates.permission_validator", "core.can_register"), - ], - }, - { - "name": _("Accept invitation"), - "url": "enter_invitation_code", - "icon": "vpn_key", - "validators": [ - "menu_generator.validators.is_anonymous", - ("aleksis.core.util.predicates.permission_validator", "core.invite_enabled"), - ], - }, - { - "name": _("Dashboard"), - "url": "index", - "icon": "home", - "validators": [ - ("aleksis.core.util.predicates.permission_validator", "core.view_dashboard_rule") - ], - }, - { - "name": _("Notifications"), - "url": "notifications", - "icon": "notifications", - "badge": unread_notifications_badge, - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_notifications", - ), - ], - }, - { - "name": _("Account"), - "url": "#", - "icon": "person", - "root": True, - "validators": ["menu_generator.validators.is_authenticated"], - "submenu": [ - { - "name": _("Stop impersonation"), - "url": "impersonate-stop", - "icon": "stop", - "validators": [ - "menu_generator.validators.is_authenticated", - "aleksis.core.util.core_helpers.is_impersonate", - ], - }, - { - "name": _("Logout"), - "url": "logout", - "icon": "exit_to_app", - "validators": ["menu_generator.validators.is_authenticated"], - }, - { - "name": _("2FA"), - "url": "two_factor:profile", - "icon": "phonelink_lock", - "validators": [ - "menu_generator.validators.is_authenticated", - ], - }, - { - "name": _("Change password"), - "url": "account_change_password", - "icon": "lock", - "validators": [ - "menu_generator.validators.is_authenticated", - ( - "aleksis.core.util.predicates.permission_validator", - "core.can_change_password", - ), - ], - }, - { - "name": _("Me"), - "url": "person", - "icon": "insert_emoticon", - "validators": [ - "menu_generator.validators.is_authenticated", - "aleksis.core.util.core_helpers.has_person", - ], - }, - { - "name": _("Preferences"), - "url": "preferences_person", - "icon": "settings", - "validators": [ - "menu_generator.validators.is_authenticated", - "aleksis.core.util.core_helpers.has_person", - ], - }, - { - "name": _("Third-party accounts"), - "url": "socialaccount_connections", - "icon": "public", - "validators": [ - "menu_generator.validators.is_authenticated", - "aleksis.core.util.core_helpers.has_person", - ], - }, - { - "name": _("Authorized applications"), - "url": "oauth2_provider:authorized-token-list", - "icon": "touch_app", - "validators": [ - "menu_generator.validators.is_authenticated", - "aleksis.core.util.core_helpers.has_person", - ], - }, - ], - }, - { - "name": _("Admin"), - "url": "#", - "icon": "security", - "validators": [ - ("aleksis.core.util.predicates.permission_validator", "core.view_admin_menu"), - ], - "submenu": [ - { - "name": _("Announcements"), - "url": "announcements", - "icon": "announcement", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_announcements_rule", - ), - ], - }, - { - "name": _("School terms"), - "url": "school_terms", - "icon": "date_range", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_schoolterm_rule", - ), - ], - }, - { - "name": _("Dashboard widgets"), - "url": "dashboard_widgets", - "icon": "dashboard", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_dashboardwidget_rule", - ), - ], - }, - { - "name": _("Data management"), - "url": "data_management", - "icon": "view_list", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.manage_data_rule", - ), - ], - }, - { - "name": _("System status"), - "url": "system_status", - "icon": "power_settings_new", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_system_status_rule", - ), - ], - }, - { - "name": _("Configuration"), - "url": "preferences_site", - "icon": "settings", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.change_site_preferences_rule", - ), - ], - }, - { - "name": _("Data checks"), - "url": "check_data", - "icon": "done_all", - "validators": ["menu_generator.validators.is_superuser"], - }, - { - "name": _("Manage permissions"), - "url": "manage_user_global_permissions", - "icon": "shield", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.manage_permissions", - ), - ], - }, - { - "name": _("Backend Admin"), - "url": "admin:index", - "icon": "settings", - "validators": [ - "menu_generator.validators.is_superuser", - ], - }, - { - "name": _("OAuth2 Applications"), - "url": "oauth2_applications", - "icon": "touch_app", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.list_oauth_applications_rule", - ), - ], - }, - ], - }, - { - "name": _("People"), - "url": "#", - "icon": "people", - "root": True, - "validators": [ - ("aleksis.core.util.predicates.permission_validator", "core.view_people_menu_rule") - ], - "submenu": [ - { - "name": _("Persons"), - "url": "persons", - "icon": "person", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_persons_rule", - ) - ], - }, - { - "name": _("Groups"), - "url": "groups", - "icon": "group", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_groups_rule", - ) - ], - }, - { - "name": _("Group types"), - "url": "group_types", - "icon": "category", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_grouptypes_rule", - ) - ], - }, - { - "name": _("Groups and child groups"), - "url": "groups_child_groups", - "icon": "group_add", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.assign_child_groups_to_groups_rule", - ) - ], - }, - { - "name": _("Additional fields"), - "url": "additional_fields", - "icon": "style", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.view_additionalfields_rule", - ) - ], - }, - { - "name": _("Invite person"), - "url": "invite_person", - "icon": "card_giftcard", - "validators": [ - "menu_generator.validators.is_authenticated", - ("aleksis.core.util.predicates.permission_validator", "core.can_invite"), - ], - }, - ], - }, - ], - "DATA_MANAGEMENT_MENU": [ - { - "name": _("Assign child groups to groups"), - "url": "groups_child_groups", - "validators": [ - ( - "aleksis.core.util.predicates.permission_validator", - "core.assign_child_groups_to_groups_rule", - ) - ], - }, - ], -} diff --git a/aleksis/core/migrations/0036_additionalfields_helptext_required.py b/aleksis/core/migrations/0036_additionalfields_helptext_required.py new file mode 100644 index 0000000000000000000000000000000000000000..9486105645a238f437b0a25eced23e56d7d805c2 --- /dev/null +++ b/aleksis/core/migrations/0036_additionalfields_helptext_required.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2022-02-18 21:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0035_preference_model_unique'), + ] + + operations = [ + migrations.AddField( + model_name='additionalfield', + name='help_text', + field=models.TextField(blank=True, verbose_name='Help text / description'), + ), + migrations.AddField( + model_name='additionalfield', + name='required', + field=models.BooleanField(default=False, verbose_name='Required'), + ), + ] diff --git a/aleksis/core/migrations/0037_add_static_content_widget.py b/aleksis/core/migrations/0037_add_static_content_widget.py new file mode 100644 index 0000000000000000000000000000000000000000..bb4e810a614c1357243bdda4c5ac42b7f844058a --- /dev/null +++ b/aleksis/core/migrations/0037_add_static_content_widget.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.12 on 2022-02-23 18:03 + +import ckeditor.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0036_additionalfields_helptext_required'), + ] + + operations = [ + migrations.CreateModel( + name='StaticContentWidget', + fields=[ + ('dashboardwidget_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.dashboardwidget')), + ('content', ckeditor.fields.RichTextField(verbose_name='Content')), + ], + options={ + 'verbose_name': 'Static content widget', + 'verbose_name_plural': 'Static content widgets', + }, + bases=('core.dashboardwidget',), + ), + ] diff --git a/aleksis/core/migrations/0038_notification_send_at.py b/aleksis/core/migrations/0038_notification_send_at.py new file mode 100644 index 0000000000000000000000000000000000000000..edb96f1e87f143d60477a1578aea5d90226389a8 --- /dev/null +++ b/aleksis/core/migrations/0038_notification_send_at.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-02-23 19:33 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0037_add_static_content_widget'), + ] + + operations = [ + migrations.AddField( + model_name='notification', + name='send_at', + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Send notification at'), + preserve_default=False, + ), + ] diff --git a/aleksis/core/migrations/0039_personal_ical_url.py b/aleksis/core/migrations/0039_personal_ical_url.py new file mode 100644 index 0000000000000000000000000000000000000000..2f997cd3fc47d0766f228eb3751fed0059bbc81e --- /dev/null +++ b/aleksis/core/migrations/0039_personal_ical_url.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.12 on 2022-02-20 21:04 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0038_notification_send_at'), + ] + + operations = [ + migrations.CreateModel( + name='PersonalICalUrl', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='calendar_urls', to='core.person', verbose_name='Person')), + ], + options={ + 'verbose_name': 'Personal Calendar URL', + 'verbose_name_plural': 'Personal Calendar URLs', + }, + ), + ] diff --git a/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py b/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py new file mode 100644 index 0000000000000000000000000000000000000000..c978c3afc0c2faa7004e78466ec6022db44740bd --- /dev/null +++ b/aleksis/core/migrations/0040_oauth_allowed_scopes_max_length_255.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.13 on 2022-04-19 16:50 + +import django.contrib.postgres.fields +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0039_personal_ical_url'), + ] + + operations = [ + migrations.AlterField( + model_name='oauthapplication', + name='allowed_scopes', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, null=True, size=None, verbose_name='Allowed scopes that clients can request'), + ), + ] diff --git a/aleksis/core/migrations/0041_update_gender_choices.py b/aleksis/core/migrations/0041_update_gender_choices.py new file mode 100644 index 0000000000000000000000000000000000000000..f9f3448ae5332da071e44318db97a0649ba487eb --- /dev/null +++ b/aleksis/core/migrations/0041_update_gender_choices.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.13 on 2022-06-05 10:55 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0040_oauth_allowed_scopes_max_length_255'), + ] + + operations = [ + migrations.AlterField( + model_name='person', + name='sex', + field=models.CharField(blank=True, choices=[('f', 'female'), ('m', 'male'), ('x', 'other')], max_length=1, verbose_name='Sex'), + ), + ] diff --git a/aleksis/core/migrations/0042_pdffile_empty.py b/aleksis/core/migrations/0042_pdffile_empty.py new file mode 100644 index 0000000000000000000000000000000000000000..e8055132e11f2deba85ef4ecfa24840c51ce2081 --- /dev/null +++ b/aleksis/core/migrations/0042_pdffile_empty.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.16 on 2022-11-03 11:36 + +from django.db import migrations, models +import django.utils.timezone +import oauth2_provider.generators +import oauth2_provider.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0041_update_gender_choices'), + ] + + operations = [ + migrations.AlterField( + model_name='pdffile', + name='html_file', + field=models.FileField(blank=True, null=True, upload_to='pdfs/', verbose_name='Generated HTML file'), + ), + ] diff --git a/aleksis/core/migrations/0043_task_assignment_meta.py b/aleksis/core/migrations/0043_task_assignment_meta.py new file mode 100644 index 0000000000000000000000000000000000000000..cbacf70ba1e67ad0a1165aad4b6544fc0c7f0353 --- /dev/null +++ b/aleksis/core/migrations/0043_task_assignment_meta.py @@ -0,0 +1,62 @@ +# Generated by Django 3.2.15 on 2022-10-03 18:38 + +from django.db import migrations, models +import django.utils.timezone +import oauth2_provider.generators +import oauth2_provider.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0042_pdffile_empty'), + ] + + operations = [ + migrations.AddField( + model_name='taskuserassignment', + name='additional_button_icon', + field=models.CharField(blank=True, max_length=255, verbose_name='Additional button icon'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='additional_button_title', + field=models.CharField(blank=True, max_length=255, verbose_name='Additional button title'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='additional_button_url', + field=models.URLField(blank=True, verbose_name='Additional button URL'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='back_url', + field=models.URLField(blank=True, verbose_name='Back URL'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='error_message', + field=models.TextField(blank=True, verbose_name='Error message'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='success_message', + field=models.TextField(blank=True, verbose_name='Success message'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='progress_title', + field=models.CharField(blank=True, max_length=255, verbose_name='Progress title'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='redirect_on_success_url', + field=models.URLField(blank=True, verbose_name='Redirect on success URL'), + ), + migrations.AddField( + model_name='taskuserassignment', + name='title', + field=models.CharField(default='Data are processed', max_length=255, verbose_name='Title'), + preserve_default=False, + ), + ] diff --git a/aleksis/core/migrations/0044_task_assignment_result_fetched.py b/aleksis/core/migrations/0044_task_assignment_result_fetched.py new file mode 100644 index 0000000000000000000000000000000000000000..e4aa43a634bb6c702861a8800f7537b978735ee0 --- /dev/null +++ b/aleksis/core/migrations/0044_task_assignment_result_fetched.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.16 on 2022-11-02 19:35 + +import django.utils.timezone +from django.db import migrations, models + +import oauth2_provider.generators +import oauth2_provider.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0043_task_assignment_meta"), + ] + + operations = [ + migrations.AddField( + model_name="taskuserassignment", + name="result_fetched", + field=models.BooleanField(default=False, verbose_name="Result fetched"), + ), + ] diff --git a/aleksis/core/migrations/0045_data_check_result_fix_check_field.py b/aleksis/core/migrations/0045_data_check_result_fix_check_field.py new file mode 100644 index 0000000000000000000000000000000000000000..3d72bd2733cb9b27684b5fc7832749ce42d93c8c --- /dev/null +++ b/aleksis/core/migrations/0045_data_check_result_fix_check_field.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.16 on 2022-12-16 11:50 + +from django.db import migrations, models +import django.utils.timezone +import oauth2_provider.generators +import oauth2_provider.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0044_task_assignment_result_fetched'), + ] + + operations = [ + migrations.RenameField( + model_name='datacheckresult', + old_name='check', + new_name='data_check', + ), + ] diff --git a/aleksis/core/migrations/0046_notification_create_field_icon.py b/aleksis/core/migrations/0046_notification_create_field_icon.py new file mode 100644 index 0000000000000000000000000000000000000000..85d79888e3c2b7e9e2a54a807cade1af683fa6eb --- /dev/null +++ b/aleksis/core/migrations/0046_notification_create_field_icon.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.15 on 2022-12-14 20:34 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0045_data_check_result_fix_check_field'), + ] + + operations = [ + migrations.AddField( + model_name='notification', + name='icon', + field=models.CharField(choices=[('ab-testing', 'ab-testing'), ('abacus', 'abacus'), ('abjad-arabic', 'abjad-arabic'), ('abjad-hebrew', 'abjad-hebrew'), ('abugida-devanagari', 'abugida-devanagari'), ('abugida-thai', 'abugida-thai'), ('access-point', 'access-point'), ('access-point-check', 'access-point-check'), ('access-point-minus', 'access-point-minus'), ('access-point-network', 'access-point-network'), ('access-point-network-off', 'access-point-network-off'), ('access-point-off', 'access-point-off'), ('access-point-plus', 'access-point-plus'), ('access-point-remove', 'access-point-remove'), ('account', 'account'), ('account-alert', 'account-alert'), ('account-alert-outline', 'account-alert-outline'), ('account-arrow-down', 'account-arrow-down'), ('account-arrow-down-outline', 'account-arrow-down-outline'), ('account-arrow-left', 'account-arrow-left'), ('account-arrow-left-outline', 'account-arrow-left-outline'), ('account-arrow-right', 'account-arrow-right'), ('account-arrow-right-outline', 'account-arrow-right-outline'), ('account-arrow-up', 'account-arrow-up'), ('account-arrow-up-outline', 'account-arrow-up-outline'), ('account-badge', 'account-badge'), ('account-badge-outline', 'account-badge-outline'), ('account-box', 'account-box'), ('account-box-multiple', 'account-box-multiple'), ('account-box-multiple-outline', 'account-box-multiple-outline'), ('account-box-outline', 'account-box-outline'), ('account-cancel', 'account-cancel'), ('account-cancel-outline', 'account-cancel-outline'), ('account-card', 'account-card'), ('account-card-outline', 'account-card-outline'), ('account-cash', 'account-cash'), ('account-cash-outline', 'account-cash-outline'), ('account-check', 'account-check'), ('account-check-outline', 'account-check-outline'), ('account-child', 'account-child'), ('account-child-circle', 'account-child-circle'), ('account-child-outline', 'account-child-outline'), ('account-circle', 'account-circle'), ('account-circle-outline', 'account-circle-outline'), ('account-clock', 'account-clock'), ('account-clock-outline', 'account-clock-outline'), ('account-cog', 'account-cog'), ('account-cog-outline', 'account-cog-outline'), ('account-convert', 'account-convert'), ('account-convert-outline', 'account-convert-outline'), ('account-cowboy-hat', 'account-cowboy-hat'), ('account-cowboy-hat-outline', 'account-cowboy-hat-outline'), ('account-credit-card', 'account-credit-card'), ('account-credit-card-outline', 'account-credit-card-outline'), ('account-details', 'account-details'), ('account-details-outline', 'account-details-outline'), ('account-edit', 'account-edit'), ('account-edit-outline', 'account-edit-outline'), ('account-eye', 'account-eye'), ('account-eye-outline', 'account-eye-outline'), ('account-filter', 'account-filter'), ('account-filter-outline', 'account-filter-outline'), ('account-group', 'account-group'), ('account-group-outline', 'account-group-outline'), ('account-hard-hat', 'account-hard-hat'), ('account-hard-hat-outline', 'account-hard-hat-outline'), ('account-heart', 'account-heart'), ('account-heart-outline', 'account-heart-outline'), ('account-injury', 'account-injury'), ('account-injury-outline', 'account-injury-outline'), ('account-key', 'account-key'), ('account-key-outline', 'account-key-outline'), ('account-lock', 'account-lock'), ('account-lock-open', 'account-lock-open'), ('account-lock-open-outline', 'account-lock-open-outline'), ('account-lock-outline', 'account-lock-outline'), ('account-minus', 'account-minus'), ('account-minus-outline', 'account-minus-outline'), ('account-multiple', 'account-multiple'), ('account-multiple-check', 'account-multiple-check'), ('account-multiple-check-outline', 'account-multiple-check-outline'), ('account-multiple-minus', 'account-multiple-minus'), ('account-multiple-minus-outline', 'account-multiple-minus-outline'), ('account-multiple-outline', 'account-multiple-outline'), ('account-multiple-plus', 'account-multiple-plus'), ('account-multiple-plus-outline', 'account-multiple-plus-outline'), ('account-multiple-remove', 'account-multiple-remove'), ('account-multiple-remove-outline', 'account-multiple-remove-outline'), ('account-music', 'account-music'), ('account-music-outline', 'account-music-outline'), ('account-network', 'account-network'), ('account-network-off', 'account-network-off'), ('account-network-off-outline', 'account-network-off-outline'), ('account-network-outline', 'account-network-outline'), ('account-off', 'account-off'), ('account-off-outline', 'account-off-outline'), ('account-outline', 'account-outline'), ('account-plus', 'account-plus'), ('account-plus-outline', 'account-plus-outline'), ('account-question', 'account-question'), ('account-question-outline', 'account-question-outline'), ('account-reactivate', 'account-reactivate'), ('account-reactivate-outline', 'account-reactivate-outline'), ('account-remove', 'account-remove'), ('account-remove-outline', 'account-remove-outline'), ('account-school', 'account-school'), ('account-school-outline', 'account-school-outline'), ('account-search', 'account-search'), ('account-search-outline', 'account-search-outline'), ('account-settings', 'account-settings'), ('account-settings-outline', 'account-settings-outline'), ('account-settings-variant', 'account-settings-variant'), ('account-star', 'account-star'), ('account-star-outline', 'account-star-outline'), ('account-supervisor', 'account-supervisor'), ('account-supervisor-circle', 'account-supervisor-circle'), ('account-supervisor-circle-outline', 'account-supervisor-circle-outline'), ('account-supervisor-outline', 'account-supervisor-outline'), ('account-switch', 'account-switch'), ('account-switch-outline', 'account-switch-outline'), ('account-sync', 'account-sync'), ('account-sync-outline', 'account-sync-outline'), ('account-tie', 'account-tie'), ('account-tie-hat', 'account-tie-hat'), ('account-tie-hat-outline', 'account-tie-hat-outline'), ('account-tie-outline', 'account-tie-outline'), ('account-tie-voice', 'account-tie-voice'), ('account-tie-voice-off', 'account-tie-voice-off'), ('account-tie-voice-off-outline', 'account-tie-voice-off-outline'), ('account-tie-voice-outline', 'account-tie-voice-outline'), ('account-tie-woman', 'account-tie-woman'), ('account-voice', 'account-voice'), ('account-voice-off', 'account-voice-off'), ('account-wrench', 'account-wrench'), ('account-wrench-outline', 'account-wrench-outline'), ('accusoft', 'accusoft'), ('ad-choices', 'ad-choices'), ('adchoices', 'adchoices'), ('adjust', 'adjust'), ('adobe', 'adobe'), ('advertisements', 'advertisements'), ('advertisements-off', 'advertisements-off'), ('air-conditioner', 'air-conditioner'), ('air-filter', 'air-filter'), ('air-horn', 'air-horn'), ('air-humidifier', 'air-humidifier'), ('air-humidifier-off', 'air-humidifier-off'), ('air-purifier', 'air-purifier'), ('air-purifier-off', 'air-purifier-off'), ('airbag', 'airbag'), ('airballoon', 'airballoon'), ('airballoon-outline', 'airballoon-outline'), ('airplane', 'airplane'), ('airplane-alert', 'airplane-alert'), ('airplane-check', 'airplane-check'), ('airplane-clock', 'airplane-clock'), ('airplane-cog', 'airplane-cog'), ('airplane-edit', 'airplane-edit'), ('airplane-landing', 'airplane-landing'), ('airplane-marker', 'airplane-marker'), ('airplane-minus', 'airplane-minus'), ('airplane-off', 'airplane-off'), ('airplane-plus', 'airplane-plus'), ('airplane-remove', 'airplane-remove'), ('airplane-search', 'airplane-search'), ('airplane-settings', 'airplane-settings'), ('airplane-takeoff', 'airplane-takeoff'), ('airport', 'airport'), ('alarm', 'alarm'), ('alarm-bell', 'alarm-bell'), ('alarm-check', 'alarm-check'), ('alarm-light', 'alarm-light'), ('alarm-light-off', 'alarm-light-off'), ('alarm-light-off-outline', 'alarm-light-off-outline'), ('alarm-light-outline', 'alarm-light-outline'), ('alarm-multiple', 'alarm-multiple'), ('alarm-note', 'alarm-note'), ('alarm-note-off', 'alarm-note-off'), ('alarm-off', 'alarm-off'), ('alarm-panel', 'alarm-panel'), ('alarm-panel-outline', 'alarm-panel-outline'), ('alarm-plus', 'alarm-plus'), ('alarm-snooze', 'alarm-snooze'), ('album', 'album'), ('alert', 'alert'), ('alert-box', 'alert-box'), ('alert-box-outline', 'alert-box-outline'), ('alert-circle', 'alert-circle'), ('alert-circle-check', 'alert-circle-check'), ('alert-circle-check-outline', 'alert-circle-check-outline'), ('alert-circle-outline', 'alert-circle-outline'), ('alert-decagram', 'alert-decagram'), ('alert-decagram-outline', 'alert-decagram-outline'), ('alert-minus', 'alert-minus'), ('alert-minus-outline', 'alert-minus-outline'), ('alert-octagon', 'alert-octagon'), ('alert-octagon-outline', 'alert-octagon-outline'), ('alert-octagram', 'alert-octagram'), ('alert-octagram-outline', 'alert-octagram-outline'), ('alert-outline', 'alert-outline'), ('alert-plus', 'alert-plus'), ('alert-plus-outline', 'alert-plus-outline'), ('alert-remove', 'alert-remove'), ('alert-remove-outline', 'alert-remove-outline'), ('alert-rhombus', 'alert-rhombus'), ('alert-rhombus-outline', 'alert-rhombus-outline'), ('alien', 'alien'), ('alien-outline', 'alien-outline'), ('align-horizontal-center', 'align-horizontal-center'), ('align-horizontal-distribute', 'align-horizontal-distribute'), ('align-horizontal-left', 'align-horizontal-left'), ('align-horizontal-right', 'align-horizontal-right'), ('align-vertical-bottom', 'align-vertical-bottom'), ('align-vertical-center', 'align-vertical-center'), ('align-vertical-distribute', 'align-vertical-distribute'), ('align-vertical-top', 'align-vertical-top'), ('all-inclusive', 'all-inclusive'), ('all-inclusive-box', 'all-inclusive-box'), ('all-inclusive-box-outline', 'all-inclusive-box-outline'), ('allergy', 'allergy'), ('allo', 'allo'), ('alpha', 'alpha'), ('alpha-a', 'alpha-a'), ('alpha-a-box', 'alpha-a-box'), ('alpha-a-box-outline', 'alpha-a-box-outline'), ('alpha-a-circle', 'alpha-a-circle'), ('alpha-a-circle-outline', 'alpha-a-circle-outline'), ('alpha-b', 'alpha-b'), ('alpha-b-box', 'alpha-b-box'), ('alpha-b-box-outline', 'alpha-b-box-outline'), ('alpha-b-circle', 'alpha-b-circle'), ('alpha-b-circle-outline', 'alpha-b-circle-outline'), ('alpha-c', 'alpha-c'), ('alpha-c-box', 'alpha-c-box'), ('alpha-c-box-outline', 'alpha-c-box-outline'), ('alpha-c-circle', 'alpha-c-circle'), ('alpha-c-circle-outline', 'alpha-c-circle-outline'), ('alpha-d', 'alpha-d'), ('alpha-d-box', 'alpha-d-box'), ('alpha-d-box-outline', 'alpha-d-box-outline'), ('alpha-d-circle', 'alpha-d-circle'), ('alpha-d-circle-outline', 'alpha-d-circle-outline'), ('alpha-e', 'alpha-e'), ('alpha-e-box', 'alpha-e-box'), ('alpha-e-box-outline', 'alpha-e-box-outline'), ('alpha-e-circle', 'alpha-e-circle'), ('alpha-e-circle-outline', 'alpha-e-circle-outline'), ('alpha-f', 'alpha-f'), ('alpha-f-box', 'alpha-f-box'), ('alpha-f-box-outline', 'alpha-f-box-outline'), ('alpha-f-circle', 'alpha-f-circle'), ('alpha-f-circle-outline', 'alpha-f-circle-outline'), ('alpha-g', 'alpha-g'), ('alpha-g-box', 'alpha-g-box'), ('alpha-g-box-outline', 'alpha-g-box-outline'), ('alpha-g-circle', 'alpha-g-circle'), ('alpha-g-circle-outline', 'alpha-g-circle-outline'), ('alpha-h', 'alpha-h'), ('alpha-h-box', 'alpha-h-box'), ('alpha-h-box-outline', 'alpha-h-box-outline'), ('alpha-h-circle', 'alpha-h-circle'), ('alpha-h-circle-outline', 'alpha-h-circle-outline'), ('alpha-i', 'alpha-i'), ('alpha-i-box', 'alpha-i-box'), ('alpha-i-box-outline', 'alpha-i-box-outline'), ('alpha-i-circle', 'alpha-i-circle'), ('alpha-i-circle-outline', 'alpha-i-circle-outline'), ('alpha-j', 'alpha-j'), ('alpha-j-box', 'alpha-j-box'), ('alpha-j-box-outline', 'alpha-j-box-outline'), ('alpha-j-circle', 'alpha-j-circle'), ('alpha-j-circle-outline', 'alpha-j-circle-outline'), ('alpha-k', 'alpha-k'), ('alpha-k-box', 'alpha-k-box'), ('alpha-k-box-outline', 'alpha-k-box-outline'), ('alpha-k-circle', 'alpha-k-circle'), ('alpha-k-circle-outline', 'alpha-k-circle-outline'), ('alpha-l', 'alpha-l'), ('alpha-l-box', 'alpha-l-box'), ('alpha-l-box-outline', 'alpha-l-box-outline'), ('alpha-l-circle', 'alpha-l-circle'), ('alpha-l-circle-outline', 'alpha-l-circle-outline'), ('alpha-m', 'alpha-m'), ('alpha-m-box', 'alpha-m-box'), ('alpha-m-box-outline', 'alpha-m-box-outline'), ('alpha-m-circle', 'alpha-m-circle'), ('alpha-m-circle-outline', 'alpha-m-circle-outline'), ('alpha-n', 'alpha-n'), ('alpha-n-box', 'alpha-n-box'), ('alpha-n-box-outline', 'alpha-n-box-outline'), ('alpha-n-circle', 'alpha-n-circle'), ('alpha-n-circle-outline', 'alpha-n-circle-outline'), ('alpha-o', 'alpha-o'), ('alpha-o-box', 'alpha-o-box'), ('alpha-o-box-outline', 'alpha-o-box-outline'), ('alpha-o-circle', 'alpha-o-circle'), ('alpha-o-circle-outline', 'alpha-o-circle-outline'), ('alpha-p', 'alpha-p'), ('alpha-p-box', 'alpha-p-box'), ('alpha-p-box-outline', 'alpha-p-box-outline'), ('alpha-p-circle', 'alpha-p-circle'), ('alpha-p-circle-outline', 'alpha-p-circle-outline'), ('alpha-q', 'alpha-q'), ('alpha-q-box', 'alpha-q-box'), ('alpha-q-box-outline', 'alpha-q-box-outline'), ('alpha-q-circle', 'alpha-q-circle'), ('alpha-q-circle-outline', 'alpha-q-circle-outline'), ('alpha-r', 'alpha-r'), ('alpha-r-box', 'alpha-r-box'), ('alpha-r-box-outline', 'alpha-r-box-outline'), ('alpha-r-circle', 'alpha-r-circle'), ('alpha-r-circle-outline', 'alpha-r-circle-outline'), ('alpha-s', 'alpha-s'), ('alpha-s-box', 'alpha-s-box'), ('alpha-s-box-outline', 'alpha-s-box-outline'), ('alpha-s-circle', 'alpha-s-circle'), ('alpha-s-circle-outline', 'alpha-s-circle-outline'), ('alpha-t', 'alpha-t'), ('alpha-t-box', 'alpha-t-box'), ('alpha-t-box-outline', 'alpha-t-box-outline'), ('alpha-t-circle', 'alpha-t-circle'), ('alpha-t-circle-outline', 'alpha-t-circle-outline'), ('alpha-u', 'alpha-u'), ('alpha-u-box', 'alpha-u-box'), ('alpha-u-box-outline', 'alpha-u-box-outline'), ('alpha-u-circle', 'alpha-u-circle'), ('alpha-u-circle-outline', 'alpha-u-circle-outline'), ('alpha-v', 'alpha-v'), ('alpha-v-box', 'alpha-v-box'), ('alpha-v-box-outline', 'alpha-v-box-outline'), ('alpha-v-circle', 'alpha-v-circle'), ('alpha-v-circle-outline', 'alpha-v-circle-outline'), ('alpha-w', 'alpha-w'), ('alpha-w-box', 'alpha-w-box'), ('alpha-w-box-outline', 'alpha-w-box-outline'), ('alpha-w-circle', 'alpha-w-circle'), ('alpha-w-circle-outline', 'alpha-w-circle-outline'), ('alpha-x', 'alpha-x'), ('alpha-x-box', 'alpha-x-box'), ('alpha-x-box-outline', 'alpha-x-box-outline'), ('alpha-x-circle', 'alpha-x-circle'), ('alpha-x-circle-outline', 'alpha-x-circle-outline'), ('alpha-y', 'alpha-y'), ('alpha-y-box', 'alpha-y-box'), ('alpha-y-box-outline', 'alpha-y-box-outline'), ('alpha-y-circle', 'alpha-y-circle'), ('alpha-y-circle-outline', 'alpha-y-circle-outline'), ('alpha-z', 'alpha-z'), ('alpha-z-box', 'alpha-z-box'), ('alpha-z-box-outline', 'alpha-z-box-outline'), ('alpha-z-circle', 'alpha-z-circle'), ('alpha-z-circle-outline', 'alpha-z-circle-outline'), ('alphabet-aurebesh', 'alphabet-aurebesh'), ('alphabet-cyrillic', 'alphabet-cyrillic'), ('alphabet-greek', 'alphabet-greek'), ('alphabet-latin', 'alphabet-latin'), ('alphabet-piqad', 'alphabet-piqad'), ('alphabet-tengwar', 'alphabet-tengwar'), ('alphabetical', 'alphabetical'), ('alphabetical-off', 'alphabetical-off'), ('alphabetical-variant', 'alphabetical-variant'), ('alphabetical-variant-off', 'alphabetical-variant-off'), ('altimeter', 'altimeter'), ('amazon', 'amazon'), ('amazon-alexa', 'amazon-alexa'), ('amazon-drive', 'amazon-drive'), ('ambulance', 'ambulance'), ('ammunition', 'ammunition'), ('ampersand', 'ampersand'), ('amplifier', 'amplifier'), ('amplifier-off', 'amplifier-off'), ('anchor', 'anchor'), ('android', 'android'), ('android-auto', 'android-auto'), ('android-debug-bridge', 'android-debug-bridge'), ('android-head', 'android-head'), ('android-messages', 'android-messages'), ('android-studio', 'android-studio'), ('angle-acute', 'angle-acute'), ('angle-obtuse', 'angle-obtuse'), ('angle-right', 'angle-right'), ('angular', 'angular'), ('angularjs', 'angularjs'), ('animation', 'animation'), ('animation-outline', 'animation-outline'), ('animation-play', 'animation-play'), ('animation-play-outline', 'animation-play-outline'), ('ansible', 'ansible'), ('antenna', 'antenna'), ('anvil', 'anvil'), ('apache-kafka', 'apache-kafka'), ('api', 'api'), ('api-off', 'api-off'), ('apple', 'apple'), ('apple-finder', 'apple-finder'), ('apple-icloud', 'apple-icloud'), ('apple-ios', 'apple-ios'), ('apple-keyboard-caps', 'apple-keyboard-caps'), ('apple-keyboard-command', 'apple-keyboard-command'), ('apple-keyboard-control', 'apple-keyboard-control'), ('apple-keyboard-option', 'apple-keyboard-option'), ('apple-keyboard-shift', 'apple-keyboard-shift'), ('apple-safari', 'apple-safari'), ('application', 'application'), ('application-array', 'application-array'), ('application-array-outline', 'application-array-outline'), ('application-braces', 'application-braces'), ('application-braces-outline', 'application-braces-outline'), ('application-brackets', 'application-brackets'), ('application-brackets-outline', 'application-brackets-outline'), ('application-cog', 'application-cog'), ('application-cog-outline', 'application-cog-outline'), ('application-edit', 'application-edit'), ('application-edit-outline', 'application-edit-outline'), ('application-export', 'application-export'), ('application-import', 'application-import'), ('application-outline', 'application-outline'), ('application-parentheses', 'application-parentheses'), ('application-parentheses-outline', 'application-parentheses-outline'), ('application-settings', 'application-settings'), ('application-settings-outline', 'application-settings-outline'), ('application-variable', 'application-variable'), ('application-variable-outline', 'application-variable-outline'), ('appnet', 'appnet'), ('approximately-equal', 'approximately-equal'), ('approximately-equal-box', 'approximately-equal-box'), ('apps', 'apps'), ('apps-box', 'apps-box'), ('arch', 'arch'), ('archive', 'archive'), ('archive-alert', 'archive-alert'), ('archive-alert-outline', 'archive-alert-outline'), ('archive-arrow-down', 'archive-arrow-down'), ('archive-arrow-down-outline', 'archive-arrow-down-outline'), ('archive-arrow-up', 'archive-arrow-up'), ('archive-arrow-up-outline', 'archive-arrow-up-outline'), ('archive-cancel', 'archive-cancel'), ('archive-cancel-outline', 'archive-cancel-outline'), ('archive-check', 'archive-check'), ('archive-check-outline', 'archive-check-outline'), ('archive-clock', 'archive-clock'), ('archive-clock-outline', 'archive-clock-outline'), ('archive-cog', 'archive-cog'), ('archive-cog-outline', 'archive-cog-outline'), ('archive-edit', 'archive-edit'), ('archive-edit-outline', 'archive-edit-outline'), ('archive-eye', 'archive-eye'), ('archive-eye-outline', 'archive-eye-outline'), ('archive-lock', 'archive-lock'), ('archive-lock-open', 'archive-lock-open'), ('archive-lock-open-outline', 'archive-lock-open-outline'), ('archive-lock-outline', 'archive-lock-outline'), ('archive-marker', 'archive-marker'), ('archive-marker-outline', 'archive-marker-outline'), ('archive-minus', 'archive-minus'), ('archive-minus-outline', 'archive-minus-outline'), ('archive-music', 'archive-music'), ('archive-music-outline', 'archive-music-outline'), ('archive-off', 'archive-off'), ('archive-off-outline', 'archive-off-outline'), ('archive-outline', 'archive-outline'), ('archive-plus', 'archive-plus'), ('archive-plus-outline', 'archive-plus-outline'), ('archive-refresh', 'archive-refresh'), ('archive-refresh-outline', 'archive-refresh-outline'), ('archive-remove', 'archive-remove'), ('archive-remove-outline', 'archive-remove-outline'), ('archive-search', 'archive-search'), ('archive-search-outline', 'archive-search-outline'), ('archive-settings', 'archive-settings'), ('archive-settings-outline', 'archive-settings-outline'), ('archive-star', 'archive-star'), ('archive-star-outline', 'archive-star-outline'), ('archive-sync', 'archive-sync'), ('archive-sync-outline', 'archive-sync-outline'), ('arm-flex', 'arm-flex'), ('arm-flex-outline', 'arm-flex-outline'), ('arrange-bring-forward', 'arrange-bring-forward'), ('arrange-bring-to-front', 'arrange-bring-to-front'), ('arrange-send-backward', 'arrange-send-backward'), ('arrange-send-to-back', 'arrange-send-to-back'), ('arrow-all', 'arrow-all'), ('arrow-bottom-left', 'arrow-bottom-left'), ('arrow-bottom-left-bold-box', 'arrow-bottom-left-bold-box'), ('arrow-bottom-left-bold-box-outline', 'arrow-bottom-left-bold-box-outline'), ('arrow-bottom-left-bold-outline', 'arrow-bottom-left-bold-outline'), ('arrow-bottom-left-thick', 'arrow-bottom-left-thick'), ('arrow-bottom-left-thin', 'arrow-bottom-left-thin'), ('arrow-bottom-left-thin-circle-outline', 'arrow-bottom-left-thin-circle-outline'), ('arrow-bottom-right', 'arrow-bottom-right'), ('arrow-bottom-right-bold-box', 'arrow-bottom-right-bold-box'), ('arrow-bottom-right-bold-box-outline', 'arrow-bottom-right-bold-box-outline'), ('arrow-bottom-right-bold-outline', 'arrow-bottom-right-bold-outline'), ('arrow-bottom-right-thick', 'arrow-bottom-right-thick'), ('arrow-bottom-right-thin', 'arrow-bottom-right-thin'), ('arrow-bottom-right-thin-circle-outline', 'arrow-bottom-right-thin-circle-outline'), ('arrow-collapse', 'arrow-collapse'), ('arrow-collapse-all', 'arrow-collapse-all'), ('arrow-collapse-down', 'arrow-collapse-down'), ('arrow-collapse-horizontal', 'arrow-collapse-horizontal'), ('arrow-collapse-left', 'arrow-collapse-left'), ('arrow-collapse-right', 'arrow-collapse-right'), ('arrow-collapse-up', 'arrow-collapse-up'), ('arrow-collapse-vertical', 'arrow-collapse-vertical'), ('arrow-decision', 'arrow-decision'), ('arrow-decision-auto', 'arrow-decision-auto'), ('arrow-decision-auto-outline', 'arrow-decision-auto-outline'), ('arrow-decision-outline', 'arrow-decision-outline'), ('arrow-down', 'arrow-down'), ('arrow-down-bold', 'arrow-down-bold'), ('arrow-down-bold-box', 'arrow-down-bold-box'), ('arrow-down-bold-box-outline', 'arrow-down-bold-box-outline'), ('arrow-down-bold-circle', 'arrow-down-bold-circle'), ('arrow-down-bold-circle-outline', 'arrow-down-bold-circle-outline'), ('arrow-down-bold-hexagon-outline', 'arrow-down-bold-hexagon-outline'), ('arrow-down-bold-outline', 'arrow-down-bold-outline'), ('arrow-down-box', 'arrow-down-box'), ('arrow-down-circle', 'arrow-down-circle'), ('arrow-down-circle-outline', 'arrow-down-circle-outline'), ('arrow-down-drop-circle', 'arrow-down-drop-circle'), ('arrow-down-drop-circle-outline', 'arrow-down-drop-circle-outline'), ('arrow-down-left', 'arrow-down-left'), ('arrow-down-left-bold', 'arrow-down-left-bold'), ('arrow-down-right', 'arrow-down-right'), ('arrow-down-right-bold', 'arrow-down-right-bold'), ('arrow-down-thick', 'arrow-down-thick'), ('arrow-down-thin', 'arrow-down-thin'), ('arrow-down-thin-circle-outline', 'arrow-down-thin-circle-outline'), ('arrow-expand', 'arrow-expand'), ('arrow-expand-all', 'arrow-expand-all'), ('arrow-expand-down', 'arrow-expand-down'), ('arrow-expand-horizontal', 'arrow-expand-horizontal'), ('arrow-expand-left', 'arrow-expand-left'), ('arrow-expand-right', 'arrow-expand-right'), ('arrow-expand-up', 'arrow-expand-up'), ('arrow-expand-vertical', 'arrow-expand-vertical'), ('arrow-horizontal-lock', 'arrow-horizontal-lock'), ('arrow-left', 'arrow-left'), ('arrow-left-bold', 'arrow-left-bold'), ('arrow-left-bold-box', 'arrow-left-bold-box'), ('arrow-left-bold-box-outline', 'arrow-left-bold-box-outline'), ('arrow-left-bold-circle', 'arrow-left-bold-circle'), ('arrow-left-bold-circle-outline', 'arrow-left-bold-circle-outline'), ('arrow-left-bold-hexagon-outline', 'arrow-left-bold-hexagon-outline'), ('arrow-left-bold-outline', 'arrow-left-bold-outline'), ('arrow-left-bottom', 'arrow-left-bottom'), ('arrow-left-bottom-bold', 'arrow-left-bottom-bold'), ('arrow-left-box', 'arrow-left-box'), ('arrow-left-circle', 'arrow-left-circle'), ('arrow-left-circle-outline', 'arrow-left-circle-outline'), ('arrow-left-drop-circle', 'arrow-left-drop-circle'), ('arrow-left-drop-circle-outline', 'arrow-left-drop-circle-outline'), ('arrow-left-right', 'arrow-left-right'), ('arrow-left-right-bold', 'arrow-left-right-bold'), ('arrow-left-right-bold-outline', 'arrow-left-right-bold-outline'), ('arrow-left-thick', 'arrow-left-thick'), ('arrow-left-thin', 'arrow-left-thin'), ('arrow-left-thin-circle-outline', 'arrow-left-thin-circle-outline'), ('arrow-left-top', 'arrow-left-top'), ('arrow-left-top-bold', 'arrow-left-top-bold'), ('arrow-projectile', 'arrow-projectile'), ('arrow-projectile-multiple', 'arrow-projectile-multiple'), ('arrow-right', 'arrow-right'), ('arrow-right-bold', 'arrow-right-bold'), ('arrow-right-bold-box', 'arrow-right-bold-box'), ('arrow-right-bold-box-outline', 'arrow-right-bold-box-outline'), ('arrow-right-bold-circle', 'arrow-right-bold-circle'), ('arrow-right-bold-circle-outline', 'arrow-right-bold-circle-outline'), ('arrow-right-bold-hexagon-outline', 'arrow-right-bold-hexagon-outline'), ('arrow-right-bold-outline', 'arrow-right-bold-outline'), ('arrow-right-bottom', 'arrow-right-bottom'), ('arrow-right-bottom-bold', 'arrow-right-bottom-bold'), ('arrow-right-box', 'arrow-right-box'), ('arrow-right-circle', 'arrow-right-circle'), ('arrow-right-circle-outline', 'arrow-right-circle-outline'), ('arrow-right-drop-circle', 'arrow-right-drop-circle'), ('arrow-right-drop-circle-outline', 'arrow-right-drop-circle-outline'), ('arrow-right-thick', 'arrow-right-thick'), ('arrow-right-thin', 'arrow-right-thin'), ('arrow-right-thin-circle-outline', 'arrow-right-thin-circle-outline'), ('arrow-right-top', 'arrow-right-top'), ('arrow-right-top-bold', 'arrow-right-top-bold'), ('arrow-split-horizontal', 'arrow-split-horizontal'), ('arrow-split-vertical', 'arrow-split-vertical'), ('arrow-top-left', 'arrow-top-left'), ('arrow-top-left-bold-box', 'arrow-top-left-bold-box'), ('arrow-top-left-bold-box-outline', 'arrow-top-left-bold-box-outline'), ('arrow-top-left-bold-outline', 'arrow-top-left-bold-outline'), ('arrow-top-left-bottom-right', 'arrow-top-left-bottom-right'), ('arrow-top-left-bottom-right-bold', 'arrow-top-left-bottom-right-bold'), ('arrow-top-left-thick', 'arrow-top-left-thick'), ('arrow-top-left-thin', 'arrow-top-left-thin'), ('arrow-top-left-thin-circle-outline', 'arrow-top-left-thin-circle-outline'), ('arrow-top-right', 'arrow-top-right'), ('arrow-top-right-bold-box', 'arrow-top-right-bold-box'), ('arrow-top-right-bold-box-outline', 'arrow-top-right-bold-box-outline'), ('arrow-top-right-bold-outline', 'arrow-top-right-bold-outline'), ('arrow-top-right-bottom-left', 'arrow-top-right-bottom-left'), ('arrow-top-right-bottom-left-bold', 'arrow-top-right-bottom-left-bold'), ('arrow-top-right-thick', 'arrow-top-right-thick'), ('arrow-top-right-thin', 'arrow-top-right-thin'), ('arrow-top-right-thin-circle-outline', 'arrow-top-right-thin-circle-outline'), ('arrow-u-down-left', 'arrow-u-down-left'), ('arrow-u-down-left-bold', 'arrow-u-down-left-bold'), ('arrow-u-down-right', 'arrow-u-down-right'), ('arrow-u-down-right-bold', 'arrow-u-down-right-bold'), ('arrow-u-left-bottom', 'arrow-u-left-bottom'), ('arrow-u-left-bottom-bold', 'arrow-u-left-bottom-bold'), ('arrow-u-left-top', 'arrow-u-left-top'), ('arrow-u-left-top-bold', 'arrow-u-left-top-bold'), ('arrow-u-right-bottom', 'arrow-u-right-bottom'), ('arrow-u-right-bottom-bold', 'arrow-u-right-bottom-bold'), ('arrow-u-right-top', 'arrow-u-right-top'), ('arrow-u-right-top-bold', 'arrow-u-right-top-bold'), ('arrow-u-up-left', 'arrow-u-up-left'), ('arrow-u-up-left-bold', 'arrow-u-up-left-bold'), ('arrow-u-up-right', 'arrow-u-up-right'), ('arrow-u-up-right-bold', 'arrow-u-up-right-bold'), ('arrow-up', 'arrow-up'), ('arrow-up-bold', 'arrow-up-bold'), ('arrow-up-bold-box', 'arrow-up-bold-box'), ('arrow-up-bold-box-outline', 'arrow-up-bold-box-outline'), ('arrow-up-bold-circle', 'arrow-up-bold-circle'), ('arrow-up-bold-circle-outline', 'arrow-up-bold-circle-outline'), ('arrow-up-bold-hexagon-outline', 'arrow-up-bold-hexagon-outline'), ('arrow-up-bold-outline', 'arrow-up-bold-outline'), ('arrow-up-box', 'arrow-up-box'), ('arrow-up-circle', 'arrow-up-circle'), ('arrow-up-circle-outline', 'arrow-up-circle-outline'), ('arrow-up-down', 'arrow-up-down'), ('arrow-up-down-bold', 'arrow-up-down-bold'), ('arrow-up-down-bold-outline', 'arrow-up-down-bold-outline'), ('arrow-up-drop-circle', 'arrow-up-drop-circle'), ('arrow-up-drop-circle-outline', 'arrow-up-drop-circle-outline'), ('arrow-up-left', 'arrow-up-left'), ('arrow-up-left-bold', 'arrow-up-left-bold'), ('arrow-up-right', 'arrow-up-right'), ('arrow-up-right-bold', 'arrow-up-right-bold'), ('arrow-up-thick', 'arrow-up-thick'), ('arrow-up-thin', 'arrow-up-thin'), ('arrow-up-thin-circle-outline', 'arrow-up-thin-circle-outline'), ('arrow-vertical-lock', 'arrow-vertical-lock'), ('artboard', 'artboard'), ('artstation', 'artstation'), ('aspect-ratio', 'aspect-ratio'), ('assistant', 'assistant'), ('asterisk', 'asterisk'), ('asterisk-circle-outline', 'asterisk-circle-outline'), ('at', 'at'), ('atlassian', 'atlassian'), ('atm', 'atm'), ('atom', 'atom'), ('atom-variant', 'atom-variant'), ('attachment', 'attachment'), ('attachment-check', 'attachment-check'), ('attachment-lock', 'attachment-lock'), ('attachment-minus', 'attachment-minus'), ('attachment-off', 'attachment-off'), ('attachment-plus', 'attachment-plus'), ('attachment-remove', 'attachment-remove'), ('atv', 'atv'), ('audio-input-rca', 'audio-input-rca'), ('audio-input-stereo-minijack', 'audio-input-stereo-minijack'), ('audio-input-xlr', 'audio-input-xlr'), ('audio-video', 'audio-video'), ('audio-video-off', 'audio-video-off'), ('augmented-reality', 'augmented-reality'), ('aurora', 'aurora'), ('auto-download', 'auto-download'), ('auto-fix', 'auto-fix'), ('auto-upload', 'auto-upload'), ('autorenew', 'autorenew'), ('autorenew-off', 'autorenew-off'), ('av-timer', 'av-timer'), ('awning', 'awning'), ('awning-outline', 'awning-outline'), ('aws', 'aws'), ('axe', 'axe'), ('axe-battle', 'axe-battle'), ('axis', 'axis'), ('axis-arrow', 'axis-arrow'), ('axis-arrow-info', 'axis-arrow-info'), ('axis-arrow-lock', 'axis-arrow-lock'), ('axis-lock', 'axis-lock'), ('axis-x-arrow', 'axis-x-arrow'), ('axis-x-arrow-lock', 'axis-x-arrow-lock'), ('axis-x-rotate-clockwise', 'axis-x-rotate-clockwise'), ('axis-x-rotate-counterclockwise', 'axis-x-rotate-counterclockwise'), ('axis-x-y-arrow-lock', 'axis-x-y-arrow-lock'), ('axis-y-arrow', 'axis-y-arrow'), ('axis-y-arrow-lock', 'axis-y-arrow-lock'), ('axis-y-rotate-clockwise', 'axis-y-rotate-clockwise'), ('axis-y-rotate-counterclockwise', 'axis-y-rotate-counterclockwise'), ('axis-z-arrow', 'axis-z-arrow'), ('axis-z-arrow-lock', 'axis-z-arrow-lock'), ('axis-z-rotate-clockwise', 'axis-z-rotate-clockwise'), ('axis-z-rotate-counterclockwise', 'axis-z-rotate-counterclockwise'), ('babel', 'babel'), ('baby', 'baby'), ('baby-bottle', 'baby-bottle'), ('baby-bottle-outline', 'baby-bottle-outline'), ('baby-buggy', 'baby-buggy'), ('baby-buggy-off', 'baby-buggy-off'), ('baby-carriage', 'baby-carriage'), ('baby-carriage-off', 'baby-carriage-off'), ('baby-face', 'baby-face'), ('baby-face-outline', 'baby-face-outline'), ('backburger', 'backburger'), ('backspace', 'backspace'), ('backspace-outline', 'backspace-outline'), ('backspace-reverse', 'backspace-reverse'), ('backspace-reverse-outline', 'backspace-reverse-outline'), ('backup-restore', 'backup-restore'), ('bacteria', 'bacteria'), ('bacteria-outline', 'bacteria-outline'), ('badge-account', 'badge-account'), ('badge-account-alert', 'badge-account-alert'), ('badge-account-alert-outline', 'badge-account-alert-outline'), ('badge-account-horizontal', 'badge-account-horizontal'), ('badge-account-horizontal-outline', 'badge-account-horizontal-outline'), ('badge-account-outline', 'badge-account-outline'), ('badminton', 'badminton'), ('bag-carry-on', 'bag-carry-on'), ('bag-carry-on-check', 'bag-carry-on-check'), ('bag-carry-on-off', 'bag-carry-on-off'), ('bag-checked', 'bag-checked'), ('bag-personal', 'bag-personal'), ('bag-personal-off', 'bag-personal-off'), ('bag-personal-off-outline', 'bag-personal-off-outline'), ('bag-personal-outline', 'bag-personal-outline'), ('bag-personal-tag', 'bag-personal-tag'), ('bag-personal-tag-outline', 'bag-personal-tag-outline'), ('bag-suitcase', 'bag-suitcase'), ('bag-suitcase-off', 'bag-suitcase-off'), ('bag-suitcase-off-outline', 'bag-suitcase-off-outline'), ('bag-suitcase-outline', 'bag-suitcase-outline'), ('baguette', 'baguette'), ('balcony', 'balcony'), ('balloon', 'balloon'), ('ballot', 'ballot'), ('ballot-outline', 'ballot-outline'), ('ballot-recount', 'ballot-recount'), ('ballot-recount-outline', 'ballot-recount-outline'), ('bandage', 'bandage'), ('bandcamp', 'bandcamp'), ('bank', 'bank'), ('bank-check', 'bank-check'), ('bank-minus', 'bank-minus'), ('bank-off', 'bank-off'), ('bank-off-outline', 'bank-off-outline'), ('bank-outline', 'bank-outline'), ('bank-plus', 'bank-plus'), ('bank-remove', 'bank-remove'), ('bank-transfer', 'bank-transfer'), ('bank-transfer-in', 'bank-transfer-in'), ('bank-transfer-out', 'bank-transfer-out'), ('barcode', 'barcode'), ('barcode-off', 'barcode-off'), ('barcode-scan', 'barcode-scan'), ('barley', 'barley'), ('barley-off', 'barley-off'), ('barn', 'barn'), ('barrel', 'barrel'), ('barrel-outline', 'barrel-outline'), ('baseball', 'baseball'), ('baseball-bat', 'baseball-bat'), ('baseball-diamond', 'baseball-diamond'), ('baseball-diamond-outline', 'baseball-diamond-outline'), ('basecamp', 'basecamp'), ('bash', 'bash'), ('basket', 'basket'), ('basket-check', 'basket-check'), ('basket-check-outline', 'basket-check-outline'), ('basket-fill', 'basket-fill'), ('basket-minus', 'basket-minus'), ('basket-minus-outline', 'basket-minus-outline'), ('basket-off', 'basket-off'), ('basket-off-outline', 'basket-off-outline'), ('basket-outline', 'basket-outline'), ('basket-plus', 'basket-plus'), ('basket-plus-outline', 'basket-plus-outline'), ('basket-remove', 'basket-remove'), ('basket-remove-outline', 'basket-remove-outline'), ('basket-unfill', 'basket-unfill'), ('basketball', 'basketball'), ('basketball-hoop', 'basketball-hoop'), ('basketball-hoop-outline', 'basketball-hoop-outline'), ('bat', 'bat'), ('bathtub', 'bathtub'), ('bathtub-outline', 'bathtub-outline'), ('battery', 'battery'), ('battery-10', 'battery-10'), ('battery-10-bluetooth', 'battery-10-bluetooth'), ('battery-20', 'battery-20'), ('battery-20-bluetooth', 'battery-20-bluetooth'), ('battery-30', 'battery-30'), ('battery-30-bluetooth', 'battery-30-bluetooth'), ('battery-40', 'battery-40'), ('battery-40-bluetooth', 'battery-40-bluetooth'), ('battery-50', 'battery-50'), ('battery-50-bluetooth', 'battery-50-bluetooth'), ('battery-60', 'battery-60'), ('battery-60-bluetooth', 'battery-60-bluetooth'), ('battery-70', 'battery-70'), ('battery-70-bluetooth', 'battery-70-bluetooth'), ('battery-80', 'battery-80'), ('battery-80-bluetooth', 'battery-80-bluetooth'), ('battery-90', 'battery-90'), ('battery-90-bluetooth', 'battery-90-bluetooth'), ('battery-alert', 'battery-alert'), ('battery-alert-bluetooth', 'battery-alert-bluetooth'), ('battery-alert-variant', 'battery-alert-variant'), ('battery-alert-variant-outline', 'battery-alert-variant-outline'), ('battery-arrow-down', 'battery-arrow-down'), ('battery-arrow-down-outline', 'battery-arrow-down-outline'), ('battery-arrow-up', 'battery-arrow-up'), ('battery-arrow-up-outline', 'battery-arrow-up-outline'), ('battery-bluetooth', 'battery-bluetooth'), ('battery-bluetooth-variant', 'battery-bluetooth-variant'), ('battery-charging', 'battery-charging'), ('battery-charging-10', 'battery-charging-10'), ('battery-charging-100', 'battery-charging-100'), ('battery-charging-20', 'battery-charging-20'), ('battery-charging-30', 'battery-charging-30'), ('battery-charging-40', 'battery-charging-40'), ('battery-charging-50', 'battery-charging-50'), ('battery-charging-60', 'battery-charging-60'), ('battery-charging-70', 'battery-charging-70'), ('battery-charging-80', 'battery-charging-80'), ('battery-charging-90', 'battery-charging-90'), ('battery-charging-high', 'battery-charging-high'), ('battery-charging-low', 'battery-charging-low'), ('battery-charging-medium', 'battery-charging-medium'), ('battery-charging-outline', 'battery-charging-outline'), ('battery-charging-wireless', 'battery-charging-wireless'), ('battery-charging-wireless-10', 'battery-charging-wireless-10'), ('battery-charging-wireless-20', 'battery-charging-wireless-20'), ('battery-charging-wireless-30', 'battery-charging-wireless-30'), ('battery-charging-wireless-40', 'battery-charging-wireless-40'), ('battery-charging-wireless-50', 'battery-charging-wireless-50'), ('battery-charging-wireless-60', 'battery-charging-wireless-60'), ('battery-charging-wireless-70', 'battery-charging-wireless-70'), ('battery-charging-wireless-80', 'battery-charging-wireless-80'), ('battery-charging-wireless-90', 'battery-charging-wireless-90'), ('battery-charging-wireless-alert', 'battery-charging-wireless-alert'), ('battery-charging-wireless-outline', 'battery-charging-wireless-outline'), ('battery-check', 'battery-check'), ('battery-check-outline', 'battery-check-outline'), ('battery-clock', 'battery-clock'), ('battery-clock-outline', 'battery-clock-outline'), ('battery-heart', 'battery-heart'), ('battery-heart-outline', 'battery-heart-outline'), ('battery-heart-variant', 'battery-heart-variant'), ('battery-high', 'battery-high'), ('battery-lock', 'battery-lock'), ('battery-lock-open', 'battery-lock-open'), ('battery-low', 'battery-low'), ('battery-medium', 'battery-medium'), ('battery-minus', 'battery-minus'), ('battery-minus-outline', 'battery-minus-outline'), ('battery-minus-variant', 'battery-minus-variant'), ('battery-negative', 'battery-negative'), ('battery-off', 'battery-off'), ('battery-off-outline', 'battery-off-outline'), ('battery-outline', 'battery-outline'), ('battery-plus', 'battery-plus'), ('battery-plus-outline', 'battery-plus-outline'), ('battery-plus-variant', 'battery-plus-variant'), ('battery-positive', 'battery-positive'), ('battery-remove', 'battery-remove'), ('battery-remove-outline', 'battery-remove-outline'), ('battery-standard', 'battery-standard'), ('battery-sync', 'battery-sync'), ('battery-sync-outline', 'battery-sync-outline'), ('battery-unknown', 'battery-unknown'), ('battery-unknown-bluetooth', 'battery-unknown-bluetooth'), ('battlenet', 'battlenet'), ('beach', 'beach'), ('beaker', 'beaker'), ('beaker-alert', 'beaker-alert'), ('beaker-alert-outline', 'beaker-alert-outline'), ('beaker-check', 'beaker-check'), ('beaker-check-outline', 'beaker-check-outline'), ('beaker-minus', 'beaker-minus'), ('beaker-minus-outline', 'beaker-minus-outline'), ('beaker-outline', 'beaker-outline'), ('beaker-plus', 'beaker-plus'), ('beaker-plus-outline', 'beaker-plus-outline'), ('beaker-question', 'beaker-question'), ('beaker-question-outline', 'beaker-question-outline'), ('beaker-remove', 'beaker-remove'), ('beaker-remove-outline', 'beaker-remove-outline'), ('beam', 'beam'), ('beats', 'beats'), ('bed', 'bed'), ('bed-clock', 'bed-clock'), ('bed-double', 'bed-double'), ('bed-double-outline', 'bed-double-outline'), ('bed-empty', 'bed-empty'), ('bed-king', 'bed-king'), ('bed-king-outline', 'bed-king-outline'), ('bed-outline', 'bed-outline'), ('bed-queen', 'bed-queen'), ('bed-queen-outline', 'bed-queen-outline'), ('bed-single', 'bed-single'), ('bed-single-outline', 'bed-single-outline'), ('bee', 'bee'), ('bee-flower', 'bee-flower'), ('beehive-off-outline', 'beehive-off-outline'), ('beehive-outline', 'beehive-outline'), ('beekeeper', 'beekeeper'), ('beer', 'beer'), ('beer-outline', 'beer-outline'), ('behance', 'behance'), ('bell', 'bell'), ('bell-alert', 'bell-alert'), ('bell-alert-outline', 'bell-alert-outline'), ('bell-badge', 'bell-badge'), ('bell-badge-outline', 'bell-badge-outline'), ('bell-cancel', 'bell-cancel'), ('bell-cancel-outline', 'bell-cancel-outline'), ('bell-check', 'bell-check'), ('bell-check-outline', 'bell-check-outline'), ('bell-circle', 'bell-circle'), ('bell-circle-outline', 'bell-circle-outline'), ('bell-cog', 'bell-cog'), ('bell-cog-outline', 'bell-cog-outline'), ('bell-minus', 'bell-minus'), ('bell-minus-outline', 'bell-minus-outline'), ('bell-off', 'bell-off'), ('bell-off-outline', 'bell-off-outline'), ('bell-outline', 'bell-outline'), ('bell-plus', 'bell-plus'), ('bell-plus-outline', 'bell-plus-outline'), ('bell-remove', 'bell-remove'), ('bell-remove-outline', 'bell-remove-outline'), ('bell-ring', 'bell-ring'), ('bell-ring-outline', 'bell-ring-outline'), ('bell-sleep', 'bell-sleep'), ('bell-sleep-outline', 'bell-sleep-outline'), ('beta', 'beta'), ('betamax', 'betamax'), ('biathlon', 'biathlon'), ('bicycle', 'bicycle'), ('bicycle-basket', 'bicycle-basket'), ('bicycle-cargo', 'bicycle-cargo'), ('bicycle-electric', 'bicycle-electric'), ('bicycle-penny-farthing', 'bicycle-penny-farthing'), ('bike', 'bike'), ('bike-fast', 'bike-fast'), ('billboard', 'billboard'), ('billiards', 'billiards'), ('billiards-rack', 'billiards-rack'), ('binoculars', 'binoculars'), ('bio', 'bio'), ('biohazard', 'biohazard'), ('bird', 'bird'), ('bitbucket', 'bitbucket'), ('bitcoin', 'bitcoin'), ('black-mesa', 'black-mesa'), ('blackberry', 'blackberry'), ('blender', 'blender'), ('blender-outline', 'blender-outline'), ('blender-software', 'blender-software'), ('blinds', 'blinds'), ('blinds-horizontal', 'blinds-horizontal'), ('blinds-horizontal-closed', 'blinds-horizontal-closed'), ('blinds-open', 'blinds-open'), ('blinds-vertical', 'blinds-vertical'), ('blinds-vertical-closed', 'blinds-vertical-closed'), ('block-helper', 'block-helper'), ('blogger', 'blogger'), ('blood-bag', 'blood-bag'), ('bluetooth', 'bluetooth'), ('bluetooth-audio', 'bluetooth-audio'), ('bluetooth-connect', 'bluetooth-connect'), ('bluetooth-off', 'bluetooth-off'), ('bluetooth-settings', 'bluetooth-settings'), ('bluetooth-transfer', 'bluetooth-transfer'), ('blur', 'blur'), ('blur-linear', 'blur-linear'), ('blur-off', 'blur-off'), ('blur-radial', 'blur-radial'), ('bolt', 'bolt'), ('bomb', 'bomb'), ('bomb-off', 'bomb-off'), ('bone', 'bone'), ('bone-off', 'bone-off'), ('book', 'book'), ('book-account', 'book-account'), ('book-account-outline', 'book-account-outline'), ('book-alert', 'book-alert'), ('book-alert-outline', 'book-alert-outline'), ('book-alphabet', 'book-alphabet'), ('book-arrow-down', 'book-arrow-down'), ('book-arrow-down-outline', 'book-arrow-down-outline'), ('book-arrow-left', 'book-arrow-left'), ('book-arrow-left-outline', 'book-arrow-left-outline'), ('book-arrow-right', 'book-arrow-right'), ('book-arrow-right-outline', 'book-arrow-right-outline'), ('book-arrow-up', 'book-arrow-up'), ('book-arrow-up-outline', 'book-arrow-up-outline'), ('book-cancel', 'book-cancel'), ('book-cancel-outline', 'book-cancel-outline'), ('book-check', 'book-check'), ('book-check-outline', 'book-check-outline'), ('book-clock', 'book-clock'), ('book-clock-outline', 'book-clock-outline'), ('book-cog', 'book-cog'), ('book-cog-outline', 'book-cog-outline'), ('book-cross', 'book-cross'), ('book-edit', 'book-edit'), ('book-edit-outline', 'book-edit-outline'), ('book-education', 'book-education'), ('book-education-outline', 'book-education-outline'), ('book-heart', 'book-heart'), ('book-heart-outline', 'book-heart-outline'), ('book-information-variant', 'book-information-variant'), ('book-lock', 'book-lock'), ('book-lock-open', 'book-lock-open'), ('book-lock-open-outline', 'book-lock-open-outline'), ('book-lock-outline', 'book-lock-outline'), ('book-marker', 'book-marker'), ('book-marker-outline', 'book-marker-outline'), ('book-minus', 'book-minus'), ('book-minus-multiple', 'book-minus-multiple'), ('book-minus-multiple-outline', 'book-minus-multiple-outline'), ('book-minus-outline', 'book-minus-outline'), ('book-multiple', 'book-multiple'), ('book-multiple-minus', 'book-multiple-minus'), ('book-multiple-outline', 'book-multiple-outline'), ('book-multiple-plus', 'book-multiple-plus'), ('book-multiple-remove', 'book-multiple-remove'), ('book-multiple-variant', 'book-multiple-variant'), ('book-music', 'book-music'), ('book-music-outline', 'book-music-outline'), ('book-off', 'book-off'), ('book-off-outline', 'book-off-outline'), ('book-open', 'book-open'), ('book-open-blank-variant', 'book-open-blank-variant'), ('book-open-outline', 'book-open-outline'), ('book-open-page-variant', 'book-open-page-variant'), ('book-open-page-variant-outline', 'book-open-page-variant-outline'), ('book-open-variant', 'book-open-variant'), ('book-outline', 'book-outline'), ('book-play', 'book-play'), ('book-play-outline', 'book-play-outline'), ('book-plus', 'book-plus'), ('book-plus-multiple', 'book-plus-multiple'), ('book-plus-multiple-outline', 'book-plus-multiple-outline'), ('book-plus-outline', 'book-plus-outline'), ('book-refresh', 'book-refresh'), ('book-refresh-outline', 'book-refresh-outline'), ('book-remove', 'book-remove'), ('book-remove-multiple', 'book-remove-multiple'), ('book-remove-multiple-outline', 'book-remove-multiple-outline'), ('book-remove-outline', 'book-remove-outline'), ('book-search', 'book-search'), ('book-search-outline', 'book-search-outline'), ('book-settings', 'book-settings'), ('book-settings-outline', 'book-settings-outline'), ('book-sync', 'book-sync'), ('book-sync-outline', 'book-sync-outline'), ('book-variant', 'book-variant'), ('book-variant-multiple', 'book-variant-multiple'), ('bookmark', 'bookmark'), ('bookmark-box', 'bookmark-box'), ('bookmark-box-multiple', 'bookmark-box-multiple'), ('bookmark-box-multiple-outline', 'bookmark-box-multiple-outline'), ('bookmark-box-outline', 'bookmark-box-outline'), ('bookmark-check', 'bookmark-check'), ('bookmark-check-outline', 'bookmark-check-outline'), ('bookmark-minus', 'bookmark-minus'), ('bookmark-minus-outline', 'bookmark-minus-outline'), ('bookmark-multiple', 'bookmark-multiple'), ('bookmark-multiple-outline', 'bookmark-multiple-outline'), ('bookmark-music', 'bookmark-music'), ('bookmark-music-outline', 'bookmark-music-outline'), ('bookmark-off', 'bookmark-off'), ('bookmark-off-outline', 'bookmark-off-outline'), ('bookmark-outline', 'bookmark-outline'), ('bookmark-plus', 'bookmark-plus'), ('bookmark-plus-outline', 'bookmark-plus-outline'), ('bookmark-remove', 'bookmark-remove'), ('bookmark-remove-outline', 'bookmark-remove-outline'), ('bookshelf', 'bookshelf'), ('boom-gate', 'boom-gate'), ('boom-gate-alert', 'boom-gate-alert'), ('boom-gate-alert-outline', 'boom-gate-alert-outline'), ('boom-gate-arrow-down', 'boom-gate-arrow-down'), ('boom-gate-arrow-down-outline', 'boom-gate-arrow-down-outline'), ('boom-gate-arrow-up', 'boom-gate-arrow-up'), ('boom-gate-arrow-up-outline', 'boom-gate-arrow-up-outline'), ('boom-gate-outline', 'boom-gate-outline'), ('boom-gate-up', 'boom-gate-up'), ('boom-gate-up-outline', 'boom-gate-up-outline'), ('boombox', 'boombox'), ('boomerang', 'boomerang'), ('bootstrap', 'bootstrap'), ('border-all', 'border-all'), ('border-all-variant', 'border-all-variant'), ('border-bottom', 'border-bottom'), ('border-bottom-variant', 'border-bottom-variant'), ('border-color', 'border-color'), ('border-horizontal', 'border-horizontal'), ('border-inside', 'border-inside'), ('border-left', 'border-left'), ('border-left-variant', 'border-left-variant'), ('border-none', 'border-none'), ('border-none-variant', 'border-none-variant'), ('border-outside', 'border-outside'), ('border-radius', 'border-radius'), ('border-right', 'border-right'), ('border-right-variant', 'border-right-variant'), ('border-style', 'border-style'), ('border-top', 'border-top'), ('border-top-variant', 'border-top-variant'), ('border-vertical', 'border-vertical'), ('bottle-soda', 'bottle-soda'), ('bottle-soda-classic', 'bottle-soda-classic'), ('bottle-soda-classic-outline', 'bottle-soda-classic-outline'), ('bottle-soda-outline', 'bottle-soda-outline'), ('bottle-tonic', 'bottle-tonic'), ('bottle-tonic-outline', 'bottle-tonic-outline'), ('bottle-tonic-plus', 'bottle-tonic-plus'), ('bottle-tonic-plus-outline', 'bottle-tonic-plus-outline'), ('bottle-tonic-skull', 'bottle-tonic-skull'), ('bottle-tonic-skull-outline', 'bottle-tonic-skull-outline'), ('bottle-wine', 'bottle-wine'), ('bottle-wine-outline', 'bottle-wine-outline'), ('bow-arrow', 'bow-arrow'), ('bow-tie', 'bow-tie'), ('bowl', 'bowl'), ('bowl-mix', 'bowl-mix'), ('bowl-mix-outline', 'bowl-mix-outline'), ('bowl-outline', 'bowl-outline'), ('bowling', 'bowling'), ('box', 'box'), ('box-cutter', 'box-cutter'), ('box-cutter-off', 'box-cutter-off'), ('box-download', 'box-download'), ('box-shadow', 'box-shadow'), ('box-upload', 'box-upload'), ('boxing-glove', 'boxing-glove'), ('boxing-gloves', 'boxing-gloves'), ('braille', 'braille'), ('brain', 'brain'), ('bread-slice', 'bread-slice'), ('bread-slice-outline', 'bread-slice-outline'), ('bridge', 'bridge'), ('briefcase', 'briefcase'), ('briefcase-account', 'briefcase-account'), ('briefcase-account-outline', 'briefcase-account-outline'), ('briefcase-arrow-left-right', 'briefcase-arrow-left-right'), ('briefcase-arrow-left-right-outline', 'briefcase-arrow-left-right-outline'), ('briefcase-arrow-up-down', 'briefcase-arrow-up-down'), ('briefcase-arrow-up-down-outline', 'briefcase-arrow-up-down-outline'), ('briefcase-check', 'briefcase-check'), ('briefcase-check-outline', 'briefcase-check-outline'), ('briefcase-clock', 'briefcase-clock'), ('briefcase-clock-outline', 'briefcase-clock-outline'), ('briefcase-download', 'briefcase-download'), ('briefcase-download-outline', 'briefcase-download-outline'), ('briefcase-edit', 'briefcase-edit'), ('briefcase-edit-outline', 'briefcase-edit-outline'), ('briefcase-eye', 'briefcase-eye'), ('briefcase-eye-outline', 'briefcase-eye-outline'), ('briefcase-minus', 'briefcase-minus'), ('briefcase-minus-outline', 'briefcase-minus-outline'), ('briefcase-off', 'briefcase-off'), ('briefcase-off-outline', 'briefcase-off-outline'), ('briefcase-outline', 'briefcase-outline'), ('briefcase-plus', 'briefcase-plus'), ('briefcase-plus-outline', 'briefcase-plus-outline'), ('briefcase-remove', 'briefcase-remove'), ('briefcase-remove-outline', 'briefcase-remove-outline'), ('briefcase-search', 'briefcase-search'), ('briefcase-search-outline', 'briefcase-search-outline'), ('briefcase-upload', 'briefcase-upload'), ('briefcase-upload-outline', 'briefcase-upload-outline'), ('briefcase-variant', 'briefcase-variant'), ('briefcase-variant-off', 'briefcase-variant-off'), ('briefcase-variant-off-outline', 'briefcase-variant-off-outline'), ('briefcase-variant-outline', 'briefcase-variant-outline'), ('brightness', 'brightness'), ('brightness-1', 'brightness-1'), ('brightness-2', 'brightness-2'), ('brightness-3', 'brightness-3'), ('brightness-4', 'brightness-4'), ('brightness-5', 'brightness-5'), ('brightness-6', 'brightness-6'), ('brightness-7', 'brightness-7'), ('brightness-auto', 'brightness-auto'), ('brightness-percent', 'brightness-percent'), ('broadcast', 'broadcast'), ('broadcast-off', 'broadcast-off'), ('broom', 'broom'), ('brush', 'brush'), ('brush-off', 'brush-off'), ('brush-outline', 'brush-outline'), ('brush-variant', 'brush-variant'), ('bucket', 'bucket'), ('bucket-outline', 'bucket-outline'), ('buffer', 'buffer'), ('buffet', 'buffet'), ('bug', 'bug'), ('bug-check', 'bug-check'), ('bug-check-outline', 'bug-check-outline'), ('bug-outline', 'bug-outline'), ('bug-pause', 'bug-pause'), ('bug-pause-outline', 'bug-pause-outline'), ('bug-play', 'bug-play'), ('bug-play-outline', 'bug-play-outline'), ('bug-stop', 'bug-stop'), ('bug-stop-outline', 'bug-stop-outline'), ('bugle', 'bugle'), ('bulkhead-light', 'bulkhead-light'), ('bulldozer', 'bulldozer'), ('bullet', 'bullet'), ('bulletin-board', 'bulletin-board'), ('bullhorn', 'bullhorn'), ('bullhorn-outline', 'bullhorn-outline'), ('bullhorn-variant', 'bullhorn-variant'), ('bullhorn-variant-outline', 'bullhorn-variant-outline'), ('bullseye', 'bullseye'), ('bullseye-arrow', 'bullseye-arrow'), ('bulma', 'bulma'), ('bunk-bed', 'bunk-bed'), ('bunk-bed-outline', 'bunk-bed-outline'), ('bus', 'bus'), ('bus-alert', 'bus-alert'), ('bus-articulated-end', 'bus-articulated-end'), ('bus-articulated-front', 'bus-articulated-front'), ('bus-clock', 'bus-clock'), ('bus-double-decker', 'bus-double-decker'), ('bus-electric', 'bus-electric'), ('bus-marker', 'bus-marker'), ('bus-multiple', 'bus-multiple'), ('bus-school', 'bus-school'), ('bus-side', 'bus-side'), ('bus-stop', 'bus-stop'), ('bus-stop-covered', 'bus-stop-covered'), ('bus-stop-uncovered', 'bus-stop-uncovered'), ('butterfly', 'butterfly'), ('butterfly-outline', 'butterfly-outline'), ('button-cursor', 'button-cursor'), ('button-pointer', 'button-pointer'), ('cabin-a-frame', 'cabin-a-frame'), ('cable-data', 'cable-data'), ('cached', 'cached'), ('cactus', 'cactus'), ('cake', 'cake'), ('cake-layered', 'cake-layered'), ('cake-variant', 'cake-variant'), ('cake-variant-outline', 'cake-variant-outline'), ('calculator', 'calculator'), ('calculator-off', 'calculator-off'), ('calculator-variant', 'calculator-variant'), ('calculator-variant-outline', 'calculator-variant-outline'), ('calendar', 'calendar'), ('calendar-account', 'calendar-account'), ('calendar-account-outline', 'calendar-account-outline'), ('calendar-alert', 'calendar-alert'), ('calendar-alert-outline', 'calendar-alert-outline'), ('calendar-arrow-left', 'calendar-arrow-left'), ('calendar-arrow-right', 'calendar-arrow-right'), ('calendar-badge', 'calendar-badge'), ('calendar-badge-outline', 'calendar-badge-outline'), ('calendar-blank', 'calendar-blank'), ('calendar-blank-multiple', 'calendar-blank-multiple'), ('calendar-blank-outline', 'calendar-blank-outline'), ('calendar-check', 'calendar-check'), ('calendar-check-outline', 'calendar-check-outline'), ('calendar-clock', 'calendar-clock'), ('calendar-clock-outline', 'calendar-clock-outline'), ('calendar-collapse-horizontal', 'calendar-collapse-horizontal'), ('calendar-collapse-horizontal-outline', 'calendar-collapse-horizontal-outline'), ('calendar-cursor', 'calendar-cursor'), ('calendar-cursor-outline', 'calendar-cursor-outline'), ('calendar-edit', 'calendar-edit'), ('calendar-edit-outline', 'calendar-edit-outline'), ('calendar-end', 'calendar-end'), ('calendar-end-outline', 'calendar-end-outline'), ('calendar-expand-horizontal', 'calendar-expand-horizontal'), ('calendar-expand-horizontal-outline', 'calendar-expand-horizontal-outline'), ('calendar-export', 'calendar-export'), ('calendar-export-outline', 'calendar-export-outline'), ('calendar-filter', 'calendar-filter'), ('calendar-filter-outline', 'calendar-filter-outline'), ('calendar-heart', 'calendar-heart'), ('calendar-heart-outline', 'calendar-heart-outline'), ('calendar-import', 'calendar-import'), ('calendar-import-outline', 'calendar-import-outline'), ('calendar-lock', 'calendar-lock'), ('calendar-lock-open', 'calendar-lock-open'), ('calendar-lock-open-outline', 'calendar-lock-open-outline'), ('calendar-lock-outline', 'calendar-lock-outline'), ('calendar-minus', 'calendar-minus'), ('calendar-minus-outline', 'calendar-minus-outline'), ('calendar-month', 'calendar-month'), ('calendar-month-outline', 'calendar-month-outline'), ('calendar-multiple', 'calendar-multiple'), ('calendar-multiple-check', 'calendar-multiple-check'), ('calendar-multiselect', 'calendar-multiselect'), ('calendar-multiselect-outline', 'calendar-multiselect-outline'), ('calendar-outline', 'calendar-outline'), ('calendar-plus', 'calendar-plus'), ('calendar-plus-outline', 'calendar-plus-outline'), ('calendar-question', 'calendar-question'), ('calendar-question-outline', 'calendar-question-outline'), ('calendar-range', 'calendar-range'), ('calendar-range-outline', 'calendar-range-outline'), ('calendar-refresh', 'calendar-refresh'), ('calendar-refresh-outline', 'calendar-refresh-outline'), ('calendar-remove', 'calendar-remove'), ('calendar-remove-outline', 'calendar-remove-outline'), ('calendar-search', 'calendar-search'), ('calendar-search-outline', 'calendar-search-outline'), ('calendar-select', 'calendar-select'), ('calendar-star', 'calendar-star'), ('calendar-star-outline', 'calendar-star-outline'), ('calendar-start', 'calendar-start'), ('calendar-start-outline', 'calendar-start-outline'), ('calendar-sync', 'calendar-sync'), ('calendar-sync-outline', 'calendar-sync-outline'), ('calendar-text', 'calendar-text'), ('calendar-text-outline', 'calendar-text-outline'), ('calendar-today', 'calendar-today'), ('calendar-today-outline', 'calendar-today-outline'), ('calendar-week', 'calendar-week'), ('calendar-week-begin', 'calendar-week-begin'), ('calendar-week-begin-outline', 'calendar-week-begin-outline'), ('calendar-week-end', 'calendar-week-end'), ('calendar-week-end-outline', 'calendar-week-end-outline'), ('calendar-week-outline', 'calendar-week-outline'), ('calendar-weekend', 'calendar-weekend'), ('calendar-weekend-outline', 'calendar-weekend-outline'), ('call-made', 'call-made'), ('call-merge', 'call-merge'), ('call-missed', 'call-missed'), ('call-received', 'call-received'), ('call-split', 'call-split'), ('camcorder', 'camcorder'), ('camcorder-off', 'camcorder-off'), ('camera', 'camera'), ('camera-account', 'camera-account'), ('camera-burst', 'camera-burst'), ('camera-control', 'camera-control'), ('camera-document', 'camera-document'), ('camera-document-off', 'camera-document-off'), ('camera-enhance', 'camera-enhance'), ('camera-enhance-outline', 'camera-enhance-outline'), ('camera-flip', 'camera-flip'), ('camera-flip-outline', 'camera-flip-outline'), ('camera-focus', 'camera-focus'), ('camera-front', 'camera-front'), ('camera-front-variant', 'camera-front-variant'), ('camera-gopro', 'camera-gopro'), ('camera-image', 'camera-image'), ('camera-iris', 'camera-iris'), ('camera-lock', 'camera-lock'), ('camera-lock-outline', 'camera-lock-outline'), ('camera-marker', 'camera-marker'), ('camera-marker-outline', 'camera-marker-outline'), ('camera-metering-center', 'camera-metering-center'), ('camera-metering-matrix', 'camera-metering-matrix'), ('camera-metering-partial', 'camera-metering-partial'), ('camera-metering-spot', 'camera-metering-spot'), ('camera-off', 'camera-off'), ('camera-off-outline', 'camera-off-outline'), ('camera-outline', 'camera-outline'), ('camera-party-mode', 'camera-party-mode'), ('camera-plus', 'camera-plus'), ('camera-plus-outline', 'camera-plus-outline'), ('camera-rear', 'camera-rear'), ('camera-rear-variant', 'camera-rear-variant'), ('camera-retake', 'camera-retake'), ('camera-retake-outline', 'camera-retake-outline'), ('camera-switch', 'camera-switch'), ('camera-switch-outline', 'camera-switch-outline'), ('camera-timer', 'camera-timer'), ('camera-wireless', 'camera-wireless'), ('camera-wireless-outline', 'camera-wireless-outline'), ('campfire', 'campfire'), ('cancel', 'cancel'), ('candelabra', 'candelabra'), ('candelabra-fire', 'candelabra-fire'), ('candle', 'candle'), ('candy', 'candy'), ('candy-off', 'candy-off'), ('candy-off-outline', 'candy-off-outline'), ('candy-outline', 'candy-outline'), ('candycane', 'candycane'), ('cannabis', 'cannabis'), ('cannabis-off', 'cannabis-off'), ('caps-lock', 'caps-lock'), ('car', 'car'), ('car-2-plus', 'car-2-plus'), ('car-3-plus', 'car-3-plus'), ('car-arrow-left', 'car-arrow-left'), ('car-arrow-right', 'car-arrow-right'), ('car-back', 'car-back'), ('car-battery', 'car-battery'), ('car-brake-abs', 'car-brake-abs'), ('car-brake-alert', 'car-brake-alert'), ('car-brake-fluid-level', 'car-brake-fluid-level'), ('car-brake-hold', 'car-brake-hold'), ('car-brake-low-pressure', 'car-brake-low-pressure'), ('car-brake-parking', 'car-brake-parking'), ('car-brake-retarder', 'car-brake-retarder'), ('car-brake-temperature', 'car-brake-temperature'), ('car-brake-worn-linings', 'car-brake-worn-linings'), ('car-child-seat', 'car-child-seat'), ('car-clock', 'car-clock'), ('car-clutch', 'car-clutch'), ('car-cog', 'car-cog'), ('car-connected', 'car-connected'), ('car-convertable', 'car-convertable'), ('car-convertible', 'car-convertible'), ('car-coolant-level', 'car-coolant-level'), ('car-cruise-control', 'car-cruise-control'), ('car-defrost-front', 'car-defrost-front'), ('car-defrost-rear', 'car-defrost-rear'), ('car-door', 'car-door'), ('car-door-lock', 'car-door-lock'), ('car-electric', 'car-electric'), ('car-electric-outline', 'car-electric-outline'), ('car-emergency', 'car-emergency'), ('car-esp', 'car-esp'), ('car-estate', 'car-estate'), ('car-hatchback', 'car-hatchback'), ('car-info', 'car-info'), ('car-key', 'car-key'), ('car-lifted-pickup', 'car-lifted-pickup'), ('car-light-alert', 'car-light-alert'), ('car-light-dimmed', 'car-light-dimmed'), ('car-light-fog', 'car-light-fog'), ('car-light-high', 'car-light-high'), ('car-limousine', 'car-limousine'), ('car-multiple', 'car-multiple'), ('car-off', 'car-off'), ('car-outline', 'car-outline'), ('car-parking-lights', 'car-parking-lights'), ('car-pickup', 'car-pickup'), ('car-search', 'car-search'), ('car-search-outline', 'car-search-outline'), ('car-seat', 'car-seat'), ('car-seat-cooler', 'car-seat-cooler'), ('car-seat-heater', 'car-seat-heater'), ('car-select', 'car-select'), ('car-settings', 'car-settings'), ('car-shift-pattern', 'car-shift-pattern'), ('car-side', 'car-side'), ('car-speed-limiter', 'car-speed-limiter'), ('car-sports', 'car-sports'), ('car-tire-alert', 'car-tire-alert'), ('car-traction-control', 'car-traction-control'), ('car-turbocharger', 'car-turbocharger'), ('car-wash', 'car-wash'), ('car-windshield', 'car-windshield'), ('car-windshield-outline', 'car-windshield-outline'), ('car-wireless', 'car-wireless'), ('car-wrench', 'car-wrench'), ('carabiner', 'carabiner'), ('caravan', 'caravan'), ('card', 'card'), ('card-account-details', 'card-account-details'), ('card-account-details-outline', 'card-account-details-outline'), ('card-account-details-star', 'card-account-details-star'), ('card-account-details-star-outline', 'card-account-details-star-outline'), ('card-account-mail', 'card-account-mail'), ('card-account-mail-outline', 'card-account-mail-outline'), ('card-account-phone', 'card-account-phone'), ('card-account-phone-outline', 'card-account-phone-outline'), ('card-bulleted', 'card-bulleted'), ('card-bulleted-off', 'card-bulleted-off'), ('card-bulleted-off-outline', 'card-bulleted-off-outline'), ('card-bulleted-outline', 'card-bulleted-outline'), ('card-bulleted-settings', 'card-bulleted-settings'), ('card-bulleted-settings-outline', 'card-bulleted-settings-outline'), ('card-minus', 'card-minus'), ('card-minus-outline', 'card-minus-outline'), ('card-multiple', 'card-multiple'), ('card-multiple-outline', 'card-multiple-outline'), ('card-off', 'card-off'), ('card-off-outline', 'card-off-outline'), ('card-outline', 'card-outline'), ('card-plus', 'card-plus'), ('card-plus-outline', 'card-plus-outline'), ('card-remove', 'card-remove'), ('card-remove-outline', 'card-remove-outline'), ('card-search', 'card-search'), ('card-search-outline', 'card-search-outline'), ('card-text', 'card-text'), ('card-text-outline', 'card-text-outline'), ('cards', 'cards'), ('cards-club', 'cards-club'), ('cards-club-outline', 'cards-club-outline'), ('cards-diamond', 'cards-diamond'), ('cards-diamond-outline', 'cards-diamond-outline'), ('cards-heart', 'cards-heart'), ('cards-heart-outline', 'cards-heart-outline'), ('cards-outline', 'cards-outline'), ('cards-playing', 'cards-playing'), ('cards-playing-club', 'cards-playing-club'), ('cards-playing-club-multiple', 'cards-playing-club-multiple'), ('cards-playing-club-multiple-outline', 'cards-playing-club-multiple-outline'), ('cards-playing-club-outline', 'cards-playing-club-outline'), ('cards-playing-diamond', 'cards-playing-diamond'), ('cards-playing-diamond-multiple', 'cards-playing-diamond-multiple'), ('cards-playing-diamond-multiple-outline', 'cards-playing-diamond-multiple-outline'), ('cards-playing-diamond-outline', 'cards-playing-diamond-outline'), ('cards-playing-heart', 'cards-playing-heart'), ('cards-playing-heart-multiple', 'cards-playing-heart-multiple'), ('cards-playing-heart-multiple-outline', 'cards-playing-heart-multiple-outline'), ('cards-playing-heart-outline', 'cards-playing-heart-outline'), ('cards-playing-outline', 'cards-playing-outline'), ('cards-playing-spade', 'cards-playing-spade'), ('cards-playing-spade-multiple', 'cards-playing-spade-multiple'), ('cards-playing-spade-multiple-outline', 'cards-playing-spade-multiple-outline'), ('cards-playing-spade-outline', 'cards-playing-spade-outline'), ('cards-spade', 'cards-spade'), ('cards-spade-outline', 'cards-spade-outline'), ('cards-variant', 'cards-variant'), ('carrot', 'carrot'), ('cart', 'cart'), ('cart-arrow-down', 'cart-arrow-down'), ('cart-arrow-right', 'cart-arrow-right'), ('cart-arrow-up', 'cart-arrow-up'), ('cart-check', 'cart-check'), ('cart-heart', 'cart-heart'), ('cart-minus', 'cart-minus'), ('cart-off', 'cart-off'), ('cart-outline', 'cart-outline'), ('cart-percent', 'cart-percent'), ('cart-plus', 'cart-plus'), ('cart-remove', 'cart-remove'), ('cart-variant', 'cart-variant'), ('case-sensitive-alt', 'case-sensitive-alt'), ('cash', 'cash'), ('cash-100', 'cash-100'), ('cash-check', 'cash-check'), ('cash-clock', 'cash-clock'), ('cash-fast', 'cash-fast'), ('cash-lock', 'cash-lock'), ('cash-lock-open', 'cash-lock-open'), ('cash-marker', 'cash-marker'), ('cash-minus', 'cash-minus'), ('cash-multiple', 'cash-multiple'), ('cash-plus', 'cash-plus'), ('cash-refund', 'cash-refund'), ('cash-register', 'cash-register'), ('cash-remove', 'cash-remove'), ('cash-sync', 'cash-sync'), ('cash-usd', 'cash-usd'), ('cash-usd-outline', 'cash-usd-outline'), ('cassette', 'cassette'), ('cast', 'cast'), ('cast-audio', 'cast-audio'), ('cast-audio-variant', 'cast-audio-variant'), ('cast-connected', 'cast-connected'), ('cast-education', 'cast-education'), ('cast-off', 'cast-off'), ('cast-variant', 'cast-variant'), ('castle', 'castle'), ('cat', 'cat'), ('cctv', 'cctv'), ('cctv-off', 'cctv-off'), ('ceiling-fan', 'ceiling-fan'), ('ceiling-fan-light', 'ceiling-fan-light'), ('ceiling-light', 'ceiling-light'), ('ceiling-light-multiple', 'ceiling-light-multiple'), ('ceiling-light-multiple-outline', 'ceiling-light-multiple-outline'), ('ceiling-light-outline', 'ceiling-light-outline'), ('cellphone', 'cellphone'), ('cellphone-android', 'cellphone-android'), ('cellphone-arrow-down', 'cellphone-arrow-down'), ('cellphone-arrow-down-variant', 'cellphone-arrow-down-variant'), ('cellphone-basic', 'cellphone-basic'), ('cellphone-charging', 'cellphone-charging'), ('cellphone-check', 'cellphone-check'), ('cellphone-cog', 'cellphone-cog'), ('cellphone-dock', 'cellphone-dock'), ('cellphone-information', 'cellphone-information'), ('cellphone-iphone', 'cellphone-iphone'), ('cellphone-key', 'cellphone-key'), ('cellphone-link', 'cellphone-link'), ('cellphone-link-off', 'cellphone-link-off'), ('cellphone-lock', 'cellphone-lock'), ('cellphone-marker', 'cellphone-marker'), ('cellphone-message', 'cellphone-message'), ('cellphone-message-off', 'cellphone-message-off'), ('cellphone-nfc', 'cellphone-nfc'), ('cellphone-nfc-off', 'cellphone-nfc-off'), ('cellphone-off', 'cellphone-off'), ('cellphone-play', 'cellphone-play'), ('cellphone-remove', 'cellphone-remove'), ('cellphone-screenshot', 'cellphone-screenshot'), ('cellphone-settings', 'cellphone-settings'), ('cellphone-sound', 'cellphone-sound'), ('cellphone-text', 'cellphone-text'), ('cellphone-wireless', 'cellphone-wireless'), ('centos', 'centos'), ('certificate', 'certificate'), ('certificate-outline', 'certificate-outline'), ('chair-rolling', 'chair-rolling'), ('chair-school', 'chair-school'), ('chandelier', 'chandelier'), ('charity', 'charity'), ('chart-arc', 'chart-arc'), ('chart-areaspline', 'chart-areaspline'), ('chart-areaspline-variant', 'chart-areaspline-variant'), ('chart-bar', 'chart-bar'), ('chart-bar-stacked', 'chart-bar-stacked'), ('chart-bell-curve', 'chart-bell-curve'), ('chart-bell-curve-cumulative', 'chart-bell-curve-cumulative'), ('chart-box', 'chart-box'), ('chart-box-outline', 'chart-box-outline'), ('chart-box-plus-outline', 'chart-box-plus-outline'), ('chart-bubble', 'chart-bubble'), ('chart-donut', 'chart-donut'), ('chart-donut-variant', 'chart-donut-variant'), ('chart-gantt', 'chart-gantt'), ('chart-histogram', 'chart-histogram'), ('chart-line', 'chart-line'), ('chart-line-stacked', 'chart-line-stacked'), ('chart-line-variant', 'chart-line-variant'), ('chart-multiline', 'chart-multiline'), ('chart-multiple', 'chart-multiple'), ('chart-pie', 'chart-pie'), ('chart-ppf', 'chart-ppf'), ('chart-sankey', 'chart-sankey'), ('chart-sankey-variant', 'chart-sankey-variant'), ('chart-scatter-plot', 'chart-scatter-plot'), ('chart-scatter-plot-hexbin', 'chart-scatter-plot-hexbin'), ('chart-timeline', 'chart-timeline'), ('chart-timeline-variant', 'chart-timeline-variant'), ('chart-timeline-variant-shimmer', 'chart-timeline-variant-shimmer'), ('chart-tree', 'chart-tree'), ('chart-waterfall', 'chart-waterfall'), ('chat', 'chat'), ('chat-alert', 'chat-alert'), ('chat-alert-outline', 'chat-alert-outline'), ('chat-minus', 'chat-minus'), ('chat-minus-outline', 'chat-minus-outline'), ('chat-outline', 'chat-outline'), ('chat-plus', 'chat-plus'), ('chat-plus-outline', 'chat-plus-outline'), ('chat-processing', 'chat-processing'), ('chat-processing-outline', 'chat-processing-outline'), ('chat-question', 'chat-question'), ('chat-question-outline', 'chat-question-outline'), ('chat-remove', 'chat-remove'), ('chat-remove-outline', 'chat-remove-outline'), ('chat-sleep', 'chat-sleep'), ('chat-sleep-outline', 'chat-sleep-outline'), ('check', 'check'), ('check-all', 'check-all'), ('check-bold', 'check-bold'), ('check-bookmark', 'check-bookmark'), ('check-circle', 'check-circle'), ('check-circle-outline', 'check-circle-outline'), ('check-decagram', 'check-decagram'), ('check-decagram-outline', 'check-decagram-outline'), ('check-network', 'check-network'), ('check-network-outline', 'check-network-outline'), ('check-outline', 'check-outline'), ('check-underline', 'check-underline'), ('check-underline-circle', 'check-underline-circle'), ('check-underline-circle-outline', 'check-underline-circle-outline'), ('checkbook', 'checkbook'), ('checkbox-blank', 'checkbox-blank'), ('checkbox-blank-badge', 'checkbox-blank-badge'), ('checkbox-blank-badge-outline', 'checkbox-blank-badge-outline'), ('checkbox-blank-circle', 'checkbox-blank-circle'), ('checkbox-blank-circle-outline', 'checkbox-blank-circle-outline'), ('checkbox-blank-off', 'checkbox-blank-off'), ('checkbox-blank-off-outline', 'checkbox-blank-off-outline'), ('checkbox-blank-outline', 'checkbox-blank-outline'), ('checkbox-indeterminate', 'checkbox-indeterminate'), ('checkbox-intermediate', 'checkbox-intermediate'), ('checkbox-intermediate-variant', 'checkbox-intermediate-variant'), ('checkbox-marked', 'checkbox-marked'), ('checkbox-marked-circle', 'checkbox-marked-circle'), ('checkbox-marked-circle-outline', 'checkbox-marked-circle-outline'), ('checkbox-marked-circle-plus-outline', 'checkbox-marked-circle-plus-outline'), ('checkbox-marked-outline', 'checkbox-marked-outline'), ('checkbox-multiple-blank', 'checkbox-multiple-blank'), ('checkbox-multiple-blank-circle', 'checkbox-multiple-blank-circle'), ('checkbox-multiple-blank-circle-outline', 'checkbox-multiple-blank-circle-outline'), ('checkbox-multiple-blank-outline', 'checkbox-multiple-blank-outline'), ('checkbox-multiple-marked', 'checkbox-multiple-marked'), ('checkbox-multiple-marked-circle', 'checkbox-multiple-marked-circle'), ('checkbox-multiple-marked-circle-outline', 'checkbox-multiple-marked-circle-outline'), ('checkbox-multiple-marked-outline', 'checkbox-multiple-marked-outline'), ('checkbox-multiple-outline', 'checkbox-multiple-outline'), ('checkbox-outline', 'checkbox-outline'), ('checkerboard', 'checkerboard'), ('checkerboard-minus', 'checkerboard-minus'), ('checkerboard-plus', 'checkerboard-plus'), ('checkerboard-remove', 'checkerboard-remove'), ('cheese', 'cheese'), ('cheese-off', 'cheese-off'), ('chef-hat', 'chef-hat'), ('chemical-weapon', 'chemical-weapon'), ('chess-bishop', 'chess-bishop'), ('chess-king', 'chess-king'), ('chess-knight', 'chess-knight'), ('chess-pawn', 'chess-pawn'), ('chess-queen', 'chess-queen'), ('chess-rook', 'chess-rook'), ('chevron-double-down', 'chevron-double-down'), ('chevron-double-left', 'chevron-double-left'), ('chevron-double-right', 'chevron-double-right'), ('chevron-double-up', 'chevron-double-up'), ('chevron-down', 'chevron-down'), ('chevron-down-box', 'chevron-down-box'), ('chevron-down-box-outline', 'chevron-down-box-outline'), ('chevron-down-circle', 'chevron-down-circle'), ('chevron-down-circle-outline', 'chevron-down-circle-outline'), ('chevron-left', 'chevron-left'), ('chevron-left-box', 'chevron-left-box'), ('chevron-left-box-outline', 'chevron-left-box-outline'), ('chevron-left-circle', 'chevron-left-circle'), ('chevron-left-circle-outline', 'chevron-left-circle-outline'), ('chevron-right', 'chevron-right'), ('chevron-right-box', 'chevron-right-box'), ('chevron-right-box-outline', 'chevron-right-box-outline'), ('chevron-right-circle', 'chevron-right-circle'), ('chevron-right-circle-outline', 'chevron-right-circle-outline'), ('chevron-triple-down', 'chevron-triple-down'), ('chevron-triple-left', 'chevron-triple-left'), ('chevron-triple-right', 'chevron-triple-right'), ('chevron-triple-up', 'chevron-triple-up'), ('chevron-up', 'chevron-up'), ('chevron-up-box', 'chevron-up-box'), ('chevron-up-box-outline', 'chevron-up-box-outline'), ('chevron-up-circle', 'chevron-up-circle'), ('chevron-up-circle-outline', 'chevron-up-circle-outline'), ('chili-alert', 'chili-alert'), ('chili-alert-outline', 'chili-alert-outline'), ('chili-hot', 'chili-hot'), ('chili-hot-outline', 'chili-hot-outline'), ('chili-medium', 'chili-medium'), ('chili-medium-outline', 'chili-medium-outline'), ('chili-mild', 'chili-mild'), ('chili-mild-outline', 'chili-mild-outline'), ('chili-off', 'chili-off'), ('chili-off-outline', 'chili-off-outline'), ('chip', 'chip'), ('church', 'church'), ('church-outline', 'church-outline'), ('cigar', 'cigar'), ('cigar-off', 'cigar-off'), ('circle', 'circle'), ('circle-box', 'circle-box'), ('circle-box-outline', 'circle-box-outline'), ('circle-double', 'circle-double'), ('circle-edit-outline', 'circle-edit-outline'), ('circle-expand', 'circle-expand'), ('circle-half', 'circle-half'), ('circle-half-full', 'circle-half-full'), ('circle-medium', 'circle-medium'), ('circle-multiple', 'circle-multiple'), ('circle-multiple-outline', 'circle-multiple-outline'), ('circle-off-outline', 'circle-off-outline'), ('circle-opacity', 'circle-opacity'), ('circle-outline', 'circle-outline'), ('circle-slice-1', 'circle-slice-1'), ('circle-slice-2', 'circle-slice-2'), ('circle-slice-3', 'circle-slice-3'), ('circle-slice-4', 'circle-slice-4'), ('circle-slice-5', 'circle-slice-5'), ('circle-slice-6', 'circle-slice-6'), ('circle-slice-7', 'circle-slice-7'), ('circle-slice-8', 'circle-slice-8'), ('circle-small', 'circle-small'), ('circular-saw', 'circular-saw'), ('cisco-webex', 'cisco-webex'), ('city', 'city'), ('city-variant', 'city-variant'), ('city-variant-outline', 'city-variant-outline'), ('clipboard', 'clipboard'), ('clipboard-account', 'clipboard-account'), ('clipboard-account-outline', 'clipboard-account-outline'), ('clipboard-alert', 'clipboard-alert'), ('clipboard-alert-outline', 'clipboard-alert-outline'), ('clipboard-arrow-down', 'clipboard-arrow-down'), ('clipboard-arrow-down-outline', 'clipboard-arrow-down-outline'), ('clipboard-arrow-left', 'clipboard-arrow-left'), ('clipboard-arrow-left-outline', 'clipboard-arrow-left-outline'), ('clipboard-arrow-right', 'clipboard-arrow-right'), ('clipboard-arrow-right-outline', 'clipboard-arrow-right-outline'), ('clipboard-arrow-up', 'clipboard-arrow-up'), ('clipboard-arrow-up-outline', 'clipboard-arrow-up-outline'), ('clipboard-check', 'clipboard-check'), ('clipboard-check-multiple', 'clipboard-check-multiple'), ('clipboard-check-multiple-outline', 'clipboard-check-multiple-outline'), ('clipboard-check-outline', 'clipboard-check-outline'), ('clipboard-clock', 'clipboard-clock'), ('clipboard-clock-outline', 'clipboard-clock-outline'), ('clipboard-edit', 'clipboard-edit'), ('clipboard-edit-outline', 'clipboard-edit-outline'), ('clipboard-file', 'clipboard-file'), ('clipboard-file-outline', 'clipboard-file-outline'), ('clipboard-flow', 'clipboard-flow'), ('clipboard-flow-outline', 'clipboard-flow-outline'), ('clipboard-list', 'clipboard-list'), ('clipboard-list-outline', 'clipboard-list-outline'), ('clipboard-minus', 'clipboard-minus'), ('clipboard-minus-outline', 'clipboard-minus-outline'), ('clipboard-multiple', 'clipboard-multiple'), ('clipboard-multiple-outline', 'clipboard-multiple-outline'), ('clipboard-off', 'clipboard-off'), ('clipboard-off-outline', 'clipboard-off-outline'), ('clipboard-outline', 'clipboard-outline'), ('clipboard-play', 'clipboard-play'), ('clipboard-play-multiple', 'clipboard-play-multiple'), ('clipboard-play-multiple-outline', 'clipboard-play-multiple-outline'), ('clipboard-play-outline', 'clipboard-play-outline'), ('clipboard-plus', 'clipboard-plus'), ('clipboard-plus-outline', 'clipboard-plus-outline'), ('clipboard-pulse', 'clipboard-pulse'), ('clipboard-pulse-outline', 'clipboard-pulse-outline'), ('clipboard-remove', 'clipboard-remove'), ('clipboard-remove-outline', 'clipboard-remove-outline'), ('clipboard-search', 'clipboard-search'), ('clipboard-search-outline', 'clipboard-search-outline'), ('clipboard-text', 'clipboard-text'), ('clipboard-text-clock', 'clipboard-text-clock'), ('clipboard-text-clock-outline', 'clipboard-text-clock-outline'), ('clipboard-text-multiple', 'clipboard-text-multiple'), ('clipboard-text-multiple-outline', 'clipboard-text-multiple-outline'), ('clipboard-text-off', 'clipboard-text-off'), ('clipboard-text-off-outline', 'clipboard-text-off-outline'), ('clipboard-text-outline', 'clipboard-text-outline'), ('clipboard-text-play', 'clipboard-text-play'), ('clipboard-text-play-outline', 'clipboard-text-play-outline'), ('clipboard-text-search', 'clipboard-text-search'), ('clipboard-text-search-outline', 'clipboard-text-search-outline'), ('clippy', 'clippy'), ('clock', 'clock'), ('clock-alert', 'clock-alert'), ('clock-alert-outline', 'clock-alert-outline'), ('clock-check', 'clock-check'), ('clock-check-outline', 'clock-check-outline'), ('clock-digital', 'clock-digital'), ('clock-edit', 'clock-edit'), ('clock-edit-outline', 'clock-edit-outline'), ('clock-end', 'clock-end'), ('clock-fast', 'clock-fast'), ('clock-in', 'clock-in'), ('clock-minus', 'clock-minus'), ('clock-minus-outline', 'clock-minus-outline'), ('clock-out', 'clock-out'), ('clock-outline', 'clock-outline'), ('clock-plus', 'clock-plus'), ('clock-plus-outline', 'clock-plus-outline'), ('clock-remove', 'clock-remove'), ('clock-remove-outline', 'clock-remove-outline'), ('clock-start', 'clock-start'), ('clock-time-eight', 'clock-time-eight'), ('clock-time-eight-outline', 'clock-time-eight-outline'), ('clock-time-eleven', 'clock-time-eleven'), ('clock-time-eleven-outline', 'clock-time-eleven-outline'), ('clock-time-five', 'clock-time-five'), ('clock-time-five-outline', 'clock-time-five-outline'), ('clock-time-four', 'clock-time-four'), ('clock-time-four-outline', 'clock-time-four-outline'), ('clock-time-nine', 'clock-time-nine'), ('clock-time-nine-outline', 'clock-time-nine-outline'), ('clock-time-one', 'clock-time-one'), ('clock-time-one-outline', 'clock-time-one-outline'), ('clock-time-seven', 'clock-time-seven'), ('clock-time-seven-outline', 'clock-time-seven-outline'), ('clock-time-six', 'clock-time-six'), ('clock-time-six-outline', 'clock-time-six-outline'), ('clock-time-ten', 'clock-time-ten'), ('clock-time-ten-outline', 'clock-time-ten-outline'), ('clock-time-three', 'clock-time-three'), ('clock-time-three-outline', 'clock-time-three-outline'), ('clock-time-twelve', 'clock-time-twelve'), ('clock-time-twelve-outline', 'clock-time-twelve-outline'), ('clock-time-two', 'clock-time-two'), ('clock-time-two-outline', 'clock-time-two-outline'), ('close', 'close'), ('close-box', 'close-box'), ('close-box-multiple', 'close-box-multiple'), ('close-box-multiple-outline', 'close-box-multiple-outline'), ('close-box-outline', 'close-box-outline'), ('close-circle', 'close-circle'), ('close-circle-multiple', 'close-circle-multiple'), ('close-circle-multiple-outline', 'close-circle-multiple-outline'), ('close-circle-outline', 'close-circle-outline'), ('close-network', 'close-network'), ('close-network-outline', 'close-network-outline'), ('close-octagon', 'close-octagon'), ('close-octagon-outline', 'close-octagon-outline'), ('close-outline', 'close-outline'), ('close-thick', 'close-thick'), ('closed-caption', 'closed-caption'), ('closed-caption-outline', 'closed-caption-outline'), ('cloud', 'cloud'), ('cloud-alert', 'cloud-alert'), ('cloud-braces', 'cloud-braces'), ('cloud-check', 'cloud-check'), ('cloud-check-outline', 'cloud-check-outline'), ('cloud-circle', 'cloud-circle'), ('cloud-download', 'cloud-download'), ('cloud-download-outline', 'cloud-download-outline'), ('cloud-lock', 'cloud-lock'), ('cloud-lock-outline', 'cloud-lock-outline'), ('cloud-off-outline', 'cloud-off-outline'), ('cloud-outline', 'cloud-outline'), ('cloud-percent', 'cloud-percent'), ('cloud-percent-outline', 'cloud-percent-outline'), ('cloud-print', 'cloud-print'), ('cloud-print-outline', 'cloud-print-outline'), ('cloud-question', 'cloud-question'), ('cloud-refresh', 'cloud-refresh'), ('cloud-search', 'cloud-search'), ('cloud-search-outline', 'cloud-search-outline'), ('cloud-sync', 'cloud-sync'), ('cloud-sync-outline', 'cloud-sync-outline'), ('cloud-tags', 'cloud-tags'), ('cloud-upload', 'cloud-upload'), ('cloud-upload-outline', 'cloud-upload-outline'), ('clouds', 'clouds'), ('clover', 'clover'), ('coach-lamp', 'coach-lamp'), ('coach-lamp-variant', 'coach-lamp-variant'), ('coat-rack', 'coat-rack'), ('code-array', 'code-array'), ('code-braces', 'code-braces'), ('code-braces-box', 'code-braces-box'), ('code-brackets', 'code-brackets'), ('code-equal', 'code-equal'), ('code-greater-than', 'code-greater-than'), ('code-greater-than-or-equal', 'code-greater-than-or-equal'), ('code-json', 'code-json'), ('code-less-than', 'code-less-than'), ('code-less-than-or-equal', 'code-less-than-or-equal'), ('code-not-equal', 'code-not-equal'), ('code-not-equal-variant', 'code-not-equal-variant'), ('code-parentheses', 'code-parentheses'), ('code-parentheses-box', 'code-parentheses-box'), ('code-string', 'code-string'), ('code-tags', 'code-tags'), ('code-tags-check', 'code-tags-check'), ('codepen', 'codepen'), ('coffee', 'coffee'), ('coffee-maker', 'coffee-maker'), ('coffee-maker-check', 'coffee-maker-check'), ('coffee-maker-check-outline', 'coffee-maker-check-outline'), ('coffee-maker-outline', 'coffee-maker-outline'), ('coffee-off', 'coffee-off'), ('coffee-off-outline', 'coffee-off-outline'), ('coffee-outline', 'coffee-outline'), ('coffee-to-go', 'coffee-to-go'), ('coffee-to-go-outline', 'coffee-to-go-outline'), ('coffin', 'coffin'), ('cog', 'cog'), ('cog-box', 'cog-box'), ('cog-clockwise', 'cog-clockwise'), ('cog-counterclockwise', 'cog-counterclockwise'), ('cog-off', 'cog-off'), ('cog-off-outline', 'cog-off-outline'), ('cog-outline', 'cog-outline'), ('cog-pause', 'cog-pause'), ('cog-pause-outline', 'cog-pause-outline'), ('cog-play', 'cog-play'), ('cog-play-outline', 'cog-play-outline'), ('cog-refresh', 'cog-refresh'), ('cog-refresh-outline', 'cog-refresh-outline'), ('cog-stop', 'cog-stop'), ('cog-stop-outline', 'cog-stop-outline'), ('cog-sync', 'cog-sync'), ('cog-sync-outline', 'cog-sync-outline'), ('cog-transfer', 'cog-transfer'), ('cog-transfer-outline', 'cog-transfer-outline'), ('cogs', 'cogs'), ('collage', 'collage'), ('collapse-all', 'collapse-all'), ('collapse-all-outline', 'collapse-all-outline'), ('color-helper', 'color-helper'), ('comma', 'comma'), ('comma-box', 'comma-box'), ('comma-box-outline', 'comma-box-outline'), ('comma-circle', 'comma-circle'), ('comma-circle-outline', 'comma-circle-outline'), ('comment', 'comment'), ('comment-account', 'comment-account'), ('comment-account-outline', 'comment-account-outline'), ('comment-alert', 'comment-alert'), ('comment-alert-outline', 'comment-alert-outline'), ('comment-arrow-left', 'comment-arrow-left'), ('comment-arrow-left-outline', 'comment-arrow-left-outline'), ('comment-arrow-right', 'comment-arrow-right'), ('comment-arrow-right-outline', 'comment-arrow-right-outline'), ('comment-bookmark', 'comment-bookmark'), ('comment-bookmark-outline', 'comment-bookmark-outline'), ('comment-check', 'comment-check'), ('comment-check-outline', 'comment-check-outline'), ('comment-edit', 'comment-edit'), ('comment-edit-outline', 'comment-edit-outline'), ('comment-eye', 'comment-eye'), ('comment-eye-outline', 'comment-eye-outline'), ('comment-flash', 'comment-flash'), ('comment-flash-outline', 'comment-flash-outline'), ('comment-minus', 'comment-minus'), ('comment-minus-outline', 'comment-minus-outline'), ('comment-multiple', 'comment-multiple'), ('comment-multiple-outline', 'comment-multiple-outline'), ('comment-off', 'comment-off'), ('comment-off-outline', 'comment-off-outline'), ('comment-outline', 'comment-outline'), ('comment-plus', 'comment-plus'), ('comment-plus-outline', 'comment-plus-outline'), ('comment-processing', 'comment-processing'), ('comment-processing-outline', 'comment-processing-outline'), ('comment-question', 'comment-question'), ('comment-question-outline', 'comment-question-outline'), ('comment-quote', 'comment-quote'), ('comment-quote-outline', 'comment-quote-outline'), ('comment-remove', 'comment-remove'), ('comment-remove-outline', 'comment-remove-outline'), ('comment-search', 'comment-search'), ('comment-search-outline', 'comment-search-outline'), ('comment-text', 'comment-text'), ('comment-text-multiple', 'comment-text-multiple'), ('comment-text-multiple-outline', 'comment-text-multiple-outline'), ('comment-text-outline', 'comment-text-outline'), ('compare', 'compare'), ('compare-horizontal', 'compare-horizontal'), ('compare-remove', 'compare-remove'), ('compare-vertical', 'compare-vertical'), ('compass', 'compass'), ('compass-off', 'compass-off'), ('compass-off-outline', 'compass-off-outline'), ('compass-outline', 'compass-outline'), ('compass-rose', 'compass-rose'), ('compost', 'compost'), ('concourse-ci', 'concourse-ci'), ('cone', 'cone'), ('cone-off', 'cone-off'), ('connection', 'connection'), ('console', 'console'), ('console-line', 'console-line'), ('console-network', 'console-network'), ('console-network-outline', 'console-network-outline'), ('consolidate', 'consolidate'), ('contactless-payment', 'contactless-payment'), ('contactless-payment-circle', 'contactless-payment-circle'), ('contactless-payment-circle-outline', 'contactless-payment-circle-outline'), ('contacts', 'contacts'), ('contacts-outline', 'contacts-outline'), ('contain', 'contain'), ('contain-end', 'contain-end'), ('contain-start', 'contain-start'), ('content-copy', 'content-copy'), ('content-cut', 'content-cut'), ('content-duplicate', 'content-duplicate'), ('content-paste', 'content-paste'), ('content-save', 'content-save'), ('content-save-alert', 'content-save-alert'), ('content-save-alert-outline', 'content-save-alert-outline'), ('content-save-all', 'content-save-all'), ('content-save-all-outline', 'content-save-all-outline'), ('content-save-check', 'content-save-check'), ('content-save-check-outline', 'content-save-check-outline'), ('content-save-cog', 'content-save-cog'), ('content-save-cog-outline', 'content-save-cog-outline'), ('content-save-edit', 'content-save-edit'), ('content-save-edit-outline', 'content-save-edit-outline'), ('content-save-minus', 'content-save-minus'), ('content-save-minus-outline', 'content-save-minus-outline'), ('content-save-move', 'content-save-move'), ('content-save-move-outline', 'content-save-move-outline'), ('content-save-off', 'content-save-off'), ('content-save-off-outline', 'content-save-off-outline'), ('content-save-outline', 'content-save-outline'), ('content-save-plus', 'content-save-plus'), ('content-save-plus-outline', 'content-save-plus-outline'), ('content-save-settings', 'content-save-settings'), ('content-save-settings-outline', 'content-save-settings-outline'), ('contrast', 'contrast'), ('contrast-box', 'contrast-box'), ('contrast-circle', 'contrast-circle'), ('controller', 'controller'), ('controller-classic', 'controller-classic'), ('controller-classic-outline', 'controller-classic-outline'), ('controller-off', 'controller-off'), ('controller-xbox', 'controller-xbox'), ('cookie', 'cookie'), ('cookie-alert', 'cookie-alert'), ('cookie-alert-outline', 'cookie-alert-outline'), ('cookie-check', 'cookie-check'), ('cookie-check-outline', 'cookie-check-outline'), ('cookie-clock', 'cookie-clock'), ('cookie-clock-outline', 'cookie-clock-outline'), ('cookie-cog', 'cookie-cog'), ('cookie-cog-outline', 'cookie-cog-outline'), ('cookie-edit', 'cookie-edit'), ('cookie-edit-outline', 'cookie-edit-outline'), ('cookie-lock', 'cookie-lock'), ('cookie-lock-outline', 'cookie-lock-outline'), ('cookie-minus', 'cookie-minus'), ('cookie-minus-outline', 'cookie-minus-outline'), ('cookie-off', 'cookie-off'), ('cookie-off-outline', 'cookie-off-outline'), ('cookie-outline', 'cookie-outline'), ('cookie-plus', 'cookie-plus'), ('cookie-plus-outline', 'cookie-plus-outline'), ('cookie-refresh', 'cookie-refresh'), ('cookie-refresh-outline', 'cookie-refresh-outline'), ('cookie-remove', 'cookie-remove'), ('cookie-remove-outline', 'cookie-remove-outline'), ('cookie-settings', 'cookie-settings'), ('cookie-settings-outline', 'cookie-settings-outline'), ('coolant-temperature', 'coolant-temperature'), ('copyleft', 'copyleft'), ('copyright', 'copyright'), ('cordova', 'cordova'), ('corn', 'corn'), ('corn-off', 'corn-off'), ('cosine-wave', 'cosine-wave'), ('counter', 'counter'), ('countertop', 'countertop'), ('countertop-outline', 'countertop-outline'), ('cow', 'cow'), ('cow-off', 'cow-off'), ('cpu-32-bit', 'cpu-32-bit'), ('cpu-64-bit', 'cpu-64-bit'), ('cradle', 'cradle'), ('cradle-outline', 'cradle-outline'), ('crane', 'crane'), ('creation', 'creation'), ('creative-commons', 'creative-commons'), ('credit-card', 'credit-card'), ('credit-card-check', 'credit-card-check'), ('credit-card-check-outline', 'credit-card-check-outline'), ('credit-card-chip', 'credit-card-chip'), ('credit-card-chip-outline', 'credit-card-chip-outline'), ('credit-card-clock', 'credit-card-clock'), ('credit-card-clock-outline', 'credit-card-clock-outline'), ('credit-card-edit', 'credit-card-edit'), ('credit-card-edit-outline', 'credit-card-edit-outline'), ('credit-card-fast', 'credit-card-fast'), ('credit-card-fast-outline', 'credit-card-fast-outline'), ('credit-card-lock', 'credit-card-lock'), ('credit-card-lock-outline', 'credit-card-lock-outline'), ('credit-card-marker', 'credit-card-marker'), ('credit-card-marker-outline', 'credit-card-marker-outline'), ('credit-card-minus', 'credit-card-minus'), ('credit-card-minus-outline', 'credit-card-minus-outline'), ('credit-card-multiple', 'credit-card-multiple'), ('credit-card-multiple-outline', 'credit-card-multiple-outline'), ('credit-card-off', 'credit-card-off'), ('credit-card-off-outline', 'credit-card-off-outline'), ('credit-card-outline', 'credit-card-outline'), ('credit-card-plus', 'credit-card-plus'), ('credit-card-plus-outline', 'credit-card-plus-outline'), ('credit-card-refresh', 'credit-card-refresh'), ('credit-card-refresh-outline', 'credit-card-refresh-outline'), ('credit-card-refund', 'credit-card-refund'), ('credit-card-refund-outline', 'credit-card-refund-outline'), ('credit-card-remove', 'credit-card-remove'), ('credit-card-remove-outline', 'credit-card-remove-outline'), ('credit-card-scan', 'credit-card-scan'), ('credit-card-scan-outline', 'credit-card-scan-outline'), ('credit-card-search', 'credit-card-search'), ('credit-card-search-outline', 'credit-card-search-outline'), ('credit-card-settings', 'credit-card-settings'), ('credit-card-settings-outline', 'credit-card-settings-outline'), ('credit-card-sync', 'credit-card-sync'), ('credit-card-sync-outline', 'credit-card-sync-outline'), ('credit-card-wireless', 'credit-card-wireless'), ('credit-card-wireless-off', 'credit-card-wireless-off'), ('credit-card-wireless-off-outline', 'credit-card-wireless-off-outline'), ('credit-card-wireless-outline', 'credit-card-wireless-outline'), ('cricket', 'cricket'), ('crop', 'crop'), ('crop-free', 'crop-free'), ('crop-landscape', 'crop-landscape'), ('crop-portrait', 'crop-portrait'), ('crop-rotate', 'crop-rotate'), ('crop-square', 'crop-square'), ('cross', 'cross'), ('cross-bolnisi', 'cross-bolnisi'), ('cross-celtic', 'cross-celtic'), ('cross-outline', 'cross-outline'), ('crosshairs', 'crosshairs'), ('crosshairs-gps', 'crosshairs-gps'), ('crosshairs-off', 'crosshairs-off'), ('crosshairs-question', 'crosshairs-question'), ('crowd', 'crowd'), ('crown', 'crown'), ('crown-circle', 'crown-circle'), ('crown-circle-outline', 'crown-circle-outline'), ('crown-outline', 'crown-outline'), ('cryengine', 'cryengine'), ('crystal-ball', 'crystal-ball'), ('cube', 'cube'), ('cube-off', 'cube-off'), ('cube-off-outline', 'cube-off-outline'), ('cube-outline', 'cube-outline'), ('cube-scan', 'cube-scan'), ('cube-send', 'cube-send'), ('cube-unfolded', 'cube-unfolded'), ('cup', 'cup'), ('cup-off', 'cup-off'), ('cup-off-outline', 'cup-off-outline'), ('cup-outline', 'cup-outline'), ('cup-water', 'cup-water'), ('cupboard', 'cupboard'), ('cupboard-outline', 'cupboard-outline'), ('cupcake', 'cupcake'), ('curling', 'curling'), ('currency-bdt', 'currency-bdt'), ('currency-brl', 'currency-brl'), ('currency-btc', 'currency-btc'), ('currency-chf', 'currency-chf'), ('currency-cny', 'currency-cny'), ('currency-eth', 'currency-eth'), ('currency-eur', 'currency-eur'), ('currency-eur-off', 'currency-eur-off'), ('currency-fra', 'currency-fra'), ('currency-gbp', 'currency-gbp'), ('currency-ils', 'currency-ils'), ('currency-inr', 'currency-inr'), ('currency-jpy', 'currency-jpy'), ('currency-krw', 'currency-krw'), ('currency-kzt', 'currency-kzt'), ('currency-mnt', 'currency-mnt'), ('currency-ngn', 'currency-ngn'), ('currency-php', 'currency-php'), ('currency-rial', 'currency-rial'), ('currency-rub', 'currency-rub'), ('currency-rupee', 'currency-rupee'), ('currency-sign', 'currency-sign'), ('currency-try', 'currency-try'), ('currency-twd', 'currency-twd'), ('currency-uah', 'currency-uah'), ('currency-usd', 'currency-usd'), ('currency-usd-circle', 'currency-usd-circle'), ('currency-usd-circle-outline', 'currency-usd-circle-outline'), ('currency-usd-off', 'currency-usd-off'), ('current-ac', 'current-ac'), ('current-dc', 'current-dc'), ('cursor-default', 'cursor-default'), ('cursor-default-click', 'cursor-default-click'), ('cursor-default-click-outline', 'cursor-default-click-outline'), ('cursor-default-gesture', 'cursor-default-gesture'), ('cursor-default-gesture-outline', 'cursor-default-gesture-outline'), ('cursor-default-outline', 'cursor-default-outline'), ('cursor-move', 'cursor-move'), ('cursor-pointer', 'cursor-pointer'), ('cursor-text', 'cursor-text'), ('curtains', 'curtains'), ('curtains-closed', 'curtains-closed'), ('cylinder', 'cylinder'), ('cylinder-off', 'cylinder-off'), ('dance-ballroom', 'dance-ballroom'), ('dance-pole', 'dance-pole'), ('data', 'data'), ('data-matrix', 'data-matrix'), ('data-matrix-edit', 'data-matrix-edit'), ('data-matrix-minus', 'data-matrix-minus'), ('data-matrix-plus', 'data-matrix-plus'), ('data-matrix-remove', 'data-matrix-remove'), ('data-matrix-scan', 'data-matrix-scan'), ('database', 'database'), ('database-alert', 'database-alert'), ('database-alert-outline', 'database-alert-outline'), ('database-arrow-down', 'database-arrow-down'), ('database-arrow-down-outline', 'database-arrow-down-outline'), ('database-arrow-left', 'database-arrow-left'), ('database-arrow-left-outline', 'database-arrow-left-outline'), ('database-arrow-right', 'database-arrow-right'), ('database-arrow-right-outline', 'database-arrow-right-outline'), ('database-arrow-up', 'database-arrow-up'), ('database-arrow-up-outline', 'database-arrow-up-outline'), ('database-check', 'database-check'), ('database-check-outline', 'database-check-outline'), ('database-clock', 'database-clock'), ('database-clock-outline', 'database-clock-outline'), ('database-cog', 'database-cog'), ('database-cog-outline', 'database-cog-outline'), ('database-edit', 'database-edit'), ('database-edit-outline', 'database-edit-outline'), ('database-export', 'database-export'), ('database-export-outline', 'database-export-outline'), ('database-eye', 'database-eye'), ('database-eye-off', 'database-eye-off'), ('database-eye-off-outline', 'database-eye-off-outline'), ('database-eye-outline', 'database-eye-outline'), ('database-import', 'database-import'), ('database-import-outline', 'database-import-outline'), ('database-lock', 'database-lock'), ('database-lock-outline', 'database-lock-outline'), ('database-marker', 'database-marker'), ('database-marker-outline', 'database-marker-outline'), ('database-minus', 'database-minus'), ('database-minus-outline', 'database-minus-outline'), ('database-off', 'database-off'), ('database-off-outline', 'database-off-outline'), ('database-outline', 'database-outline'), ('database-plus', 'database-plus'), ('database-plus-outline', 'database-plus-outline'), ('database-refresh', 'database-refresh'), ('database-refresh-outline', 'database-refresh-outline'), ('database-remove', 'database-remove'), ('database-remove-outline', 'database-remove-outline'), ('database-search', 'database-search'), ('database-search-outline', 'database-search-outline'), ('database-settings', 'database-settings'), ('database-settings-outline', 'database-settings-outline'), ('database-sync', 'database-sync'), ('database-sync-outline', 'database-sync-outline'), ('death-star', 'death-star'), ('death-star-variant', 'death-star-variant'), ('deathly-hallows', 'deathly-hallows'), ('debian', 'debian'), ('debug-step-into', 'debug-step-into'), ('debug-step-out', 'debug-step-out'), ('debug-step-over', 'debug-step-over'), ('decagram', 'decagram'), ('decagram-outline', 'decagram-outline'), ('decimal', 'decimal'), ('decimal-comma', 'decimal-comma'), ('decimal-comma-decrease', 'decimal-comma-decrease'), ('decimal-comma-increase', 'decimal-comma-increase'), ('decimal-decrease', 'decimal-decrease'), ('decimal-increase', 'decimal-increase'), ('delete', 'delete'), ('delete-alert', 'delete-alert'), ('delete-alert-outline', 'delete-alert-outline'), ('delete-circle', 'delete-circle'), ('delete-circle-outline', 'delete-circle-outline'), ('delete-clock', 'delete-clock'), ('delete-clock-outline', 'delete-clock-outline'), ('delete-empty', 'delete-empty'), ('delete-empty-outline', 'delete-empty-outline'), ('delete-forever', 'delete-forever'), ('delete-forever-outline', 'delete-forever-outline'), ('delete-off', 'delete-off'), ('delete-off-outline', 'delete-off-outline'), ('delete-outline', 'delete-outline'), ('delete-restore', 'delete-restore'), ('delete-sweep', 'delete-sweep'), ('delete-sweep-outline', 'delete-sweep-outline'), ('delete-variant', 'delete-variant'), ('delta', 'delta'), ('desk', 'desk'), ('desk-lamp', 'desk-lamp'), ('desk-lamp-off', 'desk-lamp-off'), ('desk-lamp-on', 'desk-lamp-on'), ('deskphone', 'deskphone'), ('desktop-classic', 'desktop-classic'), ('desktop-mac', 'desktop-mac'), ('desktop-mac-dashboard', 'desktop-mac-dashboard'), ('desktop-tower', 'desktop-tower'), ('desktop-tower-monitor', 'desktop-tower-monitor'), ('details', 'details'), ('dev-to', 'dev-to'), ('developer-board', 'developer-board'), ('deviantart', 'deviantart'), ('devices', 'devices'), ('dharmachakra', 'dharmachakra'), ('diabetes', 'diabetes'), ('dialpad', 'dialpad'), ('diameter', 'diameter'), ('diameter-outline', 'diameter-outline'), ('diameter-variant', 'diameter-variant'), ('diamond', 'diamond'), ('diamond-outline', 'diamond-outline'), ('diamond-stone', 'diamond-stone'), ('dice', 'dice'), ('dice-1', 'dice-1'), ('dice-1-outline', 'dice-1-outline'), ('dice-2', 'dice-2'), ('dice-2-outline', 'dice-2-outline'), ('dice-3', 'dice-3'), ('dice-3-outline', 'dice-3-outline'), ('dice-4', 'dice-4'), ('dice-4-outline', 'dice-4-outline'), ('dice-5', 'dice-5'), ('dice-5-outline', 'dice-5-outline'), ('dice-6', 'dice-6'), ('dice-6-outline', 'dice-6-outline'), ('dice-d10', 'dice-d10'), ('dice-d10-outline', 'dice-d10-outline'), ('dice-d12', 'dice-d12'), ('dice-d12-outline', 'dice-d12-outline'), ('dice-d20', 'dice-d20'), ('dice-d20-outline', 'dice-d20-outline'), ('dice-d4', 'dice-d4'), ('dice-d4-outline', 'dice-d4-outline'), ('dice-d6', 'dice-d6'), ('dice-d6-outline', 'dice-d6-outline'), ('dice-d8', 'dice-d8'), ('dice-d8-outline', 'dice-d8-outline'), ('dice-multiple', 'dice-multiple'), ('dice-multiple-outline', 'dice-multiple-outline'), ('digital-ocean', 'digital-ocean'), ('dip-switch', 'dip-switch'), ('directions', 'directions'), ('directions-fork', 'directions-fork'), ('disc', 'disc'), ('disc-alert', 'disc-alert'), ('disc-player', 'disc-player'), ('discord', 'discord'), ('dishwasher', 'dishwasher'), ('dishwasher-alert', 'dishwasher-alert'), ('dishwasher-off', 'dishwasher-off'), ('disk', 'disk'), ('disk-alert', 'disk-alert'), ('disk-player', 'disk-player'), ('disqus', 'disqus'), ('disqus-outline', 'disqus-outline'), ('distribute-horizontal-center', 'distribute-horizontal-center'), ('distribute-horizontal-left', 'distribute-horizontal-left'), ('distribute-horizontal-right', 'distribute-horizontal-right'), ('distribute-vertical-bottom', 'distribute-vertical-bottom'), ('distribute-vertical-center', 'distribute-vertical-center'), ('distribute-vertical-top', 'distribute-vertical-top'), ('diversify', 'diversify'), ('diving', 'diving'), ('diving-flippers', 'diving-flippers'), ('diving-helmet', 'diving-helmet'), ('diving-scuba', 'diving-scuba'), ('diving-scuba-flag', 'diving-scuba-flag'), ('diving-scuba-mask', 'diving-scuba-mask'), ('diving-scuba-tank', 'diving-scuba-tank'), ('diving-scuba-tank-multiple', 'diving-scuba-tank-multiple'), ('diving-snorkel', 'diving-snorkel'), ('division', 'division'), ('division-box', 'division-box'), ('dlna', 'dlna'), ('dna', 'dna'), ('dns', 'dns'), ('dns-outline', 'dns-outline'), ('do-not-disturb', 'do-not-disturb'), ('dock-bottom', 'dock-bottom'), ('dock-left', 'dock-left'), ('dock-right', 'dock-right'), ('dock-top', 'dock-top'), ('dock-window', 'dock-window'), ('docker', 'docker'), ('doctor', 'doctor'), ('document', 'document'), ('dog', 'dog'), ('dog-service', 'dog-service'), ('dog-side', 'dog-side'), ('dog-side-off', 'dog-side-off'), ('dolby', 'dolby'), ('dolly', 'dolly'), ('dolphin', 'dolphin'), ('domain', 'domain'), ('domain-off', 'domain-off'), ('domain-plus', 'domain-plus'), ('domain-remove', 'domain-remove'), ('dome-light', 'dome-light'), ('domino-mask', 'domino-mask'), ('donkey', 'donkey'), ('door', 'door'), ('door-closed', 'door-closed'), ('door-closed-lock', 'door-closed-lock'), ('door-open', 'door-open'), ('door-sliding', 'door-sliding'), ('door-sliding-lock', 'door-sliding-lock'), ('door-sliding-open', 'door-sliding-open'), ('doorbell', 'doorbell'), ('doorbell-video', 'doorbell-video'), ('dot-net', 'dot-net'), ('dots-circle', 'dots-circle'), ('dots-grid', 'dots-grid'), ('dots-hexagon', 'dots-hexagon'), ('dots-horizontal', 'dots-horizontal'), ('dots-horizontal-circle', 'dots-horizontal-circle'), ('dots-horizontal-circle-outline', 'dots-horizontal-circle-outline'), ('dots-square', 'dots-square'), ('dots-triangle', 'dots-triangle'), ('dots-vertical', 'dots-vertical'), ('dots-vertical-circle', 'dots-vertical-circle'), ('dots-vertical-circle-outline', 'dots-vertical-circle-outline'), ('douban', 'douban'), ('download', 'download'), ('download-box', 'download-box'), ('download-box-outline', 'download-box-outline'), ('download-circle', 'download-circle'), ('download-circle-outline', 'download-circle-outline'), ('download-lock', 'download-lock'), ('download-lock-outline', 'download-lock-outline'), ('download-multiple', 'download-multiple'), ('download-network', 'download-network'), ('download-network-outline', 'download-network-outline'), ('download-off', 'download-off'), ('download-off-outline', 'download-off-outline'), ('download-outline', 'download-outline'), ('drag', 'drag'), ('drag-horizontal', 'drag-horizontal'), ('drag-horizontal-variant', 'drag-horizontal-variant'), ('drag-variant', 'drag-variant'), ('drag-vertical', 'drag-vertical'), ('drag-vertical-variant', 'drag-vertical-variant'), ('drama-masks', 'drama-masks'), ('draw', 'draw'), ('draw-pen', 'draw-pen'), ('drawing', 'drawing'), ('drawing-box', 'drawing-box'), ('dresser', 'dresser'), ('dresser-outline', 'dresser-outline'), ('dribbble', 'dribbble'), ('dribbble-box', 'dribbble-box'), ('drone', 'drone'), ('dropbox', 'dropbox'), ('drupal', 'drupal'), ('duck', 'duck'), ('dumbbell', 'dumbbell'), ('dump-truck', 'dump-truck'), ('ear-hearing', 'ear-hearing'), ('ear-hearing-loop', 'ear-hearing-loop'), ('ear-hearing-off', 'ear-hearing-off'), ('earbuds', 'earbuds'), ('earbuds-off', 'earbuds-off'), ('earbuds-off-outline', 'earbuds-off-outline'), ('earbuds-outline', 'earbuds-outline'), ('earth', 'earth'), ('earth-arrow-right', 'earth-arrow-right'), ('earth-box', 'earth-box'), ('earth-box-minus', 'earth-box-minus'), ('earth-box-off', 'earth-box-off'), ('earth-box-plus', 'earth-box-plus'), ('earth-box-remove', 'earth-box-remove'), ('earth-minus', 'earth-minus'), ('earth-off', 'earth-off'), ('earth-plus', 'earth-plus'), ('earth-remove', 'earth-remove'), ('ebay', 'ebay'), ('egg', 'egg'), ('egg-easter', 'egg-easter'), ('egg-fried', 'egg-fried'), ('egg-off', 'egg-off'), ('egg-off-outline', 'egg-off-outline'), ('egg-outline', 'egg-outline'), ('eiffel-tower', 'eiffel-tower'), ('eight-track', 'eight-track'), ('eject', 'eject'), ('eject-circle', 'eject-circle'), ('eject-circle-outline', 'eject-circle-outline'), ('eject-outline', 'eject-outline'), ('electric-switch', 'electric-switch'), ('electric-switch-closed', 'electric-switch-closed'), ('electron-framework', 'electron-framework'), ('elephant', 'elephant'), ('elevation-decline', 'elevation-decline'), ('elevation-rise', 'elevation-rise'), ('elevator', 'elevator'), ('elevator-down', 'elevator-down'), ('elevator-passenger', 'elevator-passenger'), ('elevator-passenger-off', 'elevator-passenger-off'), ('elevator-passenger-off-outline', 'elevator-passenger-off-outline'), ('elevator-passenger-outline', 'elevator-passenger-outline'), ('elevator-up', 'elevator-up'), ('ellipse', 'ellipse'), ('ellipse-outline', 'ellipse-outline'), ('email', 'email'), ('email-alert', 'email-alert'), ('email-alert-outline', 'email-alert-outline'), ('email-arrow-left', 'email-arrow-left'), ('email-arrow-left-outline', 'email-arrow-left-outline'), ('email-arrow-right', 'email-arrow-right'), ('email-arrow-right-outline', 'email-arrow-right-outline'), ('email-box', 'email-box'), ('email-check', 'email-check'), ('email-check-outline', 'email-check-outline'), ('email-edit', 'email-edit'), ('email-edit-outline', 'email-edit-outline'), ('email-fast', 'email-fast'), ('email-fast-outline', 'email-fast-outline'), ('email-lock', 'email-lock'), ('email-lock-outline', 'email-lock-outline'), ('email-mark-as-unread', 'email-mark-as-unread'), ('email-minus', 'email-minus'), ('email-minus-outline', 'email-minus-outline'), ('email-multiple', 'email-multiple'), ('email-multiple-outline', 'email-multiple-outline'), ('email-newsletter', 'email-newsletter'), ('email-off', 'email-off'), ('email-off-outline', 'email-off-outline'), ('email-open', 'email-open'), ('email-open-multiple', 'email-open-multiple'), ('email-open-multiple-outline', 'email-open-multiple-outline'), ('email-open-outline', 'email-open-outline'), ('email-outline', 'email-outline'), ('email-plus', 'email-plus'), ('email-plus-outline', 'email-plus-outline'), ('email-remove', 'email-remove'), ('email-remove-outline', 'email-remove-outline'), ('email-seal', 'email-seal'), ('email-seal-outline', 'email-seal-outline'), ('email-search', 'email-search'), ('email-search-outline', 'email-search-outline'), ('email-sync', 'email-sync'), ('email-sync-outline', 'email-sync-outline'), ('email-variant', 'email-variant'), ('ember', 'ember'), ('emby', 'emby'), ('emoticon', 'emoticon'), ('emoticon-angry', 'emoticon-angry'), ('emoticon-angry-outline', 'emoticon-angry-outline'), ('emoticon-confused', 'emoticon-confused'), ('emoticon-confused-outline', 'emoticon-confused-outline'), ('emoticon-cool', 'emoticon-cool'), ('emoticon-cool-outline', 'emoticon-cool-outline'), ('emoticon-cry', 'emoticon-cry'), ('emoticon-cry-outline', 'emoticon-cry-outline'), ('emoticon-dead', 'emoticon-dead'), ('emoticon-dead-outline', 'emoticon-dead-outline'), ('emoticon-devil', 'emoticon-devil'), ('emoticon-devil-outline', 'emoticon-devil-outline'), ('emoticon-excited', 'emoticon-excited'), ('emoticon-excited-outline', 'emoticon-excited-outline'), ('emoticon-frown', 'emoticon-frown'), ('emoticon-frown-outline', 'emoticon-frown-outline'), ('emoticon-happy', 'emoticon-happy'), ('emoticon-happy-outline', 'emoticon-happy-outline'), ('emoticon-kiss', 'emoticon-kiss'), ('emoticon-kiss-outline', 'emoticon-kiss-outline'), ('emoticon-lol', 'emoticon-lol'), ('emoticon-lol-outline', 'emoticon-lol-outline'), ('emoticon-neutral', 'emoticon-neutral'), ('emoticon-neutral-outline', 'emoticon-neutral-outline'), ('emoticon-outline', 'emoticon-outline'), ('emoticon-poop', 'emoticon-poop'), ('emoticon-poop-outline', 'emoticon-poop-outline'), ('emoticon-sad', 'emoticon-sad'), ('emoticon-sad-outline', 'emoticon-sad-outline'), ('emoticon-sick', 'emoticon-sick'), ('emoticon-sick-outline', 'emoticon-sick-outline'), ('emoticon-tongue', 'emoticon-tongue'), ('emoticon-tongue-outline', 'emoticon-tongue-outline'), ('emoticon-wink', 'emoticon-wink'), ('emoticon-wink-outline', 'emoticon-wink-outline'), ('engine', 'engine'), ('engine-off', 'engine-off'), ('engine-off-outline', 'engine-off-outline'), ('engine-outline', 'engine-outline'), ('epsilon', 'epsilon'), ('equal', 'equal'), ('equal-box', 'equal-box'), ('equalizer', 'equalizer'), ('equalizer-outline', 'equalizer-outline'), ('eraser', 'eraser'), ('eraser-variant', 'eraser-variant'), ('escalator', 'escalator'), ('escalator-box', 'escalator-box'), ('escalator-down', 'escalator-down'), ('escalator-up', 'escalator-up'), ('eslint', 'eslint'), ('et', 'et'), ('ethereum', 'ethereum'), ('ethernet', 'ethernet'), ('ethernet-cable', 'ethernet-cable'), ('ethernet-cable-off', 'ethernet-cable-off'), ('etsy', 'etsy'), ('ev-plug-ccs1', 'ev-plug-ccs1'), ('ev-plug-ccs2', 'ev-plug-ccs2'), ('ev-plug-chademo', 'ev-plug-chademo'), ('ev-plug-tesla', 'ev-plug-tesla'), ('ev-plug-type1', 'ev-plug-type1'), ('ev-plug-type2', 'ev-plug-type2'), ('ev-station', 'ev-station'), ('eventbrite', 'eventbrite'), ('evernote', 'evernote'), ('excavator', 'excavator'), ('exclamation', 'exclamation'), ('exclamation-thick', 'exclamation-thick'), ('exit-run', 'exit-run'), ('exit-to-app', 'exit-to-app'), ('expand-all', 'expand-all'), ('expand-all-outline', 'expand-all-outline'), ('expansion-card', 'expansion-card'), ('expansion-card-variant', 'expansion-card-variant'), ('exponent', 'exponent'), ('exponent-box', 'exponent-box'), ('export', 'export'), ('export-variant', 'export-variant'), ('eye', 'eye'), ('eye-arrow-left', 'eye-arrow-left'), ('eye-arrow-left-outline', 'eye-arrow-left-outline'), ('eye-arrow-right', 'eye-arrow-right'), ('eye-arrow-right-outline', 'eye-arrow-right-outline'), ('eye-check', 'eye-check'), ('eye-check-outline', 'eye-check-outline'), ('eye-circle', 'eye-circle'), ('eye-circle-outline', 'eye-circle-outline'), ('eye-minus', 'eye-minus'), ('eye-minus-outline', 'eye-minus-outline'), ('eye-off', 'eye-off'), ('eye-off-outline', 'eye-off-outline'), ('eye-outline', 'eye-outline'), ('eye-plus', 'eye-plus'), ('eye-plus-outline', 'eye-plus-outline'), ('eye-refresh', 'eye-refresh'), ('eye-refresh-outline', 'eye-refresh-outline'), ('eye-remove', 'eye-remove'), ('eye-remove-outline', 'eye-remove-outline'), ('eye-settings', 'eye-settings'), ('eye-settings-outline', 'eye-settings-outline'), ('eyedropper', 'eyedropper'), ('eyedropper-minus', 'eyedropper-minus'), ('eyedropper-off', 'eyedropper-off'), ('eyedropper-plus', 'eyedropper-plus'), ('eyedropper-remove', 'eyedropper-remove'), ('eyedropper-variant', 'eyedropper-variant'), ('face-agent', 'face-agent'), ('face-man', 'face-man'), ('face-man-outline', 'face-man-outline'), ('face-man-profile', 'face-man-profile'), ('face-man-shimmer', 'face-man-shimmer'), ('face-man-shimmer-outline', 'face-man-shimmer-outline'), ('face-mask', 'face-mask'), ('face-mask-outline', 'face-mask-outline'), ('face-recognition', 'face-recognition'), ('face-woman', 'face-woman'), ('face-woman-outline', 'face-woman-outline'), ('face-woman-profile', 'face-woman-profile'), ('face-woman-shimmer', 'face-woman-shimmer'), ('face-woman-shimmer-outline', 'face-woman-shimmer-outline'), ('facebook', 'facebook'), ('facebook-box', 'facebook-box'), ('facebook-gaming', 'facebook-gaming'), ('facebook-messenger', 'facebook-messenger'), ('facebook-workplace', 'facebook-workplace'), ('factory', 'factory'), ('family-tree', 'family-tree'), ('fan', 'fan'), ('fan-alert', 'fan-alert'), ('fan-auto', 'fan-auto'), ('fan-chevron-down', 'fan-chevron-down'), ('fan-chevron-up', 'fan-chevron-up'), ('fan-clock', 'fan-clock'), ('fan-minus', 'fan-minus'), ('fan-off', 'fan-off'), ('fan-plus', 'fan-plus'), ('fan-remove', 'fan-remove'), ('fan-speed-1', 'fan-speed-1'), ('fan-speed-2', 'fan-speed-2'), ('fan-speed-3', 'fan-speed-3'), ('fast-forward', 'fast-forward'), ('fast-forward-10', 'fast-forward-10'), ('fast-forward-15', 'fast-forward-15'), ('fast-forward-30', 'fast-forward-30'), ('fast-forward-45', 'fast-forward-45'), ('fast-forward-5', 'fast-forward-5'), ('fast-forward-60', 'fast-forward-60'), ('fast-forward-outline', 'fast-forward-outline'), ('faucet', 'faucet'), ('faucet-variant', 'faucet-variant'), ('fax', 'fax'), ('feather', 'feather'), ('feature-search', 'feature-search'), ('feature-search-outline', 'feature-search-outline'), ('fedora', 'fedora'), ('fence', 'fence'), ('fence-electric', 'fence-electric'), ('fencing', 'fencing'), ('ferris-wheel', 'ferris-wheel'), ('ferry', 'ferry'), ('file', 'file'), ('file-account', 'file-account'), ('file-account-outline', 'file-account-outline'), ('file-alert', 'file-alert'), ('file-alert-outline', 'file-alert-outline'), ('file-arrow-left-right', 'file-arrow-left-right'), ('file-arrow-left-right-outline', 'file-arrow-left-right-outline'), ('file-arrow-up-down', 'file-arrow-up-down'), ('file-arrow-up-down-outline', 'file-arrow-up-down-outline'), ('file-cabinet', 'file-cabinet'), ('file-cad', 'file-cad'), ('file-cad-box', 'file-cad-box'), ('file-cancel', 'file-cancel'), ('file-cancel-outline', 'file-cancel-outline'), ('file-certificate', 'file-certificate'), ('file-certificate-outline', 'file-certificate-outline'), ('file-chart', 'file-chart'), ('file-chart-check', 'file-chart-check'), ('file-chart-check-outline', 'file-chart-check-outline'), ('file-chart-outline', 'file-chart-outline'), ('file-check', 'file-check'), ('file-check-outline', 'file-check-outline'), ('file-clock', 'file-clock'), ('file-clock-outline', 'file-clock-outline'), ('file-cloud', 'file-cloud'), ('file-cloud-outline', 'file-cloud-outline'), ('file-code', 'file-code'), ('file-code-outline', 'file-code-outline'), ('file-cog', 'file-cog'), ('file-cog-outline', 'file-cog-outline'), ('file-compare', 'file-compare'), ('file-delimited', 'file-delimited'), ('file-delimited-outline', 'file-delimited-outline'), ('file-document', 'file-document'), ('file-document-alert', 'file-document-alert'), ('file-document-alert-outline', 'file-document-alert-outline'), ('file-document-check', 'file-document-check'), ('file-document-check-outline', 'file-document-check-outline'), ('file-document-edit', 'file-document-edit'), ('file-document-edit-outline', 'file-document-edit-outline'), ('file-document-minus', 'file-document-minus'), ('file-document-minus-outline', 'file-document-minus-outline'), ('file-document-multiple', 'file-document-multiple'), ('file-document-multiple-outline', 'file-document-multiple-outline'), ('file-document-outline', 'file-document-outline'), ('file-document-plus', 'file-document-plus'), ('file-document-plus-outline', 'file-document-plus-outline'), ('file-document-remove', 'file-document-remove'), ('file-document-remove-outline', 'file-document-remove-outline'), ('file-download', 'file-download'), ('file-download-outline', 'file-download-outline'), ('file-edit', 'file-edit'), ('file-edit-outline', 'file-edit-outline'), ('file-excel', 'file-excel'), ('file-excel-box', 'file-excel-box'), ('file-excel-box-outline', 'file-excel-box-outline'), ('file-excel-outline', 'file-excel-outline'), ('file-export', 'file-export'), ('file-export-outline', 'file-export-outline'), ('file-eye', 'file-eye'), ('file-eye-outline', 'file-eye-outline'), ('file-find', 'file-find'), ('file-find-outline', 'file-find-outline'), ('file-gif-box', 'file-gif-box'), ('file-hidden', 'file-hidden'), ('file-image', 'file-image'), ('file-image-box', 'file-image-box'), ('file-image-marker', 'file-image-marker'), ('file-image-marker-outline', 'file-image-marker-outline'), ('file-image-minus', 'file-image-minus'), ('file-image-minus-outline', 'file-image-minus-outline'), ('file-image-outline', 'file-image-outline'), ('file-image-plus', 'file-image-plus'), ('file-image-plus-outline', 'file-image-plus-outline'), ('file-image-remove', 'file-image-remove'), ('file-image-remove-outline', 'file-image-remove-outline'), ('file-import', 'file-import'), ('file-import-outline', 'file-import-outline'), ('file-jpg-box', 'file-jpg-box'), ('file-key', 'file-key'), ('file-key-outline', 'file-key-outline'), ('file-link', 'file-link'), ('file-link-outline', 'file-link-outline'), ('file-lock', 'file-lock'), ('file-lock-open', 'file-lock-open'), ('file-lock-open-outline', 'file-lock-open-outline'), ('file-lock-outline', 'file-lock-outline'), ('file-marker', 'file-marker'), ('file-marker-outline', 'file-marker-outline'), ('file-minus', 'file-minus'), ('file-minus-outline', 'file-minus-outline'), ('file-move', 'file-move'), ('file-move-outline', 'file-move-outline'), ('file-multiple', 'file-multiple'), ('file-multiple-outline', 'file-multiple-outline'), ('file-music', 'file-music'), ('file-music-outline', 'file-music-outline'), ('file-outline', 'file-outline'), ('file-pdf', 'file-pdf'), ('file-pdf-box', 'file-pdf-box'), ('file-pdf-box-outline', 'file-pdf-box-outline'), ('file-pdf-outline', 'file-pdf-outline'), ('file-percent', 'file-percent'), ('file-percent-outline', 'file-percent-outline'), ('file-phone', 'file-phone'), ('file-phone-outline', 'file-phone-outline'), ('file-plus', 'file-plus'), ('file-plus-outline', 'file-plus-outline'), ('file-png-box', 'file-png-box'), ('file-powerpoint', 'file-powerpoint'), ('file-powerpoint-box', 'file-powerpoint-box'), ('file-powerpoint-box-outline', 'file-powerpoint-box-outline'), ('file-powerpoint-outline', 'file-powerpoint-outline'), ('file-presentation-box', 'file-presentation-box'), ('file-question', 'file-question'), ('file-question-outline', 'file-question-outline'), ('file-refresh', 'file-refresh'), ('file-refresh-outline', 'file-refresh-outline'), ('file-remove', 'file-remove'), ('file-remove-outline', 'file-remove-outline'), ('file-replace', 'file-replace'), ('file-replace-outline', 'file-replace-outline'), ('file-restore', 'file-restore'), ('file-restore-outline', 'file-restore-outline'), ('file-rotate-left', 'file-rotate-left'), ('file-rotate-left-outline', 'file-rotate-left-outline'), ('file-rotate-right', 'file-rotate-right'), ('file-rotate-right-outline', 'file-rotate-right-outline'), ('file-search', 'file-search'), ('file-search-outline', 'file-search-outline'), ('file-send', 'file-send'), ('file-send-outline', 'file-send-outline'), ('file-settings', 'file-settings'), ('file-settings-outline', 'file-settings-outline'), ('file-sign', 'file-sign'), ('file-star', 'file-star'), ('file-star-outline', 'file-star-outline'), ('file-swap', 'file-swap'), ('file-swap-outline', 'file-swap-outline'), ('file-sync', 'file-sync'), ('file-sync-outline', 'file-sync-outline'), ('file-table', 'file-table'), ('file-table-box', 'file-table-box'), ('file-table-box-multiple', 'file-table-box-multiple'), ('file-table-box-multiple-outline', 'file-table-box-multiple-outline'), ('file-table-box-outline', 'file-table-box-outline'), ('file-table-outline', 'file-table-outline'), ('file-tree', 'file-tree'), ('file-tree-outline', 'file-tree-outline'), ('file-undo', 'file-undo'), ('file-undo-outline', 'file-undo-outline'), ('file-upload', 'file-upload'), ('file-upload-outline', 'file-upload-outline'), ('file-video', 'file-video'), ('file-video-outline', 'file-video-outline'), ('file-word', 'file-word'), ('file-word-box', 'file-word-box'), ('file-word-box-outline', 'file-word-box-outline'), ('file-word-outline', 'file-word-outline'), ('file-xml', 'file-xml'), ('file-xml-box', 'file-xml-box'), ('fill', 'fill'), ('film', 'film'), ('filmstrip', 'filmstrip'), ('filmstrip-box', 'filmstrip-box'), ('filmstrip-box-multiple', 'filmstrip-box-multiple'), ('filmstrip-off', 'filmstrip-off'), ('filter', 'filter'), ('filter-check', 'filter-check'), ('filter-check-outline', 'filter-check-outline'), ('filter-cog', 'filter-cog'), ('filter-cog-outline', 'filter-cog-outline'), ('filter-menu', 'filter-menu'), ('filter-menu-outline', 'filter-menu-outline'), ('filter-minus', 'filter-minus'), ('filter-minus-outline', 'filter-minus-outline'), ('filter-multiple', 'filter-multiple'), ('filter-multiple-outline', 'filter-multiple-outline'), ('filter-off', 'filter-off'), ('filter-off-outline', 'filter-off-outline'), ('filter-outline', 'filter-outline'), ('filter-plus', 'filter-plus'), ('filter-plus-outline', 'filter-plus-outline'), ('filter-remove', 'filter-remove'), ('filter-remove-outline', 'filter-remove-outline'), ('filter-settings', 'filter-settings'), ('filter-settings-outline', 'filter-settings-outline'), ('filter-variant', 'filter-variant'), ('filter-variant-minus', 'filter-variant-minus'), ('filter-variant-plus', 'filter-variant-plus'), ('filter-variant-remove', 'filter-variant-remove'), ('finance', 'finance'), ('find-replace', 'find-replace'), ('fingerprint', 'fingerprint'), ('fingerprint-off', 'fingerprint-off'), ('fire', 'fire'), ('fire-alert', 'fire-alert'), ('fire-circle', 'fire-circle'), ('fire-extinguisher', 'fire-extinguisher'), ('fire-hydrant', 'fire-hydrant'), ('fire-hydrant-alert', 'fire-hydrant-alert'), ('fire-hydrant-off', 'fire-hydrant-off'), ('fire-off', 'fire-off'), ('fire-truck', 'fire-truck'), ('firebase', 'firebase'), ('firefox', 'firefox'), ('fireplace', 'fireplace'), ('fireplace-off', 'fireplace-off'), ('firewire', 'firewire'), ('firework', 'firework'), ('firework-off', 'firework-off'), ('fish', 'fish'), ('fish-off', 'fish-off'), ('fishbowl', 'fishbowl'), ('fishbowl-outline', 'fishbowl-outline'), ('fit-to-page', 'fit-to-page'), ('fit-to-page-outline', 'fit-to-page-outline'), ('fit-to-screen', 'fit-to-screen'), ('fit-to-screen-outline', 'fit-to-screen-outline'), ('flag', 'flag'), ('flag-checkered', 'flag-checkered'), ('flag-checkered-variant', 'flag-checkered-variant'), ('flag-minus', 'flag-minus'), ('flag-minus-outline', 'flag-minus-outline'), ('flag-off', 'flag-off'), ('flag-off-outline', 'flag-off-outline'), ('flag-outline', 'flag-outline'), ('flag-outline-variant', 'flag-outline-variant'), ('flag-plus', 'flag-plus'), ('flag-plus-outline', 'flag-plus-outline'), ('flag-remove', 'flag-remove'), ('flag-remove-outline', 'flag-remove-outline'), ('flag-triangle', 'flag-triangle'), ('flag-variant', 'flag-variant'), ('flag-variant-minus', 'flag-variant-minus'), ('flag-variant-minus-outline', 'flag-variant-minus-outline'), ('flag-variant-off', 'flag-variant-off'), ('flag-variant-off-outline', 'flag-variant-off-outline'), ('flag-variant-outline', 'flag-variant-outline'), ('flag-variant-plus', 'flag-variant-plus'), ('flag-variant-plus-outline', 'flag-variant-plus-outline'), ('flag-variant-remove', 'flag-variant-remove'), ('flag-variant-remove-outline', 'flag-variant-remove-outline'), ('flare', 'flare'), ('flash', 'flash'), ('flash-alert', 'flash-alert'), ('flash-alert-outline', 'flash-alert-outline'), ('flash-auto', 'flash-auto'), ('flash-off', 'flash-off'), ('flash-off-outline', 'flash-off-outline'), ('flash-outline', 'flash-outline'), ('flash-red-eye', 'flash-red-eye'), ('flash-triangle', 'flash-triangle'), ('flash-triangle-outline', 'flash-triangle-outline'), ('flashlight', 'flashlight'), ('flashlight-off', 'flashlight-off'), ('flask', 'flask'), ('flask-empty', 'flask-empty'), ('flask-empty-minus', 'flask-empty-minus'), ('flask-empty-minus-outline', 'flask-empty-minus-outline'), ('flask-empty-off', 'flask-empty-off'), ('flask-empty-off-outline', 'flask-empty-off-outline'), ('flask-empty-outline', 'flask-empty-outline'), ('flask-empty-plus', 'flask-empty-plus'), ('flask-empty-plus-outline', 'flask-empty-plus-outline'), ('flask-empty-remove', 'flask-empty-remove'), ('flask-empty-remove-outline', 'flask-empty-remove-outline'), ('flask-minus', 'flask-minus'), ('flask-minus-outline', 'flask-minus-outline'), ('flask-off', 'flask-off'), ('flask-off-outline', 'flask-off-outline'), ('flask-outline', 'flask-outline'), ('flask-plus', 'flask-plus'), ('flask-plus-outline', 'flask-plus-outline'), ('flask-remove', 'flask-remove'), ('flask-remove-outline', 'flask-remove-outline'), ('flask-round-bottom', 'flask-round-bottom'), ('flask-round-bottom-empty', 'flask-round-bottom-empty'), ('flask-round-bottom-empty-outline', 'flask-round-bottom-empty-outline'), ('flask-round-bottom-outline', 'flask-round-bottom-outline'), ('flattr', 'flattr'), ('fleur-de-lis', 'fleur-de-lis'), ('flickr', 'flickr'), ('flickr-after', 'flickr-after'), ('flickr-before', 'flickr-before'), ('flip-horizontal', 'flip-horizontal'), ('flip-to-back', 'flip-to-back'), ('flip-to-front', 'flip-to-front'), ('flip-vertical', 'flip-vertical'), ('floor-1', 'floor-1'), ('floor-2', 'floor-2'), ('floor-3', 'floor-3'), ('floor-a', 'floor-a'), ('floor-b', 'floor-b'), ('floor-g', 'floor-g'), ('floor-l', 'floor-l'), ('floor-lamp', 'floor-lamp'), ('floor-lamp-dual', 'floor-lamp-dual'), ('floor-lamp-dual-outline', 'floor-lamp-dual-outline'), ('floor-lamp-outline', 'floor-lamp-outline'), ('floor-lamp-torchiere', 'floor-lamp-torchiere'), ('floor-lamp-torchiere-outline', 'floor-lamp-torchiere-outline'), ('floor-lamp-torchiere-variant', 'floor-lamp-torchiere-variant'), ('floor-lamp-torchiere-variant-outline', 'floor-lamp-torchiere-variant-outline'), ('floor-plan', 'floor-plan'), ('floppy', 'floppy'), ('floppy-variant', 'floppy-variant'), ('flower', 'flower'), ('flower-outline', 'flower-outline'), ('flower-pollen', 'flower-pollen'), ('flower-pollen-outline', 'flower-pollen-outline'), ('flower-poppy', 'flower-poppy'), ('flower-tulip', 'flower-tulip'), ('flower-tulip-outline', 'flower-tulip-outline'), ('focus-auto', 'focus-auto'), ('focus-field', 'focus-field'), ('focus-field-horizontal', 'focus-field-horizontal'), ('focus-field-vertical', 'focus-field-vertical'), ('folder', 'folder'), ('folder-account', 'folder-account'), ('folder-account-outline', 'folder-account-outline'), ('folder-alert', 'folder-alert'), ('folder-alert-outline', 'folder-alert-outline'), ('folder-arrow-down', 'folder-arrow-down'), ('folder-arrow-down-outline', 'folder-arrow-down-outline'), ('folder-arrow-left', 'folder-arrow-left'), ('folder-arrow-left-outline', 'folder-arrow-left-outline'), ('folder-arrow-left-right', 'folder-arrow-left-right'), ('folder-arrow-left-right-outline', 'folder-arrow-left-right-outline'), ('folder-arrow-right', 'folder-arrow-right'), ('folder-arrow-right-outline', 'folder-arrow-right-outline'), ('folder-arrow-up', 'folder-arrow-up'), ('folder-arrow-up-down', 'folder-arrow-up-down'), ('folder-arrow-up-down-outline', 'folder-arrow-up-down-outline'), ('folder-arrow-up-outline', 'folder-arrow-up-outline'), ('folder-cancel', 'folder-cancel'), ('folder-cancel-outline', 'folder-cancel-outline'), ('folder-check', 'folder-check'), ('folder-check-outline', 'folder-check-outline'), ('folder-clock', 'folder-clock'), ('folder-clock-outline', 'folder-clock-outline'), ('folder-cog', 'folder-cog'), ('folder-cog-outline', 'folder-cog-outline'), ('folder-download', 'folder-download'), ('folder-download-outline', 'folder-download-outline'), ('folder-edit', 'folder-edit'), ('folder-edit-outline', 'folder-edit-outline'), ('folder-eye', 'folder-eye'), ('folder-eye-outline', 'folder-eye-outline'), ('folder-file', 'folder-file'), ('folder-file-outline', 'folder-file-outline'), ('folder-google-drive', 'folder-google-drive'), ('folder-heart', 'folder-heart'), ('folder-heart-outline', 'folder-heart-outline'), ('folder-hidden', 'folder-hidden'), ('folder-home', 'folder-home'), ('folder-home-outline', 'folder-home-outline'), ('folder-image', 'folder-image'), ('folder-information', 'folder-information'), ('folder-information-outline', 'folder-information-outline'), ('folder-key', 'folder-key'), ('folder-key-network', 'folder-key-network'), ('folder-key-network-outline', 'folder-key-network-outline'), ('folder-key-outline', 'folder-key-outline'), ('folder-lock', 'folder-lock'), ('folder-lock-open', 'folder-lock-open'), ('folder-lock-open-outline', 'folder-lock-open-outline'), ('folder-lock-outline', 'folder-lock-outline'), ('folder-marker', 'folder-marker'), ('folder-marker-outline', 'folder-marker-outline'), ('folder-minus', 'folder-minus'), ('folder-minus-outline', 'folder-minus-outline'), ('folder-move', 'folder-move'), ('folder-move-outline', 'folder-move-outline'), ('folder-multiple', 'folder-multiple'), ('folder-multiple-image', 'folder-multiple-image'), ('folder-multiple-outline', 'folder-multiple-outline'), ('folder-multiple-plus', 'folder-multiple-plus'), ('folder-multiple-plus-outline', 'folder-multiple-plus-outline'), ('folder-music', 'folder-music'), ('folder-music-outline', 'folder-music-outline'), ('folder-network', 'folder-network'), ('folder-network-outline', 'folder-network-outline'), ('folder-off', 'folder-off'), ('folder-off-outline', 'folder-off-outline'), ('folder-open', 'folder-open'), ('folder-open-outline', 'folder-open-outline'), ('folder-outline', 'folder-outline'), ('folder-outline-lock', 'folder-outline-lock'), ('folder-play', 'folder-play'), ('folder-play-outline', 'folder-play-outline'), ('folder-plus', 'folder-plus'), ('folder-plus-outline', 'folder-plus-outline'), ('folder-pound', 'folder-pound'), ('folder-pound-outline', 'folder-pound-outline'), ('folder-question', 'folder-question'), ('folder-question-outline', 'folder-question-outline'), ('folder-refresh', 'folder-refresh'), ('folder-refresh-outline', 'folder-refresh-outline'), ('folder-remove', 'folder-remove'), ('folder-remove-outline', 'folder-remove-outline'), ('folder-search', 'folder-search'), ('folder-search-outline', 'folder-search-outline'), ('folder-settings', 'folder-settings'), ('folder-settings-outline', 'folder-settings-outline'), ('folder-star', 'folder-star'), ('folder-star-multiple', 'folder-star-multiple'), ('folder-star-multiple-outline', 'folder-star-multiple-outline'), ('folder-star-outline', 'folder-star-outline'), ('folder-swap', 'folder-swap'), ('folder-swap-outline', 'folder-swap-outline'), ('folder-sync', 'folder-sync'), ('folder-sync-outline', 'folder-sync-outline'), ('folder-table', 'folder-table'), ('folder-table-outline', 'folder-table-outline'), ('folder-text', 'folder-text'), ('folder-text-outline', 'folder-text-outline'), ('folder-upload', 'folder-upload'), ('folder-upload-outline', 'folder-upload-outline'), ('folder-wrench', 'folder-wrench'), ('folder-wrench-outline', 'folder-wrench-outline'), ('folder-zip', 'folder-zip'), ('folder-zip-outline', 'folder-zip-outline'), ('font-awesome', 'font-awesome'), ('food', 'food'), ('food-apple', 'food-apple'), ('food-apple-outline', 'food-apple-outline'), ('food-croissant', 'food-croissant'), ('food-drumstick', 'food-drumstick'), ('food-drumstick-off', 'food-drumstick-off'), ('food-drumstick-off-outline', 'food-drumstick-off-outline'), ('food-drumstick-outline', 'food-drumstick-outline'), ('food-fork-drink', 'food-fork-drink'), ('food-halal', 'food-halal'), ('food-hot-dog', 'food-hot-dog'), ('food-kosher', 'food-kosher'), ('food-off', 'food-off'), ('food-off-outline', 'food-off-outline'), ('food-outline', 'food-outline'), ('food-steak', 'food-steak'), ('food-steak-off', 'food-steak-off'), ('food-takeout-box', 'food-takeout-box'), ('food-takeout-box-outline', 'food-takeout-box-outline'), ('food-turkey', 'food-turkey'), ('food-variant', 'food-variant'), ('food-variant-off', 'food-variant-off'), ('foot-print', 'foot-print'), ('football', 'football'), ('football-australian', 'football-australian'), ('football-helmet', 'football-helmet'), ('footer', 'footer'), ('forest', 'forest'), ('forklift', 'forklift'), ('form-dropdown', 'form-dropdown'), ('form-select', 'form-select'), ('form-textarea', 'form-textarea'), ('form-textbox', 'form-textbox'), ('form-textbox-lock', 'form-textbox-lock'), ('form-textbox-password', 'form-textbox-password'), ('format-align-bottom', 'format-align-bottom'), ('format-align-center', 'format-align-center'), ('format-align-justify', 'format-align-justify'), ('format-align-left', 'format-align-left'), ('format-align-middle', 'format-align-middle'), ('format-align-right', 'format-align-right'), ('format-align-top', 'format-align-top'), ('format-annotation-minus', 'format-annotation-minus'), ('format-annotation-plus', 'format-annotation-plus'), ('format-bold', 'format-bold'), ('format-clear', 'format-clear'), ('format-color', 'format-color'), ('format-color-fill', 'format-color-fill'), ('format-color-highlight', 'format-color-highlight'), ('format-color-marker-cancel', 'format-color-marker-cancel'), ('format-color-text', 'format-color-text'), ('format-columns', 'format-columns'), ('format-float-center', 'format-float-center'), ('format-float-left', 'format-float-left'), ('format-float-none', 'format-float-none'), ('format-float-right', 'format-float-right'), ('format-font', 'format-font'), ('format-font-size-decrease', 'format-font-size-decrease'), ('format-font-size-increase', 'format-font-size-increase'), ('format-header-1', 'format-header-1'), ('format-header-2', 'format-header-2'), ('format-header-3', 'format-header-3'), ('format-header-4', 'format-header-4'), ('format-header-5', 'format-header-5'), ('format-header-6', 'format-header-6'), ('format-header-decrease', 'format-header-decrease'), ('format-header-down', 'format-header-down'), ('format-header-equal', 'format-header-equal'), ('format-header-increase', 'format-header-increase'), ('format-header-pound', 'format-header-pound'), ('format-header-up', 'format-header-up'), ('format-horizontal-align-center', 'format-horizontal-align-center'), ('format-horizontal-align-left', 'format-horizontal-align-left'), ('format-horizontal-align-right', 'format-horizontal-align-right'), ('format-indent-decrease', 'format-indent-decrease'), ('format-indent-increase', 'format-indent-increase'), ('format-italic', 'format-italic'), ('format-letter-case', 'format-letter-case'), ('format-letter-case-lower', 'format-letter-case-lower'), ('format-letter-case-upper', 'format-letter-case-upper'), ('format-letter-ends-with', 'format-letter-ends-with'), ('format-letter-matches', 'format-letter-matches'), ('format-letter-spacing', 'format-letter-spacing'), ('format-letter-spacing-variant', 'format-letter-spacing-variant'), ('format-letter-starts-with', 'format-letter-starts-with'), ('format-line-height', 'format-line-height'), ('format-line-spacing', 'format-line-spacing'), ('format-line-style', 'format-line-style'), ('format-line-weight', 'format-line-weight'), ('format-list-bulleted', 'format-list-bulleted'), ('format-list-bulleted-square', 'format-list-bulleted-square'), ('format-list-bulleted-triangle', 'format-list-bulleted-triangle'), ('format-list-bulleted-type', 'format-list-bulleted-type'), ('format-list-checkbox', 'format-list-checkbox'), ('format-list-checks', 'format-list-checks'), ('format-list-group', 'format-list-group'), ('format-list-group-plus', 'format-list-group-plus'), ('format-list-numbered', 'format-list-numbered'), ('format-list-numbered-rtl', 'format-list-numbered-rtl'), ('format-list-text', 'format-list-text'), ('format-list-triangle', 'format-list-triangle'), ('format-overline', 'format-overline'), ('format-page-break', 'format-page-break'), ('format-page-split', 'format-page-split'), ('format-paint', 'format-paint'), ('format-paragraph', 'format-paragraph'), ('format-paragraph-spacing', 'format-paragraph-spacing'), ('format-pilcrow', 'format-pilcrow'), ('format-pilcrow-arrow-left', 'format-pilcrow-arrow-left'), ('format-pilcrow-arrow-right', 'format-pilcrow-arrow-right'), ('format-quote-close', 'format-quote-close'), ('format-quote-close-outline', 'format-quote-close-outline'), ('format-quote-open', 'format-quote-open'), ('format-quote-open-outline', 'format-quote-open-outline'), ('format-rotate-90', 'format-rotate-90'), ('format-section', 'format-section'), ('format-size', 'format-size'), ('format-strikethrough', 'format-strikethrough'), ('format-strikethrough-variant', 'format-strikethrough-variant'), ('format-subscript', 'format-subscript'), ('format-superscript', 'format-superscript'), ('format-text', 'format-text'), ('format-text-rotation-angle-down', 'format-text-rotation-angle-down'), ('format-text-rotation-angle-up', 'format-text-rotation-angle-up'), ('format-text-rotation-down', 'format-text-rotation-down'), ('format-text-rotation-down-vertical', 'format-text-rotation-down-vertical'), ('format-text-rotation-none', 'format-text-rotation-none'), ('format-text-rotation-up', 'format-text-rotation-up'), ('format-text-rotation-vertical', 'format-text-rotation-vertical'), ('format-text-variant', 'format-text-variant'), ('format-text-variant-outline', 'format-text-variant-outline'), ('format-text-wrapping-clip', 'format-text-wrapping-clip'), ('format-text-wrapping-overflow', 'format-text-wrapping-overflow'), ('format-text-wrapping-wrap', 'format-text-wrapping-wrap'), ('format-textbox', 'format-textbox'), ('format-title', 'format-title'), ('format-underline', 'format-underline'), ('format-underline-wavy', 'format-underline-wavy'), ('format-vertical-align-bottom', 'format-vertical-align-bottom'), ('format-vertical-align-center', 'format-vertical-align-center'), ('format-vertical-align-top', 'format-vertical-align-top'), ('format-wrap-inline', 'format-wrap-inline'), ('format-wrap-square', 'format-wrap-square'), ('format-wrap-tight', 'format-wrap-tight'), ('format-wrap-top-bottom', 'format-wrap-top-bottom'), ('forum', 'forum'), ('forum-minus', 'forum-minus'), ('forum-minus-outline', 'forum-minus-outline'), ('forum-outline', 'forum-outline'), ('forum-plus', 'forum-plus'), ('forum-plus-outline', 'forum-plus-outline'), ('forum-remove', 'forum-remove'), ('forum-remove-outline', 'forum-remove-outline'), ('forward', 'forward'), ('forwardburger', 'forwardburger'), ('fountain', 'fountain'), ('fountain-pen', 'fountain-pen'), ('fountain-pen-tip', 'fountain-pen-tip'), ('foursquare', 'foursquare'), ('fraction-one-half', 'fraction-one-half'), ('freebsd', 'freebsd'), ('french-fries', 'french-fries'), ('frequently-asked-questions', 'frequently-asked-questions'), ('fridge', 'fridge'), ('fridge-alert', 'fridge-alert'), ('fridge-alert-outline', 'fridge-alert-outline'), ('fridge-bottom', 'fridge-bottom'), ('fridge-industrial', 'fridge-industrial'), ('fridge-industrial-alert', 'fridge-industrial-alert'), ('fridge-industrial-alert-outline', 'fridge-industrial-alert-outline'), ('fridge-industrial-off', 'fridge-industrial-off'), ('fridge-industrial-off-outline', 'fridge-industrial-off-outline'), ('fridge-industrial-outline', 'fridge-industrial-outline'), ('fridge-off', 'fridge-off'), ('fridge-off-outline', 'fridge-off-outline'), ('fridge-outline', 'fridge-outline'), ('fridge-top', 'fridge-top'), ('fridge-variant', 'fridge-variant'), ('fridge-variant-alert', 'fridge-variant-alert'), ('fridge-variant-alert-outline', 'fridge-variant-alert-outline'), ('fridge-variant-off', 'fridge-variant-off'), ('fridge-variant-off-outline', 'fridge-variant-off-outline'), ('fridge-variant-outline', 'fridge-variant-outline'), ('fruit-cherries', 'fruit-cherries'), ('fruit-cherries-off', 'fruit-cherries-off'), ('fruit-citrus', 'fruit-citrus'), ('fruit-citrus-off', 'fruit-citrus-off'), ('fruit-grapes', 'fruit-grapes'), ('fruit-grapes-outline', 'fruit-grapes-outline'), ('fruit-pear', 'fruit-pear'), ('fruit-pineapple', 'fruit-pineapple'), ('fruit-watermelon', 'fruit-watermelon'), ('fuel', 'fuel'), ('fuel-cell', 'fuel-cell'), ('fullscreen', 'fullscreen'), ('fullscreen-exit', 'fullscreen-exit'), ('function', 'function'), ('function-variant', 'function-variant'), ('furigana-horizontal', 'furigana-horizontal'), ('furigana-vertical', 'furigana-vertical'), ('fuse', 'fuse'), ('fuse-alert', 'fuse-alert'), ('fuse-blade', 'fuse-blade'), ('fuse-off', 'fuse-off'), ('gamepad', 'gamepad'), ('gamepad-circle', 'gamepad-circle'), ('gamepad-circle-down', 'gamepad-circle-down'), ('gamepad-circle-left', 'gamepad-circle-left'), ('gamepad-circle-outline', 'gamepad-circle-outline'), ('gamepad-circle-right', 'gamepad-circle-right'), ('gamepad-circle-up', 'gamepad-circle-up'), ('gamepad-down', 'gamepad-down'), ('gamepad-left', 'gamepad-left'), ('gamepad-outline', 'gamepad-outline'), ('gamepad-right', 'gamepad-right'), ('gamepad-round', 'gamepad-round'), ('gamepad-round-down', 'gamepad-round-down'), ('gamepad-round-left', 'gamepad-round-left'), ('gamepad-round-outline', 'gamepad-round-outline'), ('gamepad-round-right', 'gamepad-round-right'), ('gamepad-round-up', 'gamepad-round-up'), ('gamepad-square', 'gamepad-square'), ('gamepad-square-outline', 'gamepad-square-outline'), ('gamepad-up', 'gamepad-up'), ('gamepad-variant', 'gamepad-variant'), ('gamepad-variant-outline', 'gamepad-variant-outline'), ('gamma', 'gamma'), ('gantry-crane', 'gantry-crane'), ('garage', 'garage'), ('garage-alert', 'garage-alert'), ('garage-alert-variant', 'garage-alert-variant'), ('garage-lock', 'garage-lock'), ('garage-open', 'garage-open'), ('garage-open-variant', 'garage-open-variant'), ('garage-variant', 'garage-variant'), ('garage-variant-lock', 'garage-variant-lock'), ('gas-burner', 'gas-burner'), ('gas-cylinder', 'gas-cylinder'), ('gas-station', 'gas-station'), ('gas-station-off', 'gas-station-off'), ('gas-station-off-outline', 'gas-station-off-outline'), ('gas-station-outline', 'gas-station-outline'), ('gate', 'gate'), ('gate-alert', 'gate-alert'), ('gate-and', 'gate-and'), ('gate-arrow-left', 'gate-arrow-left'), ('gate-arrow-right', 'gate-arrow-right'), ('gate-buffer', 'gate-buffer'), ('gate-nand', 'gate-nand'), ('gate-nor', 'gate-nor'), ('gate-not', 'gate-not'), ('gate-open', 'gate-open'), ('gate-or', 'gate-or'), ('gate-xnor', 'gate-xnor'), ('gate-xor', 'gate-xor'), ('gatsby', 'gatsby'), ('gauge', 'gauge'), ('gauge-empty', 'gauge-empty'), ('gauge-full', 'gauge-full'), ('gauge-low', 'gauge-low'), ('gavel', 'gavel'), ('gender-female', 'gender-female'), ('gender-male', 'gender-male'), ('gender-male-female', 'gender-male-female'), ('gender-male-female-variant', 'gender-male-female-variant'), ('gender-non-binary', 'gender-non-binary'), ('gender-transgender', 'gender-transgender'), ('gentoo', 'gentoo'), ('gesture', 'gesture'), ('gesture-double-tap', 'gesture-double-tap'), ('gesture-pinch', 'gesture-pinch'), ('gesture-spread', 'gesture-spread'), ('gesture-swipe', 'gesture-swipe'), ('gesture-swipe-down', 'gesture-swipe-down'), ('gesture-swipe-horizontal', 'gesture-swipe-horizontal'), ('gesture-swipe-left', 'gesture-swipe-left'), ('gesture-swipe-right', 'gesture-swipe-right'), ('gesture-swipe-up', 'gesture-swipe-up'), ('gesture-swipe-vertical', 'gesture-swipe-vertical'), ('gesture-tap', 'gesture-tap'), ('gesture-tap-box', 'gesture-tap-box'), ('gesture-tap-button', 'gesture-tap-button'), ('gesture-tap-hold', 'gesture-tap-hold'), ('gesture-two-double-tap', 'gesture-two-double-tap'), ('gesture-two-tap', 'gesture-two-tap'), ('ghost', 'ghost'), ('ghost-off', 'ghost-off'), ('ghost-off-outline', 'ghost-off-outline'), ('ghost-outline', 'ghost-outline'), ('gif', 'gif'), ('gift', 'gift'), ('gift-off', 'gift-off'), ('gift-off-outline', 'gift-off-outline'), ('gift-open', 'gift-open'), ('gift-open-outline', 'gift-open-outline'), ('gift-outline', 'gift-outline'), ('git', 'git'), ('github', 'github'), ('github-box', 'github-box'), ('github-face', 'github-face'), ('gitlab', 'gitlab'), ('glass-cocktail', 'glass-cocktail'), ('glass-cocktail-off', 'glass-cocktail-off'), ('glass-flute', 'glass-flute'), ('glass-fragile', 'glass-fragile'), ('glass-mug', 'glass-mug'), ('glass-mug-off', 'glass-mug-off'), ('glass-mug-variant', 'glass-mug-variant'), ('glass-mug-variant-off', 'glass-mug-variant-off'), ('glass-pint-outline', 'glass-pint-outline'), ('glass-stange', 'glass-stange'), ('glass-tulip', 'glass-tulip'), ('glass-wine', 'glass-wine'), ('glassdoor', 'glassdoor'), ('glasses', 'glasses'), ('globe-light', 'globe-light'), ('globe-light-outline', 'globe-light-outline'), ('globe-model', 'globe-model'), ('gmail', 'gmail'), ('gnome', 'gnome'), ('go-kart', 'go-kart'), ('go-kart-track', 'go-kart-track'), ('gog', 'gog'), ('gold', 'gold'), ('golf', 'golf'), ('golf-cart', 'golf-cart'), ('golf-tee', 'golf-tee'), ('gondola', 'gondola'), ('goodreads', 'goodreads'), ('google', 'google'), ('google-ads', 'google-ads'), ('google-allo', 'google-allo'), ('google-analytics', 'google-analytics'), ('google-assistant', 'google-assistant'), ('google-cardboard', 'google-cardboard'), ('google-chrome', 'google-chrome'), ('google-circles', 'google-circles'), ('google-circles-communities', 'google-circles-communities'), ('google-circles-extended', 'google-circles-extended'), ('google-circles-group', 'google-circles-group'), ('google-classroom', 'google-classroom'), ('google-cloud', 'google-cloud'), ('google-downasaur', 'google-downasaur'), ('google-drive', 'google-drive'), ('google-earth', 'google-earth'), ('google-fit', 'google-fit'), ('google-glass', 'google-glass'), ('google-hangouts', 'google-hangouts'), ('google-home', 'google-home'), ('google-keep', 'google-keep'), ('google-lens', 'google-lens'), ('google-maps', 'google-maps'), ('google-my-business', 'google-my-business'), ('google-nearby', 'google-nearby'), ('google-pages', 'google-pages'), ('google-photos', 'google-photos'), ('google-physical-web', 'google-physical-web'), ('google-play', 'google-play'), ('google-plus', 'google-plus'), ('google-plus-box', 'google-plus-box'), ('google-podcast', 'google-podcast'), ('google-spreadsheet', 'google-spreadsheet'), ('google-street-view', 'google-street-view'), ('google-translate', 'google-translate'), ('google-wallet', 'google-wallet'), ('gradient-horizontal', 'gradient-horizontal'), ('gradient-vertical', 'gradient-vertical'), ('grain', 'grain'), ('graph', 'graph'), ('graph-outline', 'graph-outline'), ('graphql', 'graphql'), ('grass', 'grass'), ('grave-stone', 'grave-stone'), ('grease-pencil', 'grease-pencil'), ('greater-than', 'greater-than'), ('greater-than-or-equal', 'greater-than-or-equal'), ('greenhouse', 'greenhouse'), ('grid', 'grid'), ('grid-large', 'grid-large'), ('grid-off', 'grid-off'), ('grill', 'grill'), ('grill-outline', 'grill-outline'), ('group', 'group'), ('guitar-acoustic', 'guitar-acoustic'), ('guitar-electric', 'guitar-electric'), ('guitar-pick', 'guitar-pick'), ('guitar-pick-outline', 'guitar-pick-outline'), ('guy-fawkes-mask', 'guy-fawkes-mask'), ('gymnastics', 'gymnastics'), ('hail', 'hail'), ('hair-dryer', 'hair-dryer'), ('hair-dryer-outline', 'hair-dryer-outline'), ('halloween', 'halloween'), ('hamburger', 'hamburger'), ('hamburger-check', 'hamburger-check'), ('hamburger-minus', 'hamburger-minus'), ('hamburger-off', 'hamburger-off'), ('hamburger-plus', 'hamburger-plus'), ('hamburger-remove', 'hamburger-remove'), ('hammer', 'hammer'), ('hammer-screwdriver', 'hammer-screwdriver'), ('hammer-sickle', 'hammer-sickle'), ('hammer-wrench', 'hammer-wrench'), ('hand-back-left', 'hand-back-left'), ('hand-back-left-off', 'hand-back-left-off'), ('hand-back-left-off-outline', 'hand-back-left-off-outline'), ('hand-back-left-outline', 'hand-back-left-outline'), ('hand-back-right', 'hand-back-right'), ('hand-back-right-off', 'hand-back-right-off'), ('hand-back-right-off-outline', 'hand-back-right-off-outline'), ('hand-back-right-outline', 'hand-back-right-outline'), ('hand-clap', 'hand-clap'), ('hand-clap-off', 'hand-clap-off'), ('hand-coin', 'hand-coin'), ('hand-coin-outline', 'hand-coin-outline'), ('hand-cycle', 'hand-cycle'), ('hand-extended', 'hand-extended'), ('hand-extended-outline', 'hand-extended-outline'), ('hand-front-left', 'hand-front-left'), ('hand-front-left-outline', 'hand-front-left-outline'), ('hand-front-right', 'hand-front-right'), ('hand-front-right-outline', 'hand-front-right-outline'), ('hand-heart', 'hand-heart'), ('hand-heart-outline', 'hand-heart-outline'), ('hand-left', 'hand-left'), ('hand-okay', 'hand-okay'), ('hand-peace', 'hand-peace'), ('hand-peace-variant', 'hand-peace-variant'), ('hand-pointing-down', 'hand-pointing-down'), ('hand-pointing-left', 'hand-pointing-left'), ('hand-pointing-right', 'hand-pointing-right'), ('hand-pointing-up', 'hand-pointing-up'), ('hand-right', 'hand-right'), ('hand-saw', 'hand-saw'), ('hand-wash', 'hand-wash'), ('hand-wash-outline', 'hand-wash-outline'), ('hand-water', 'hand-water'), ('hand-wave', 'hand-wave'), ('hand-wave-outline', 'hand-wave-outline'), ('handball', 'handball'), ('handcuffs', 'handcuffs'), ('hands-pray', 'hands-pray'), ('handshake', 'handshake'), ('handshake-outline', 'handshake-outline'), ('hanger', 'hanger'), ('hangouts', 'hangouts'), ('hard-hat', 'hard-hat'), ('harddisk', 'harddisk'), ('harddisk-plus', 'harddisk-plus'), ('harddisk-remove', 'harddisk-remove'), ('hat-fedora', 'hat-fedora'), ('hazard-lights', 'hazard-lights'), ('hdmi-port', 'hdmi-port'), ('hdr', 'hdr'), ('hdr-off', 'hdr-off'), ('head', 'head'), ('head-alert', 'head-alert'), ('head-alert-outline', 'head-alert-outline'), ('head-check', 'head-check'), ('head-check-outline', 'head-check-outline'), ('head-cog', 'head-cog'), ('head-cog-outline', 'head-cog-outline'), ('head-dots-horizontal', 'head-dots-horizontal'), ('head-dots-horizontal-outline', 'head-dots-horizontal-outline'), ('head-flash', 'head-flash'), ('head-flash-outline', 'head-flash-outline'), ('head-heart', 'head-heart'), ('head-heart-outline', 'head-heart-outline'), ('head-lightbulb', 'head-lightbulb'), ('head-lightbulb-outline', 'head-lightbulb-outline'), ('head-minus', 'head-minus'), ('head-minus-outline', 'head-minus-outline'), ('head-outline', 'head-outline'), ('head-plus', 'head-plus'), ('head-plus-outline', 'head-plus-outline'), ('head-question', 'head-question'), ('head-question-outline', 'head-question-outline'), ('head-remove', 'head-remove'), ('head-remove-outline', 'head-remove-outline'), ('head-snowflake', 'head-snowflake'), ('head-snowflake-outline', 'head-snowflake-outline'), ('head-sync', 'head-sync'), ('head-sync-outline', 'head-sync-outline'), ('headphones', 'headphones'), ('headphones-bluetooth', 'headphones-bluetooth'), ('headphones-box', 'headphones-box'), ('headphones-off', 'headphones-off'), ('headphones-settings', 'headphones-settings'), ('headset', 'headset'), ('headset-dock', 'headset-dock'), ('headset-off', 'headset-off'), ('heart', 'heart'), ('heart-box', 'heart-box'), ('heart-box-outline', 'heart-box-outline'), ('heart-broken', 'heart-broken'), ('heart-broken-outline', 'heart-broken-outline'), ('heart-circle', 'heart-circle'), ('heart-circle-outline', 'heart-circle-outline'), ('heart-cog', 'heart-cog'), ('heart-cog-outline', 'heart-cog-outline'), ('heart-flash', 'heart-flash'), ('heart-half', 'heart-half'), ('heart-half-full', 'heart-half-full'), ('heart-half-outline', 'heart-half-outline'), ('heart-minus', 'heart-minus'), ('heart-minus-outline', 'heart-minus-outline'), ('heart-multiple', 'heart-multiple'), ('heart-multiple-outline', 'heart-multiple-outline'), ('heart-off', 'heart-off'), ('heart-off-outline', 'heart-off-outline'), ('heart-outline', 'heart-outline'), ('heart-plus', 'heart-plus'), ('heart-plus-outline', 'heart-plus-outline'), ('heart-pulse', 'heart-pulse'), ('heart-remove', 'heart-remove'), ('heart-remove-outline', 'heart-remove-outline'), ('heart-settings', 'heart-settings'), ('heart-settings-outline', 'heart-settings-outline'), ('heat-pump', 'heat-pump'), ('heat-pump-outline', 'heat-pump-outline'), ('heat-wave', 'heat-wave'), ('heating-coil', 'heating-coil'), ('helicopter', 'helicopter'), ('help', 'help'), ('help-box', 'help-box'), ('help-circle', 'help-circle'), ('help-circle-outline', 'help-circle-outline'), ('help-network', 'help-network'), ('help-network-outline', 'help-network-outline'), ('help-rhombus', 'help-rhombus'), ('help-rhombus-outline', 'help-rhombus-outline'), ('hexadecimal', 'hexadecimal'), ('hexagon', 'hexagon'), ('hexagon-multiple', 'hexagon-multiple'), ('hexagon-multiple-outline', 'hexagon-multiple-outline'), ('hexagon-outline', 'hexagon-outline'), ('hexagon-slice-1', 'hexagon-slice-1'), ('hexagon-slice-2', 'hexagon-slice-2'), ('hexagon-slice-3', 'hexagon-slice-3'), ('hexagon-slice-4', 'hexagon-slice-4'), ('hexagon-slice-5', 'hexagon-slice-5'), ('hexagon-slice-6', 'hexagon-slice-6'), ('hexagram', 'hexagram'), ('hexagram-outline', 'hexagram-outline'), ('high-definition', 'high-definition'), ('high-definition-box', 'high-definition-box'), ('highway', 'highway'), ('hiking', 'hiking'), ('history', 'history'), ('hockey-puck', 'hockey-puck'), ('hockey-sticks', 'hockey-sticks'), ('hololens', 'hololens'), ('home', 'home'), ('home-account', 'home-account'), ('home-alert', 'home-alert'), ('home-alert-outline', 'home-alert-outline'), ('home-analytics', 'home-analytics'), ('home-assistant', 'home-assistant'), ('home-automation', 'home-automation'), ('home-battery', 'home-battery'), ('home-battery-outline', 'home-battery-outline'), ('home-circle', 'home-circle'), ('home-circle-outline', 'home-circle-outline'), ('home-city', 'home-city'), ('home-city-outline', 'home-city-outline'), ('home-clock', 'home-clock'), ('home-clock-outline', 'home-clock-outline'), ('home-currency-usd', 'home-currency-usd'), ('home-edit', 'home-edit'), ('home-edit-outline', 'home-edit-outline'), ('home-export-outline', 'home-export-outline'), ('home-flood', 'home-flood'), ('home-floor-0', 'home-floor-0'), ('home-floor-1', 'home-floor-1'), ('home-floor-2', 'home-floor-2'), ('home-floor-3', 'home-floor-3'), ('home-floor-a', 'home-floor-a'), ('home-floor-b', 'home-floor-b'), ('home-floor-g', 'home-floor-g'), ('home-floor-l', 'home-floor-l'), ('home-floor-negative-1', 'home-floor-negative-1'), ('home-group', 'home-group'), ('home-group-minus', 'home-group-minus'), ('home-group-plus', 'home-group-plus'), ('home-group-remove', 'home-group-remove'), ('home-heart', 'home-heart'), ('home-import-outline', 'home-import-outline'), ('home-lightbulb', 'home-lightbulb'), ('home-lightbulb-outline', 'home-lightbulb-outline'), ('home-lightning-bolt', 'home-lightning-bolt'), ('home-lightning-bolt-outline', 'home-lightning-bolt-outline'), ('home-lock', 'home-lock'), ('home-lock-open', 'home-lock-open'), ('home-map-marker', 'home-map-marker'), ('home-minus', 'home-minus'), ('home-minus-outline', 'home-minus-outline'), ('home-modern', 'home-modern'), ('home-off', 'home-off'), ('home-off-outline', 'home-off-outline'), ('home-outline', 'home-outline'), ('home-plus', 'home-plus'), ('home-plus-outline', 'home-plus-outline'), ('home-remove', 'home-remove'), ('home-remove-outline', 'home-remove-outline'), ('home-roof', 'home-roof'), ('home-search', 'home-search'), ('home-search-outline', 'home-search-outline'), ('home-silo', 'home-silo'), ('home-silo-outline', 'home-silo-outline'), ('home-switch', 'home-switch'), ('home-switch-outline', 'home-switch-outline'), ('home-thermometer', 'home-thermometer'), ('home-thermometer-outline', 'home-thermometer-outline'), ('home-variant', 'home-variant'), ('home-variant-outline', 'home-variant-outline'), ('hook', 'hook'), ('hook-off', 'hook-off'), ('hoop-house', 'hoop-house'), ('hops', 'hops'), ('horizontal-rotate-clockwise', 'horizontal-rotate-clockwise'), ('horizontal-rotate-counterclockwise', 'horizontal-rotate-counterclockwise'), ('horse', 'horse'), ('horse-human', 'horse-human'), ('horse-variant', 'horse-variant'), ('horse-variant-fast', 'horse-variant-fast'), ('horseshoe', 'horseshoe'), ('hospital', 'hospital'), ('hospital-box', 'hospital-box'), ('hospital-box-outline', 'hospital-box-outline'), ('hospital-building', 'hospital-building'), ('hospital-marker', 'hospital-marker'), ('hot-tub', 'hot-tub'), ('hours-24', 'hours-24'), ('houzz', 'houzz'), ('houzz-box', 'houzz-box'), ('hubspot', 'hubspot'), ('hulu', 'hulu'), ('human', 'human'), ('human-baby-changing-table', 'human-baby-changing-table'), ('human-cane', 'human-cane'), ('human-capacity-decrease', 'human-capacity-decrease'), ('human-capacity-increase', 'human-capacity-increase'), ('human-child', 'human-child'), ('human-dolly', 'human-dolly'), ('human-edit', 'human-edit'), ('human-female', 'human-female'), ('human-female-boy', 'human-female-boy'), ('human-female-dance', 'human-female-dance'), ('human-female-female', 'human-female-female'), ('human-female-girl', 'human-female-girl'), ('human-greeting', 'human-greeting'), ('human-greeting-proximity', 'human-greeting-proximity'), ('human-greeting-variant', 'human-greeting-variant'), ('human-handsdown', 'human-handsdown'), ('human-handsup', 'human-handsup'), ('human-male', 'human-male'), ('human-male-board', 'human-male-board'), ('human-male-board-poll', 'human-male-board-poll'), ('human-male-boy', 'human-male-boy'), ('human-male-child', 'human-male-child'), ('human-male-female', 'human-male-female'), ('human-male-female-child', 'human-male-female-child'), ('human-male-girl', 'human-male-girl'), ('human-male-height', 'human-male-height'), ('human-male-height-variant', 'human-male-height-variant'), ('human-male-male', 'human-male-male'), ('human-non-binary', 'human-non-binary'), ('human-pregnant', 'human-pregnant'), ('human-queue', 'human-queue'), ('human-scooter', 'human-scooter'), ('human-walker', 'human-walker'), ('human-wheelchair', 'human-wheelchair'), ('human-white-cane', 'human-white-cane'), ('humble-bundle', 'humble-bundle'), ('hurricane', 'hurricane'), ('hvac', 'hvac'), ('hvac-off', 'hvac-off'), ('hydraulic-oil-level', 'hydraulic-oil-level'), ('hydraulic-oil-temperature', 'hydraulic-oil-temperature'), ('hydro-power', 'hydro-power'), ('hydrogen-station', 'hydrogen-station'), ('ice-cream', 'ice-cream'), ('ice-cream-off', 'ice-cream-off'), ('ice-pop', 'ice-pop'), ('id-card', 'id-card'), ('identifier', 'identifier'), ('ideogram-cjk', 'ideogram-cjk'), ('ideogram-cjk-variant', 'ideogram-cjk-variant'), ('image', 'image'), ('image-album', 'image-album'), ('image-area', 'image-area'), ('image-area-close', 'image-area-close'), ('image-auto-adjust', 'image-auto-adjust'), ('image-broken', 'image-broken'), ('image-broken-variant', 'image-broken-variant'), ('image-check', 'image-check'), ('image-check-outline', 'image-check-outline'), ('image-edit', 'image-edit'), ('image-edit-outline', 'image-edit-outline'), ('image-filter-black-white', 'image-filter-black-white'), ('image-filter-center-focus', 'image-filter-center-focus'), ('image-filter-center-focus-strong', 'image-filter-center-focus-strong'), ('image-filter-center-focus-strong-outline', 'image-filter-center-focus-strong-outline'), ('image-filter-center-focus-weak', 'image-filter-center-focus-weak'), ('image-filter-drama', 'image-filter-drama'), ('image-filter-frames', 'image-filter-frames'), ('image-filter-hdr', 'image-filter-hdr'), ('image-filter-none', 'image-filter-none'), ('image-filter-tilt-shift', 'image-filter-tilt-shift'), ('image-filter-vintage', 'image-filter-vintage'), ('image-frame', 'image-frame'), ('image-lock', 'image-lock'), ('image-lock-outline', 'image-lock-outline'), ('image-marker', 'image-marker'), ('image-marker-outline', 'image-marker-outline'), ('image-minus', 'image-minus'), ('image-minus-outline', 'image-minus-outline'), ('image-move', 'image-move'), ('image-multiple', 'image-multiple'), ('image-multiple-outline', 'image-multiple-outline'), ('image-off', 'image-off'), ('image-off-outline', 'image-off-outline'), ('image-outline', 'image-outline'), ('image-plus', 'image-plus'), ('image-plus-outline', 'image-plus-outline'), ('image-refresh', 'image-refresh'), ('image-refresh-outline', 'image-refresh-outline'), ('image-remove', 'image-remove'), ('image-remove-outline', 'image-remove-outline'), ('image-search', 'image-search'), ('image-search-outline', 'image-search-outline'), ('image-size-select-actual', 'image-size-select-actual'), ('image-size-select-large', 'image-size-select-large'), ('image-size-select-small', 'image-size-select-small'), ('image-sync', 'image-sync'), ('image-sync-outline', 'image-sync-outline'), ('image-text', 'image-text'), ('import', 'import'), ('inbox', 'inbox'), ('inbox-arrow-down', 'inbox-arrow-down'), ('inbox-arrow-down-outline', 'inbox-arrow-down-outline'), ('inbox-arrow-up', 'inbox-arrow-up'), ('inbox-arrow-up-outline', 'inbox-arrow-up-outline'), ('inbox-full', 'inbox-full'), ('inbox-full-outline', 'inbox-full-outline'), ('inbox-multiple', 'inbox-multiple'), ('inbox-multiple-outline', 'inbox-multiple-outline'), ('inbox-outline', 'inbox-outline'), ('inbox-remove', 'inbox-remove'), ('inbox-remove-outline', 'inbox-remove-outline'), ('incognito', 'incognito'), ('incognito-circle', 'incognito-circle'), ('incognito-circle-off', 'incognito-circle-off'), ('incognito-off', 'incognito-off'), ('indent', 'indent'), ('induction', 'induction'), ('infinity', 'infinity'), ('information', 'information'), ('information-off', 'information-off'), ('information-off-outline', 'information-off-outline'), ('information-outline', 'information-outline'), ('information-variant', 'information-variant'), ('instagram', 'instagram'), ('instapaper', 'instapaper'), ('instrument-triangle', 'instrument-triangle'), ('integrated-circuit-chip', 'integrated-circuit-chip'), ('invert-colors', 'invert-colors'), ('invert-colors-off', 'invert-colors-off'), ('iobroker', 'iobroker'), ('ip', 'ip'), ('ip-network', 'ip-network'), ('ip-network-outline', 'ip-network-outline'), ('ip-outline', 'ip-outline'), ('ipod', 'ipod'), ('iron', 'iron'), ('iron-board', 'iron-board'), ('iron-outline', 'iron-outline'), ('island', 'island'), ('itunes', 'itunes'), ('iv-bag', 'iv-bag'), ('jabber', 'jabber'), ('jeepney', 'jeepney'), ('jellyfish', 'jellyfish'), ('jellyfish-outline', 'jellyfish-outline'), ('jira', 'jira'), ('jquery', 'jquery'), ('jsfiddle', 'jsfiddle'), ('jump-rope', 'jump-rope'), ('kabaddi', 'kabaddi'), ('kangaroo', 'kangaroo'), ('karate', 'karate'), ('kayaking', 'kayaking'), ('keg', 'keg'), ('kettle', 'kettle'), ('kettle-alert', 'kettle-alert'), ('kettle-alert-outline', 'kettle-alert-outline'), ('kettle-off', 'kettle-off'), ('kettle-off-outline', 'kettle-off-outline'), ('kettle-outline', 'kettle-outline'), ('kettle-pour-over', 'kettle-pour-over'), ('kettle-steam', 'kettle-steam'), ('kettle-steam-outline', 'kettle-steam-outline'), ('kettlebell', 'kettlebell'), ('key', 'key'), ('key-alert', 'key-alert'), ('key-alert-outline', 'key-alert-outline'), ('key-arrow-right', 'key-arrow-right'), ('key-chain', 'key-chain'), ('key-chain-variant', 'key-chain-variant'), ('key-change', 'key-change'), ('key-link', 'key-link'), ('key-minus', 'key-minus'), ('key-outline', 'key-outline'), ('key-plus', 'key-plus'), ('key-remove', 'key-remove'), ('key-star', 'key-star'), ('key-variant', 'key-variant'), ('key-wireless', 'key-wireless'), ('keyboard', 'keyboard'), ('keyboard-backspace', 'keyboard-backspace'), ('keyboard-caps', 'keyboard-caps'), ('keyboard-close', 'keyboard-close'), ('keyboard-esc', 'keyboard-esc'), ('keyboard-f1', 'keyboard-f1'), ('keyboard-f10', 'keyboard-f10'), ('keyboard-f11', 'keyboard-f11'), ('keyboard-f12', 'keyboard-f12'), ('keyboard-f2', 'keyboard-f2'), ('keyboard-f3', 'keyboard-f3'), ('keyboard-f4', 'keyboard-f4'), ('keyboard-f5', 'keyboard-f5'), ('keyboard-f6', 'keyboard-f6'), ('keyboard-f7', 'keyboard-f7'), ('keyboard-f8', 'keyboard-f8'), ('keyboard-f9', 'keyboard-f9'), ('keyboard-off', 'keyboard-off'), ('keyboard-off-outline', 'keyboard-off-outline'), ('keyboard-outline', 'keyboard-outline'), ('keyboard-return', 'keyboard-return'), ('keyboard-settings', 'keyboard-settings'), ('keyboard-settings-outline', 'keyboard-settings-outline'), ('keyboard-space', 'keyboard-space'), ('keyboard-tab', 'keyboard-tab'), ('keyboard-tab-reverse', 'keyboard-tab-reverse'), ('keyboard-variant', 'keyboard-variant'), ('khanda', 'khanda'), ('kickstarter', 'kickstarter'), ('kite', 'kite'), ('kite-outline', 'kite-outline'), ('kitesurfing', 'kitesurfing'), ('klingon', 'klingon'), ('knife', 'knife'), ('knife-military', 'knife-military'), ('knob', 'knob'), ('koala', 'koala'), ('kodi', 'kodi'), ('kubernetes', 'kubernetes'), ('label', 'label'), ('label-multiple', 'label-multiple'), ('label-multiple-outline', 'label-multiple-outline'), ('label-off', 'label-off'), ('label-off-outline', 'label-off-outline'), ('label-outline', 'label-outline'), ('label-percent', 'label-percent'), ('label-percent-outline', 'label-percent-outline'), ('label-variant', 'label-variant'), ('label-variant-outline', 'label-variant-outline'), ('ladder', 'ladder'), ('ladybug', 'ladybug'), ('lambda', 'lambda'), ('lamp', 'lamp'), ('lamp-outline', 'lamp-outline'), ('lamps', 'lamps'), ('lamps-outline', 'lamps-outline'), ('lan', 'lan'), ('lan-check', 'lan-check'), ('lan-connect', 'lan-connect'), ('lan-disconnect', 'lan-disconnect'), ('lan-pending', 'lan-pending'), ('land-fields', 'land-fields'), ('land-plots', 'land-plots'), ('land-plots-circle', 'land-plots-circle'), ('land-plots-circle-variant', 'land-plots-circle-variant'), ('land-rows-horizontal', 'land-rows-horizontal'), ('land-rows-vertical', 'land-rows-vertical'), ('landslide', 'landslide'), ('landslide-outline', 'landslide-outline'), ('language-c', 'language-c'), ('language-cpp', 'language-cpp'), ('language-csharp', 'language-csharp'), ('language-css3', 'language-css3'), ('language-fortran', 'language-fortran'), ('language-go', 'language-go'), ('language-haskell', 'language-haskell'), ('language-html5', 'language-html5'), ('language-java', 'language-java'), ('language-javascript', 'language-javascript'), ('language-jsx', 'language-jsx'), ('language-kotlin', 'language-kotlin'), ('language-lua', 'language-lua'), ('language-markdown', 'language-markdown'), ('language-markdown-outline', 'language-markdown-outline'), ('language-php', 'language-php'), ('language-python', 'language-python'), ('language-python-text', 'language-python-text'), ('language-r', 'language-r'), ('language-ruby', 'language-ruby'), ('language-ruby-on-rails', 'language-ruby-on-rails'), ('language-rust', 'language-rust'), ('language-swift', 'language-swift'), ('language-typescript', 'language-typescript'), ('language-xaml', 'language-xaml'), ('laptop', 'laptop'), ('laptop-account', 'laptop-account'), ('laptop-chromebook', 'laptop-chromebook'), ('laptop-mac', 'laptop-mac'), ('laptop-off', 'laptop-off'), ('laptop-windows', 'laptop-windows'), ('laravel', 'laravel'), ('laser-pointer', 'laser-pointer'), ('lasso', 'lasso'), ('lastfm', 'lastfm'), ('lastpass', 'lastpass'), ('latitude', 'latitude'), ('launch', 'launch'), ('lava-lamp', 'lava-lamp'), ('layers', 'layers'), ('layers-edit', 'layers-edit'), ('layers-minus', 'layers-minus'), ('layers-off', 'layers-off'), ('layers-off-outline', 'layers-off-outline'), ('layers-outline', 'layers-outline'), ('layers-plus', 'layers-plus'), ('layers-remove', 'layers-remove'), ('layers-search', 'layers-search'), ('layers-search-outline', 'layers-search-outline'), ('layers-triple', 'layers-triple'), ('layers-triple-outline', 'layers-triple-outline'), ('lead-pencil', 'lead-pencil'), ('leaf', 'leaf'), ('leaf-circle', 'leaf-circle'), ('leaf-circle-outline', 'leaf-circle-outline'), ('leaf-maple', 'leaf-maple'), ('leaf-maple-off', 'leaf-maple-off'), ('leaf-off', 'leaf-off'), ('leak', 'leak'), ('leak-off', 'leak-off'), ('lectern', 'lectern'), ('led-off', 'led-off'), ('led-on', 'led-on'), ('led-outline', 'led-outline'), ('led-strip', 'led-strip'), ('led-strip-variant', 'led-strip-variant'), ('led-strip-variant-off', 'led-strip-variant-off'), ('led-variant-off', 'led-variant-off'), ('led-variant-on', 'led-variant-on'), ('led-variant-outline', 'led-variant-outline'), ('leek', 'leek'), ('less-than', 'less-than'), ('less-than-or-equal', 'less-than-or-equal'), ('library', 'library'), ('library-books', 'library-books'), ('library-outline', 'library-outline'), ('library-shelves', 'library-shelves'), ('license', 'license'), ('lifebuoy', 'lifebuoy'), ('light-flood-down', 'light-flood-down'), ('light-flood-up', 'light-flood-up'), ('light-recessed', 'light-recessed'), ('light-switch', 'light-switch'), ('light-switch-off', 'light-switch-off'), ('lightbulb', 'lightbulb'), ('lightbulb-alert', 'lightbulb-alert'), ('lightbulb-alert-outline', 'lightbulb-alert-outline'), ('lightbulb-auto', 'lightbulb-auto'), ('lightbulb-auto-outline', 'lightbulb-auto-outline'), ('lightbulb-cfl', 'lightbulb-cfl'), ('lightbulb-cfl-off', 'lightbulb-cfl-off'), ('lightbulb-cfl-spiral', 'lightbulb-cfl-spiral'), ('lightbulb-cfl-spiral-off', 'lightbulb-cfl-spiral-off'), ('lightbulb-fluorescent-tube', 'lightbulb-fluorescent-tube'), ('lightbulb-fluorescent-tube-outline', 'lightbulb-fluorescent-tube-outline'), ('lightbulb-group', 'lightbulb-group'), ('lightbulb-group-off', 'lightbulb-group-off'), ('lightbulb-group-off-outline', 'lightbulb-group-off-outline'), ('lightbulb-group-outline', 'lightbulb-group-outline'), ('lightbulb-multiple', 'lightbulb-multiple'), ('lightbulb-multiple-off', 'lightbulb-multiple-off'), ('lightbulb-multiple-off-outline', 'lightbulb-multiple-off-outline'), ('lightbulb-multiple-outline', 'lightbulb-multiple-outline'), ('lightbulb-night', 'lightbulb-night'), ('lightbulb-night-outline', 'lightbulb-night-outline'), ('lightbulb-off', 'lightbulb-off'), ('lightbulb-off-outline', 'lightbulb-off-outline'), ('lightbulb-on', 'lightbulb-on'), ('lightbulb-on-10', 'lightbulb-on-10'), ('lightbulb-on-20', 'lightbulb-on-20'), ('lightbulb-on-30', 'lightbulb-on-30'), ('lightbulb-on-40', 'lightbulb-on-40'), ('lightbulb-on-50', 'lightbulb-on-50'), ('lightbulb-on-60', 'lightbulb-on-60'), ('lightbulb-on-70', 'lightbulb-on-70'), ('lightbulb-on-80', 'lightbulb-on-80'), ('lightbulb-on-90', 'lightbulb-on-90'), ('lightbulb-on-outline', 'lightbulb-on-outline'), ('lightbulb-outline', 'lightbulb-outline'), ('lightbulb-question', 'lightbulb-question'), ('lightbulb-question-outline', 'lightbulb-question-outline'), ('lightbulb-spot', 'lightbulb-spot'), ('lightbulb-spot-off', 'lightbulb-spot-off'), ('lightbulb-variant', 'lightbulb-variant'), ('lightbulb-variant-outline', 'lightbulb-variant-outline'), ('lighthouse', 'lighthouse'), ('lighthouse-on', 'lighthouse-on'), ('lightning-bolt', 'lightning-bolt'), ('lightning-bolt-circle', 'lightning-bolt-circle'), ('lightning-bolt-outline', 'lightning-bolt-outline'), ('line-scan', 'line-scan'), ('lingerie', 'lingerie'), ('link', 'link'), ('link-box', 'link-box'), ('link-box-outline', 'link-box-outline'), ('link-box-variant', 'link-box-variant'), ('link-box-variant-outline', 'link-box-variant-outline'), ('link-lock', 'link-lock'), ('link-off', 'link-off'), ('link-plus', 'link-plus'), ('link-variant', 'link-variant'), ('link-variant-minus', 'link-variant-minus'), ('link-variant-off', 'link-variant-off'), ('link-variant-plus', 'link-variant-plus'), ('link-variant-remove', 'link-variant-remove'), ('linkedin', 'linkedin'), ('linode', 'linode'), ('linux', 'linux'), ('linux-mint', 'linux-mint'), ('lipstick', 'lipstick'), ('liquid-spot', 'liquid-spot'), ('liquor', 'liquor'), ('list-box', 'list-box'), ('list-box-outline', 'list-box-outline'), ('list-status', 'list-status'), ('litecoin', 'litecoin'), ('loading', 'loading'), ('location-enter', 'location-enter'), ('location-exit', 'location-exit'), ('lock', 'lock'), ('lock-alert', 'lock-alert'), ('lock-alert-outline', 'lock-alert-outline'), ('lock-check', 'lock-check'), ('lock-check-outline', 'lock-check-outline'), ('lock-clock', 'lock-clock'), ('lock-minus', 'lock-minus'), ('lock-minus-outline', 'lock-minus-outline'), ('lock-off', 'lock-off'), ('lock-off-outline', 'lock-off-outline'), ('lock-open', 'lock-open'), ('lock-open-alert', 'lock-open-alert'), ('lock-open-alert-outline', 'lock-open-alert-outline'), ('lock-open-check', 'lock-open-check'), ('lock-open-check-outline', 'lock-open-check-outline'), ('lock-open-minus', 'lock-open-minus'), ('lock-open-minus-outline', 'lock-open-minus-outline'), ('lock-open-outline', 'lock-open-outline'), ('lock-open-plus', 'lock-open-plus'), ('lock-open-plus-outline', 'lock-open-plus-outline'), ('lock-open-remove', 'lock-open-remove'), ('lock-open-remove-outline', 'lock-open-remove-outline'), ('lock-open-variant', 'lock-open-variant'), ('lock-open-variant-outline', 'lock-open-variant-outline'), ('lock-outline', 'lock-outline'), ('lock-pattern', 'lock-pattern'), ('lock-plus', 'lock-plus'), ('lock-plus-outline', 'lock-plus-outline'), ('lock-question', 'lock-question'), ('lock-remove', 'lock-remove'), ('lock-remove-outline', 'lock-remove-outline'), ('lock-reset', 'lock-reset'), ('lock-smart', 'lock-smart'), ('locker', 'locker'), ('locker-multiple', 'locker-multiple'), ('login', 'login'), ('login-variant', 'login-variant'), ('logout', 'logout'), ('logout-variant', 'logout-variant'), ('longitude', 'longitude'), ('looks', 'looks'), ('lotion', 'lotion'), ('lotion-outline', 'lotion-outline'), ('lotion-plus', 'lotion-plus'), ('lotion-plus-outline', 'lotion-plus-outline'), ('loupe', 'loupe'), ('lumx', 'lumx'), ('lungs', 'lungs'), ('lyft', 'lyft'), ('mace', 'mace'), ('magazine-pistol', 'magazine-pistol'), ('magazine-rifle', 'magazine-rifle'), ('magic-staff', 'magic-staff'), ('magnet', 'magnet'), ('magnet-on', 'magnet-on'), ('magnify', 'magnify'), ('magnify-close', 'magnify-close'), ('magnify-expand', 'magnify-expand'), ('magnify-minus', 'magnify-minus'), ('magnify-minus-cursor', 'magnify-minus-cursor'), ('magnify-minus-outline', 'magnify-minus-outline'), ('magnify-plus', 'magnify-plus'), ('magnify-plus-cursor', 'magnify-plus-cursor'), ('magnify-plus-outline', 'magnify-plus-outline'), ('magnify-remove-cursor', 'magnify-remove-cursor'), ('magnify-remove-outline', 'magnify-remove-outline'), ('magnify-scan', 'magnify-scan'), ('mail', 'mail'), ('mail-ru', 'mail-ru'), ('mailbox', 'mailbox'), ('mailbox-open', 'mailbox-open'), ('mailbox-open-outline', 'mailbox-open-outline'), ('mailbox-open-up', 'mailbox-open-up'), ('mailbox-open-up-outline', 'mailbox-open-up-outline'), ('mailbox-outline', 'mailbox-outline'), ('mailbox-up', 'mailbox-up'), ('mailbox-up-outline', 'mailbox-up-outline'), ('manjaro', 'manjaro'), ('map', 'map'), ('map-check', 'map-check'), ('map-check-outline', 'map-check-outline'), ('map-clock', 'map-clock'), ('map-clock-outline', 'map-clock-outline'), ('map-legend', 'map-legend'), ('map-marker', 'map-marker'), ('map-marker-account', 'map-marker-account'), ('map-marker-account-outline', 'map-marker-account-outline'), ('map-marker-alert', 'map-marker-alert'), ('map-marker-alert-outline', 'map-marker-alert-outline'), ('map-marker-check', 'map-marker-check'), ('map-marker-check-outline', 'map-marker-check-outline'), ('map-marker-circle', 'map-marker-circle'), ('map-marker-distance', 'map-marker-distance'), ('map-marker-down', 'map-marker-down'), ('map-marker-left', 'map-marker-left'), ('map-marker-left-outline', 'map-marker-left-outline'), ('map-marker-minus', 'map-marker-minus'), ('map-marker-minus-outline', 'map-marker-minus-outline'), ('map-marker-multiple', 'map-marker-multiple'), ('map-marker-multiple-outline', 'map-marker-multiple-outline'), ('map-marker-off', 'map-marker-off'), ('map-marker-off-outline', 'map-marker-off-outline'), ('map-marker-outline', 'map-marker-outline'), ('map-marker-path', 'map-marker-path'), ('map-marker-plus', 'map-marker-plus'), ('map-marker-plus-outline', 'map-marker-plus-outline'), ('map-marker-question', 'map-marker-question'), ('map-marker-question-outline', 'map-marker-question-outline'), ('map-marker-radius', 'map-marker-radius'), ('map-marker-radius-outline', 'map-marker-radius-outline'), ('map-marker-remove', 'map-marker-remove'), ('map-marker-remove-outline', 'map-marker-remove-outline'), ('map-marker-remove-variant', 'map-marker-remove-variant'), ('map-marker-right', 'map-marker-right'), ('map-marker-right-outline', 'map-marker-right-outline'), ('map-marker-star', 'map-marker-star'), ('map-marker-star-outline', 'map-marker-star-outline'), ('map-marker-up', 'map-marker-up'), ('map-minus', 'map-minus'), ('map-outline', 'map-outline'), ('map-plus', 'map-plus'), ('map-search', 'map-search'), ('map-search-outline', 'map-search-outline'), ('mapbox', 'mapbox'), ('margin', 'margin'), ('marker', 'marker'), ('marker-cancel', 'marker-cancel'), ('marker-check', 'marker-check'), ('mastodon', 'mastodon'), ('mastodon-variant', 'mastodon-variant'), ('material-design', 'material-design'), ('material-ui', 'material-ui'), ('math-compass', 'math-compass'), ('math-cos', 'math-cos'), ('math-integral', 'math-integral'), ('math-integral-box', 'math-integral-box'), ('math-log', 'math-log'), ('math-norm', 'math-norm'), ('math-norm-box', 'math-norm-box'), ('math-sin', 'math-sin'), ('math-tan', 'math-tan'), ('matrix', 'matrix'), ('maxcdn', 'maxcdn'), ('medal', 'medal'), ('medal-outline', 'medal-outline'), ('medical-bag', 'medical-bag'), ('medical-cotton-swab', 'medical-cotton-swab'), ('medication', 'medication'), ('medication-outline', 'medication-outline'), ('meditation', 'meditation'), ('medium', 'medium'), ('meetup', 'meetup'), ('memory', 'memory'), ('menorah', 'menorah'), ('menorah-fire', 'menorah-fire'), ('menu', 'menu'), ('menu-close', 'menu-close'), ('menu-down', 'menu-down'), ('menu-down-outline', 'menu-down-outline'), ('menu-left', 'menu-left'), ('menu-left-outline', 'menu-left-outline'), ('menu-open', 'menu-open'), ('menu-right', 'menu-right'), ('menu-right-outline', 'menu-right-outline'), ('menu-swap', 'menu-swap'), ('menu-swap-outline', 'menu-swap-outline'), ('menu-up', 'menu-up'), ('menu-up-outline', 'menu-up-outline'), ('merge', 'merge'), ('message', 'message'), ('message-alert', 'message-alert'), ('message-alert-outline', 'message-alert-outline'), ('message-arrow-left', 'message-arrow-left'), ('message-arrow-left-outline', 'message-arrow-left-outline'), ('message-arrow-right', 'message-arrow-right'), ('message-arrow-right-outline', 'message-arrow-right-outline'), ('message-badge', 'message-badge'), ('message-badge-outline', 'message-badge-outline'), ('message-bookmark', 'message-bookmark'), ('message-bookmark-outline', 'message-bookmark-outline'), ('message-bulleted', 'message-bulleted'), ('message-bulleted-off', 'message-bulleted-off'), ('message-check', 'message-check'), ('message-check-outline', 'message-check-outline'), ('message-cog', 'message-cog'), ('message-cog-outline', 'message-cog-outline'), ('message-draw', 'message-draw'), ('message-fast', 'message-fast'), ('message-fast-outline', 'message-fast-outline'), ('message-flash', 'message-flash'), ('message-flash-outline', 'message-flash-outline'), ('message-image', 'message-image'), ('message-image-outline', 'message-image-outline'), ('message-lock', 'message-lock'), ('message-lock-outline', 'message-lock-outline'), ('message-minus', 'message-minus'), ('message-minus-outline', 'message-minus-outline'), ('message-off', 'message-off'), ('message-off-outline', 'message-off-outline'), ('message-outline', 'message-outline'), ('message-plus', 'message-plus'), ('message-plus-outline', 'message-plus-outline'), ('message-processing', 'message-processing'), ('message-processing-outline', 'message-processing-outline'), ('message-question', 'message-question'), ('message-question-outline', 'message-question-outline'), ('message-reply', 'message-reply'), ('message-reply-outline', 'message-reply-outline'), ('message-reply-text', 'message-reply-text'), ('message-reply-text-outline', 'message-reply-text-outline'), ('message-settings', 'message-settings'), ('message-settings-outline', 'message-settings-outline'), ('message-star', 'message-star'), ('message-star-outline', 'message-star-outline'), ('message-text', 'message-text'), ('message-text-clock', 'message-text-clock'), ('message-text-clock-outline', 'message-text-clock-outline'), ('message-text-fast', 'message-text-fast'), ('message-text-fast-outline', 'message-text-fast-outline'), ('message-text-lock', 'message-text-lock'), ('message-text-lock-outline', 'message-text-lock-outline'), ('message-text-outline', 'message-text-outline'), ('message-video', 'message-video'), ('meteor', 'meteor'), ('meter-electric', 'meter-electric'), ('meter-electric-outline', 'meter-electric-outline'), ('meter-gas', 'meter-gas'), ('meter-gas-outline', 'meter-gas-outline'), ('metronome', 'metronome'), ('metronome-tick', 'metronome-tick'), ('micro-sd', 'micro-sd'), ('microphone', 'microphone'), ('microphone-message', 'microphone-message'), ('microphone-message-off', 'microphone-message-off'), ('microphone-minus', 'microphone-minus'), ('microphone-off', 'microphone-off'), ('microphone-outline', 'microphone-outline'), ('microphone-plus', 'microphone-plus'), ('microphone-question', 'microphone-question'), ('microphone-question-outline', 'microphone-question-outline'), ('microphone-settings', 'microphone-settings'), ('microphone-variant', 'microphone-variant'), ('microphone-variant-off', 'microphone-variant-off'), ('microscope', 'microscope'), ('microsoft', 'microsoft'), ('microsoft-access', 'microsoft-access'), ('microsoft-azure', 'microsoft-azure'), ('microsoft-azure-devops', 'microsoft-azure-devops'), ('microsoft-bing', 'microsoft-bing'), ('microsoft-dynamics-365', 'microsoft-dynamics-365'), ('microsoft-edge', 'microsoft-edge'), ('microsoft-edge-legacy', 'microsoft-edge-legacy'), ('microsoft-excel', 'microsoft-excel'), ('microsoft-internet-explorer', 'microsoft-internet-explorer'), ('microsoft-office', 'microsoft-office'), ('microsoft-onedrive', 'microsoft-onedrive'), ('microsoft-onenote', 'microsoft-onenote'), ('microsoft-outlook', 'microsoft-outlook'), ('microsoft-powerpoint', 'microsoft-powerpoint'), ('microsoft-sharepoint', 'microsoft-sharepoint'), ('microsoft-teams', 'microsoft-teams'), ('microsoft-visual-studio', 'microsoft-visual-studio'), ('microsoft-visual-studio-code', 'microsoft-visual-studio-code'), ('microsoft-windows', 'microsoft-windows'), ('microsoft-windows-classic', 'microsoft-windows-classic'), ('microsoft-word', 'microsoft-word'), ('microsoft-xbox', 'microsoft-xbox'), ('microsoft-xbox-controller', 'microsoft-xbox-controller'), ('microsoft-xbox-controller-battery-alert', 'microsoft-xbox-controller-battery-alert'), ('microsoft-xbox-controller-battery-charging', 'microsoft-xbox-controller-battery-charging'), ('microsoft-xbox-controller-battery-empty', 'microsoft-xbox-controller-battery-empty'), ('microsoft-xbox-controller-battery-full', 'microsoft-xbox-controller-battery-full'), ('microsoft-xbox-controller-battery-low', 'microsoft-xbox-controller-battery-low'), ('microsoft-xbox-controller-battery-medium', 'microsoft-xbox-controller-battery-medium'), ('microsoft-xbox-controller-battery-unknown', 'microsoft-xbox-controller-battery-unknown'), ('microsoft-xbox-controller-menu', 'microsoft-xbox-controller-menu'), ('microsoft-xbox-controller-off', 'microsoft-xbox-controller-off'), ('microsoft-xbox-controller-view', 'microsoft-xbox-controller-view'), ('microsoft-yammer', 'microsoft-yammer'), ('microwave', 'microwave'), ('microwave-off', 'microwave-off'), ('middleware', 'middleware'), ('middleware-outline', 'middleware-outline'), ('midi', 'midi'), ('midi-input', 'midi-input'), ('midi-port', 'midi-port'), ('mine', 'mine'), ('minecraft', 'minecraft'), ('mini-sd', 'mini-sd'), ('minidisc', 'minidisc'), ('minus', 'minus'), ('minus-box', 'minus-box'), ('minus-box-multiple', 'minus-box-multiple'), ('minus-box-multiple-outline', 'minus-box-multiple-outline'), ('minus-box-outline', 'minus-box-outline'), ('minus-circle', 'minus-circle'), ('minus-circle-multiple', 'minus-circle-multiple'), ('minus-circle-multiple-outline', 'minus-circle-multiple-outline'), ('minus-circle-off', 'minus-circle-off'), ('minus-circle-off-outline', 'minus-circle-off-outline'), ('minus-circle-outline', 'minus-circle-outline'), ('minus-network', 'minus-network'), ('minus-network-outline', 'minus-network-outline'), ('minus-thick', 'minus-thick'), ('mirror', 'mirror'), ('mirror-rectangle', 'mirror-rectangle'), ('mirror-variant', 'mirror-variant'), ('mixcloud', 'mixcloud'), ('mixed-martial-arts', 'mixed-martial-arts'), ('mixed-reality', 'mixed-reality'), ('mixer', 'mixer'), ('molecule', 'molecule'), ('molecule-co', 'molecule-co'), ('molecule-co2', 'molecule-co2'), ('monitor', 'monitor'), ('monitor-account', 'monitor-account'), ('monitor-arrow-down', 'monitor-arrow-down'), ('monitor-arrow-down-variant', 'monitor-arrow-down-variant'), ('monitor-cellphone', 'monitor-cellphone'), ('monitor-cellphone-star', 'monitor-cellphone-star'), ('monitor-dashboard', 'monitor-dashboard'), ('monitor-edit', 'monitor-edit'), ('monitor-eye', 'monitor-eye'), ('monitor-lock', 'monitor-lock'), ('monitor-multiple', 'monitor-multiple'), ('monitor-off', 'monitor-off'), ('monitor-screenshot', 'monitor-screenshot'), ('monitor-share', 'monitor-share'), ('monitor-shimmer', 'monitor-shimmer'), ('monitor-small', 'monitor-small'), ('monitor-speaker', 'monitor-speaker'), ('monitor-speaker-off', 'monitor-speaker-off'), ('monitor-star', 'monitor-star'), ('moon-first-quarter', 'moon-first-quarter'), ('moon-full', 'moon-full'), ('moon-last-quarter', 'moon-last-quarter'), ('moon-new', 'moon-new'), ('moon-waning-crescent', 'moon-waning-crescent'), ('moon-waning-gibbous', 'moon-waning-gibbous'), ('moon-waxing-crescent', 'moon-waxing-crescent'), ('moon-waxing-gibbous', 'moon-waxing-gibbous'), ('moped', 'moped'), ('moped-electric', 'moped-electric'), ('moped-electric-outline', 'moped-electric-outline'), ('moped-outline', 'moped-outline'), ('more', 'more'), ('mortar-pestle', 'mortar-pestle'), ('mortar-pestle-plus', 'mortar-pestle-plus'), ('mosque', 'mosque'), ('mosque-outline', 'mosque-outline'), ('mother-heart', 'mother-heart'), ('mother-nurse', 'mother-nurse'), ('motion', 'motion'), ('motion-outline', 'motion-outline'), ('motion-pause', 'motion-pause'), ('motion-pause-outline', 'motion-pause-outline'), ('motion-play', 'motion-play'), ('motion-play-outline', 'motion-play-outline'), ('motion-sensor', 'motion-sensor'), ('motion-sensor-off', 'motion-sensor-off'), ('motorbike', 'motorbike'), ('motorbike-electric', 'motorbike-electric'), ('motorbike-off', 'motorbike-off'), ('mouse', 'mouse'), ('mouse-bluetooth', 'mouse-bluetooth'), ('mouse-move-down', 'mouse-move-down'), ('mouse-move-up', 'mouse-move-up'), ('mouse-move-vertical', 'mouse-move-vertical'), ('mouse-off', 'mouse-off'), ('mouse-variant', 'mouse-variant'), ('mouse-variant-off', 'mouse-variant-off'), ('move-resize', 'move-resize'), ('move-resize-variant', 'move-resize-variant'), ('movie', 'movie'), ('movie-check', 'movie-check'), ('movie-check-outline', 'movie-check-outline'), ('movie-cog', 'movie-cog'), ('movie-cog-outline', 'movie-cog-outline'), ('movie-edit', 'movie-edit'), ('movie-edit-outline', 'movie-edit-outline'), ('movie-filter', 'movie-filter'), ('movie-filter-outline', 'movie-filter-outline'), ('movie-minus', 'movie-minus'), ('movie-minus-outline', 'movie-minus-outline'), ('movie-off', 'movie-off'), ('movie-off-outline', 'movie-off-outline'), ('movie-open', 'movie-open'), ('movie-open-check', 'movie-open-check'), ('movie-open-check-outline', 'movie-open-check-outline'), ('movie-open-cog', 'movie-open-cog'), ('movie-open-cog-outline', 'movie-open-cog-outline'), ('movie-open-edit', 'movie-open-edit'), ('movie-open-edit-outline', 'movie-open-edit-outline'), ('movie-open-minus', 'movie-open-minus'), ('movie-open-minus-outline', 'movie-open-minus-outline'), ('movie-open-off', 'movie-open-off'), ('movie-open-off-outline', 'movie-open-off-outline'), ('movie-open-outline', 'movie-open-outline'), ('movie-open-play', 'movie-open-play'), ('movie-open-play-outline', 'movie-open-play-outline'), ('movie-open-plus', 'movie-open-plus'), ('movie-open-plus-outline', 'movie-open-plus-outline'), ('movie-open-remove', 'movie-open-remove'), ('movie-open-remove-outline', 'movie-open-remove-outline'), ('movie-open-settings', 'movie-open-settings'), ('movie-open-settings-outline', 'movie-open-settings-outline'), ('movie-open-star', 'movie-open-star'), ('movie-open-star-outline', 'movie-open-star-outline'), ('movie-outline', 'movie-outline'), ('movie-play', 'movie-play'), ('movie-play-outline', 'movie-play-outline'), ('movie-plus', 'movie-plus'), ('movie-plus-outline', 'movie-plus-outline'), ('movie-remove', 'movie-remove'), ('movie-remove-outline', 'movie-remove-outline'), ('movie-roll', 'movie-roll'), ('movie-search', 'movie-search'), ('movie-search-outline', 'movie-search-outline'), ('movie-settings', 'movie-settings'), ('movie-settings-outline', 'movie-settings-outline'), ('movie-star', 'movie-star'), ('movie-star-outline', 'movie-star-outline'), ('mower', 'mower'), ('mower-bag', 'mower-bag'), ('mower-bag-on', 'mower-bag-on'), ('mower-on', 'mower-on'), ('muffin', 'muffin'), ('multicast', 'multicast'), ('multimedia', 'multimedia'), ('multiplication', 'multiplication'), ('multiplication-box', 'multiplication-box'), ('mushroom', 'mushroom'), ('mushroom-off', 'mushroom-off'), ('mushroom-off-outline', 'mushroom-off-outline'), ('mushroom-outline', 'mushroom-outline'), ('music', 'music'), ('music-accidental-double-flat', 'music-accidental-double-flat'), ('music-accidental-double-sharp', 'music-accidental-double-sharp'), ('music-accidental-flat', 'music-accidental-flat'), ('music-accidental-natural', 'music-accidental-natural'), ('music-accidental-sharp', 'music-accidental-sharp'), ('music-box', 'music-box'), ('music-box-multiple', 'music-box-multiple'), ('music-box-multiple-outline', 'music-box-multiple-outline'), ('music-box-outline', 'music-box-outline'), ('music-circle', 'music-circle'), ('music-circle-outline', 'music-circle-outline'), ('music-clef-alto', 'music-clef-alto'), ('music-clef-bass', 'music-clef-bass'), ('music-clef-treble', 'music-clef-treble'), ('music-note', 'music-note'), ('music-note-bluetooth', 'music-note-bluetooth'), ('music-note-bluetooth-off', 'music-note-bluetooth-off'), ('music-note-eighth', 'music-note-eighth'), ('music-note-eighth-dotted', 'music-note-eighth-dotted'), ('music-note-half', 'music-note-half'), ('music-note-half-dotted', 'music-note-half-dotted'), ('music-note-minus', 'music-note-minus'), ('music-note-off', 'music-note-off'), ('music-note-off-outline', 'music-note-off-outline'), ('music-note-outline', 'music-note-outline'), ('music-note-plus', 'music-note-plus'), ('music-note-quarter', 'music-note-quarter'), ('music-note-quarter-dotted', 'music-note-quarter-dotted'), ('music-note-sixteenth', 'music-note-sixteenth'), ('music-note-sixteenth-dotted', 'music-note-sixteenth-dotted'), ('music-note-whole', 'music-note-whole'), ('music-note-whole-dotted', 'music-note-whole-dotted'), ('music-off', 'music-off'), ('music-rest-eighth', 'music-rest-eighth'), ('music-rest-half', 'music-rest-half'), ('music-rest-quarter', 'music-rest-quarter'), ('music-rest-sixteenth', 'music-rest-sixteenth'), ('music-rest-whole', 'music-rest-whole'), ('mustache', 'mustache'), ('nail', 'nail'), ('nas', 'nas'), ('nativescript', 'nativescript'), ('nature', 'nature'), ('nature-people', 'nature-people'), ('navigation', 'navigation'), ('navigation-outline', 'navigation-outline'), ('navigation-variant', 'navigation-variant'), ('navigation-variant-outline', 'navigation-variant-outline'), ('near-me', 'near-me'), ('necklace', 'necklace'), ('needle', 'needle'), ('needle-off', 'needle-off'), ('nest-thermostat', 'nest-thermostat'), ('netflix', 'netflix'), ('network', 'network'), ('network-off', 'network-off'), ('network-off-outline', 'network-off-outline'), ('network-outline', 'network-outline'), ('network-pos', 'network-pos'), ('network-strength-1', 'network-strength-1'), ('network-strength-1-alert', 'network-strength-1-alert'), ('network-strength-2', 'network-strength-2'), ('network-strength-2-alert', 'network-strength-2-alert'), ('network-strength-3', 'network-strength-3'), ('network-strength-3-alert', 'network-strength-3-alert'), ('network-strength-4', 'network-strength-4'), ('network-strength-4-alert', 'network-strength-4-alert'), ('network-strength-4-cog', 'network-strength-4-cog'), ('network-strength-alert', 'network-strength-alert'), ('network-strength-alert-outline', 'network-strength-alert-outline'), ('network-strength-off', 'network-strength-off'), ('network-strength-off-outline', 'network-strength-off-outline'), ('network-strength-outline', 'network-strength-outline'), ('new-box', 'new-box'), ('newspaper', 'newspaper'), ('newspaper-check', 'newspaper-check'), ('newspaper-minus', 'newspaper-minus'), ('newspaper-plus', 'newspaper-plus'), ('newspaper-remove', 'newspaper-remove'), ('newspaper-variant', 'newspaper-variant'), ('newspaper-variant-multiple', 'newspaper-variant-multiple'), ('newspaper-variant-multiple-outline', 'newspaper-variant-multiple-outline'), ('newspaper-variant-outline', 'newspaper-variant-outline'), ('nfc', 'nfc'), ('nfc-off', 'nfc-off'), ('nfc-search-variant', 'nfc-search-variant'), ('nfc-tap', 'nfc-tap'), ('nfc-variant', 'nfc-variant'), ('nfc-variant-off', 'nfc-variant-off'), ('ninja', 'ninja'), ('nintendo-game-boy', 'nintendo-game-boy'), ('nintendo-switch', 'nintendo-switch'), ('nintendo-wii', 'nintendo-wii'), ('nintendo-wiiu', 'nintendo-wiiu'), ('nix', 'nix'), ('nodejs', 'nodejs'), ('noodles', 'noodles'), ('not-equal', 'not-equal'), ('not-equal-variant', 'not-equal-variant'), ('note', 'note'), ('note-alert', 'note-alert'), ('note-alert-outline', 'note-alert-outline'), ('note-check', 'note-check'), ('note-check-outline', 'note-check-outline'), ('note-edit', 'note-edit'), ('note-edit-outline', 'note-edit-outline'), ('note-minus', 'note-minus'), ('note-minus-outline', 'note-minus-outline'), ('note-multiple', 'note-multiple'), ('note-multiple-outline', 'note-multiple-outline'), ('note-off', 'note-off'), ('note-off-outline', 'note-off-outline'), ('note-outline', 'note-outline'), ('note-plus', 'note-plus'), ('note-plus-outline', 'note-plus-outline'), ('note-remove', 'note-remove'), ('note-remove-outline', 'note-remove-outline'), ('note-search', 'note-search'), ('note-search-outline', 'note-search-outline'), ('note-text', 'note-text'), ('note-text-outline', 'note-text-outline'), ('notebook', 'notebook'), ('notebook-check', 'notebook-check'), ('notebook-check-outline', 'notebook-check-outline'), ('notebook-edit', 'notebook-edit'), ('notebook-edit-outline', 'notebook-edit-outline'), ('notebook-heart', 'notebook-heart'), ('notebook-heart-outline', 'notebook-heart-outline'), ('notebook-minus', 'notebook-minus'), ('notebook-minus-outline', 'notebook-minus-outline'), ('notebook-multiple', 'notebook-multiple'), ('notebook-outline', 'notebook-outline'), ('notebook-plus', 'notebook-plus'), ('notebook-plus-outline', 'notebook-plus-outline'), ('notebook-remove', 'notebook-remove'), ('notebook-remove-outline', 'notebook-remove-outline'), ('notification-clear-all', 'notification-clear-all'), ('npm', 'npm'), ('npm-variant', 'npm-variant'), ('npm-variant-outline', 'npm-variant-outline'), ('nuke', 'nuke'), ('null', 'null'), ('numeric', 'numeric'), ('numeric-0', 'numeric-0'), ('numeric-0-box', 'numeric-0-box'), ('numeric-0-box-multiple', 'numeric-0-box-multiple'), ('numeric-0-box-multiple-outline', 'numeric-0-box-multiple-outline'), ('numeric-0-box-outline', 'numeric-0-box-outline'), ('numeric-0-circle', 'numeric-0-circle'), ('numeric-0-circle-outline', 'numeric-0-circle-outline'), ('numeric-1', 'numeric-1'), ('numeric-1-box', 'numeric-1-box'), ('numeric-1-box-multiple', 'numeric-1-box-multiple'), ('numeric-1-box-multiple-outline', 'numeric-1-box-multiple-outline'), ('numeric-1-box-outline', 'numeric-1-box-outline'), ('numeric-1-circle', 'numeric-1-circle'), ('numeric-1-circle-outline', 'numeric-1-circle-outline'), ('numeric-10', 'numeric-10'), ('numeric-10-box', 'numeric-10-box'), ('numeric-10-box-multiple', 'numeric-10-box-multiple'), ('numeric-10-box-multiple-outline', 'numeric-10-box-multiple-outline'), ('numeric-10-box-outline', 'numeric-10-box-outline'), ('numeric-10-circle', 'numeric-10-circle'), ('numeric-10-circle-outline', 'numeric-10-circle-outline'), ('numeric-2', 'numeric-2'), ('numeric-2-box', 'numeric-2-box'), ('numeric-2-box-multiple', 'numeric-2-box-multiple'), ('numeric-2-box-multiple-outline', 'numeric-2-box-multiple-outline'), ('numeric-2-box-outline', 'numeric-2-box-outline'), ('numeric-2-circle', 'numeric-2-circle'), ('numeric-2-circle-outline', 'numeric-2-circle-outline'), ('numeric-3', 'numeric-3'), ('numeric-3-box', 'numeric-3-box'), ('numeric-3-box-multiple', 'numeric-3-box-multiple'), ('numeric-3-box-multiple-outline', 'numeric-3-box-multiple-outline'), ('numeric-3-box-outline', 'numeric-3-box-outline'), ('numeric-3-circle', 'numeric-3-circle'), ('numeric-3-circle-outline', 'numeric-3-circle-outline'), ('numeric-4', 'numeric-4'), ('numeric-4-box', 'numeric-4-box'), ('numeric-4-box-multiple', 'numeric-4-box-multiple'), ('numeric-4-box-multiple-outline', 'numeric-4-box-multiple-outline'), ('numeric-4-box-outline', 'numeric-4-box-outline'), ('numeric-4-circle', 'numeric-4-circle'), ('numeric-4-circle-outline', 'numeric-4-circle-outline'), ('numeric-5', 'numeric-5'), ('numeric-5-box', 'numeric-5-box'), ('numeric-5-box-multiple', 'numeric-5-box-multiple'), ('numeric-5-box-multiple-outline', 'numeric-5-box-multiple-outline'), ('numeric-5-box-outline', 'numeric-5-box-outline'), ('numeric-5-circle', 'numeric-5-circle'), ('numeric-5-circle-outline', 'numeric-5-circle-outline'), ('numeric-6', 'numeric-6'), ('numeric-6-box', 'numeric-6-box'), ('numeric-6-box-multiple', 'numeric-6-box-multiple'), ('numeric-6-box-multiple-outline', 'numeric-6-box-multiple-outline'), ('numeric-6-box-outline', 'numeric-6-box-outline'), ('numeric-6-circle', 'numeric-6-circle'), ('numeric-6-circle-outline', 'numeric-6-circle-outline'), ('numeric-7', 'numeric-7'), ('numeric-7-box', 'numeric-7-box'), ('numeric-7-box-multiple', 'numeric-7-box-multiple'), ('numeric-7-box-multiple-outline', 'numeric-7-box-multiple-outline'), ('numeric-7-box-outline', 'numeric-7-box-outline'), ('numeric-7-circle', 'numeric-7-circle'), ('numeric-7-circle-outline', 'numeric-7-circle-outline'), ('numeric-8', 'numeric-8'), ('numeric-8-box', 'numeric-8-box'), ('numeric-8-box-multiple', 'numeric-8-box-multiple'), ('numeric-8-box-multiple-outline', 'numeric-8-box-multiple-outline'), ('numeric-8-box-outline', 'numeric-8-box-outline'), ('numeric-8-circle', 'numeric-8-circle'), ('numeric-8-circle-outline', 'numeric-8-circle-outline'), ('numeric-9', 'numeric-9'), ('numeric-9-box', 'numeric-9-box'), ('numeric-9-box-multiple', 'numeric-9-box-multiple'), ('numeric-9-box-multiple-outline', 'numeric-9-box-multiple-outline'), ('numeric-9-box-outline', 'numeric-9-box-outline'), ('numeric-9-circle', 'numeric-9-circle'), ('numeric-9-circle-outline', 'numeric-9-circle-outline'), ('numeric-9-plus', 'numeric-9-plus'), ('numeric-9-plus-box', 'numeric-9-plus-box'), ('numeric-9-plus-box-multiple', 'numeric-9-plus-box-multiple'), ('numeric-9-plus-box-multiple-outline', 'numeric-9-plus-box-multiple-outline'), ('numeric-9-plus-box-outline', 'numeric-9-plus-box-outline'), ('numeric-9-plus-circle', 'numeric-9-plus-circle'), ('numeric-9-plus-circle-outline', 'numeric-9-plus-circle-outline'), ('numeric-negative-1', 'numeric-negative-1'), ('numeric-off', 'numeric-off'), ('numeric-positive-1', 'numeric-positive-1'), ('nut', 'nut'), ('nutrition', 'nutrition'), ('nuxt', 'nuxt'), ('oar', 'oar'), ('ocarina', 'ocarina'), ('oci', 'oci'), ('ocr', 'ocr'), ('octagon', 'octagon'), ('octagon-outline', 'octagon-outline'), ('octagram', 'octagram'), ('octagram-outline', 'octagram-outline'), ('octahedron', 'octahedron'), ('octahedron-off', 'octahedron-off'), ('odnoklassniki', 'odnoklassniki'), ('offer', 'offer'), ('office-building', 'office-building'), ('office-building-cog', 'office-building-cog'), ('office-building-cog-outline', 'office-building-cog-outline'), ('office-building-marker', 'office-building-marker'), ('office-building-marker-outline', 'office-building-marker-outline'), ('office-building-minus', 'office-building-minus'), ('office-building-minus-outline', 'office-building-minus-outline'), ('office-building-outline', 'office-building-outline'), ('office-building-plus', 'office-building-plus'), ('office-building-plus-outline', 'office-building-plus-outline'), ('office-building-remove', 'office-building-remove'), ('office-building-remove-outline', 'office-building-remove-outline'), ('oil', 'oil'), ('oil-lamp', 'oil-lamp'), ('oil-level', 'oil-level'), ('oil-temperature', 'oil-temperature'), ('om', 'om'), ('omega', 'omega'), ('one-up', 'one-up'), ('onedrive', 'onedrive'), ('onenote', 'onenote'), ('onepassword', 'onepassword'), ('opacity', 'opacity'), ('open-in-app', 'open-in-app'), ('open-in-new', 'open-in-new'), ('open-source-initiative', 'open-source-initiative'), ('openid', 'openid'), ('opera', 'opera'), ('orbit', 'orbit'), ('orbit-variant', 'orbit-variant'), ('order-alphabetical-ascending', 'order-alphabetical-ascending'), ('order-alphabetical-descending', 'order-alphabetical-descending'), ('order-bool-ascending', 'order-bool-ascending'), ('order-bool-ascending-variant', 'order-bool-ascending-variant'), ('order-bool-descending', 'order-bool-descending'), ('order-bool-descending-variant', 'order-bool-descending-variant'), ('order-numeric-ascending', 'order-numeric-ascending'), ('order-numeric-descending', 'order-numeric-descending'), ('origin', 'origin'), ('ornament', 'ornament'), ('ornament-variant', 'ornament-variant'), ('outbox', 'outbox'), ('outdent', 'outdent'), ('outdoor-lamp', 'outdoor-lamp'), ('outlook', 'outlook'), ('overscan', 'overscan'), ('owl', 'owl'), ('pac-man', 'pac-man'), ('package', 'package'), ('package-check', 'package-check'), ('package-down', 'package-down'), ('package-up', 'package-up'), ('package-variant', 'package-variant'), ('package-variant-closed', 'package-variant-closed'), ('package-variant-closed-check', 'package-variant-closed-check'), ('package-variant-closed-minus', 'package-variant-closed-minus'), ('package-variant-closed-plus', 'package-variant-closed-plus'), ('package-variant-closed-remove', 'package-variant-closed-remove'), ('package-variant-minus', 'package-variant-minus'), ('package-variant-plus', 'package-variant-plus'), ('package-variant-remove', 'package-variant-remove'), ('page-first', 'page-first'), ('page-last', 'page-last'), ('page-layout-body', 'page-layout-body'), ('page-layout-footer', 'page-layout-footer'), ('page-layout-header', 'page-layout-header'), ('page-layout-header-footer', 'page-layout-header-footer'), ('page-layout-sidebar-left', 'page-layout-sidebar-left'), ('page-layout-sidebar-right', 'page-layout-sidebar-right'), ('page-next', 'page-next'), ('page-next-outline', 'page-next-outline'), ('page-previous', 'page-previous'), ('page-previous-outline', 'page-previous-outline'), ('pail', 'pail'), ('pail-minus', 'pail-minus'), ('pail-minus-outline', 'pail-minus-outline'), ('pail-off', 'pail-off'), ('pail-off-outline', 'pail-off-outline'), ('pail-outline', 'pail-outline'), ('pail-plus', 'pail-plus'), ('pail-plus-outline', 'pail-plus-outline'), ('pail-remove', 'pail-remove'), ('pail-remove-outline', 'pail-remove-outline'), ('palette', 'palette'), ('palette-advanced', 'palette-advanced'), ('palette-outline', 'palette-outline'), ('palette-swatch', 'palette-swatch'), ('palette-swatch-outline', 'palette-swatch-outline'), ('palette-swatch-variant', 'palette-swatch-variant'), ('palm-tree', 'palm-tree'), ('pan', 'pan'), ('pan-bottom-left', 'pan-bottom-left'), ('pan-bottom-right', 'pan-bottom-right'), ('pan-down', 'pan-down'), ('pan-horizontal', 'pan-horizontal'), ('pan-left', 'pan-left'), ('pan-right', 'pan-right'), ('pan-top-left', 'pan-top-left'), ('pan-top-right', 'pan-top-right'), ('pan-up', 'pan-up'), ('pan-vertical', 'pan-vertical'), ('panda', 'panda'), ('pandora', 'pandora'), ('panorama', 'panorama'), ('panorama-fisheye', 'panorama-fisheye'), ('panorama-horizontal', 'panorama-horizontal'), ('panorama-horizontal-outline', 'panorama-horizontal-outline'), ('panorama-outline', 'panorama-outline'), ('panorama-sphere', 'panorama-sphere'), ('panorama-sphere-outline', 'panorama-sphere-outline'), ('panorama-variant', 'panorama-variant'), ('panorama-variant-outline', 'panorama-variant-outline'), ('panorama-vertical', 'panorama-vertical'), ('panorama-vertical-outline', 'panorama-vertical-outline'), ('panorama-wide-angle', 'panorama-wide-angle'), ('panorama-wide-angle-outline', 'panorama-wide-angle-outline'), ('paper-cut-vertical', 'paper-cut-vertical'), ('paper-roll', 'paper-roll'), ('paper-roll-outline', 'paper-roll-outline'), ('paperclip', 'paperclip'), ('paperclip-check', 'paperclip-check'), ('paperclip-lock', 'paperclip-lock'), ('paperclip-minus', 'paperclip-minus'), ('paperclip-off', 'paperclip-off'), ('paperclip-plus', 'paperclip-plus'), ('paperclip-remove', 'paperclip-remove'), ('parachute', 'parachute'), ('parachute-outline', 'parachute-outline'), ('paragliding', 'paragliding'), ('parking', 'parking'), ('party-popper', 'party-popper'), ('passport', 'passport'), ('passport-biometric', 'passport-biometric'), ('pasta', 'pasta'), ('patio-heater', 'patio-heater'), ('patreon', 'patreon'), ('pause', 'pause'), ('pause-box', 'pause-box'), ('pause-box-outline', 'pause-box-outline'), ('pause-circle', 'pause-circle'), ('pause-circle-outline', 'pause-circle-outline'), ('pause-octagon', 'pause-octagon'), ('pause-octagon-outline', 'pause-octagon-outline'), ('paw', 'paw'), ('paw-off', 'paw-off'), ('paw-off-outline', 'paw-off-outline'), ('paw-outline', 'paw-outline'), ('paypal', 'paypal'), ('peace', 'peace'), ('peanut', 'peanut'), ('peanut-off', 'peanut-off'), ('peanut-off-outline', 'peanut-off-outline'), ('peanut-outline', 'peanut-outline'), ('pen', 'pen'), ('pen-lock', 'pen-lock'), ('pen-minus', 'pen-minus'), ('pen-off', 'pen-off'), ('pen-plus', 'pen-plus'), ('pen-remove', 'pen-remove'), ('pencil', 'pencil'), ('pencil-box', 'pencil-box'), ('pencil-box-multiple', 'pencil-box-multiple'), ('pencil-box-multiple-outline', 'pencil-box-multiple-outline'), ('pencil-box-outline', 'pencil-box-outline'), ('pencil-circle', 'pencil-circle'), ('pencil-circle-outline', 'pencil-circle-outline'), ('pencil-lock', 'pencil-lock'), ('pencil-lock-outline', 'pencil-lock-outline'), ('pencil-minus', 'pencil-minus'), ('pencil-minus-outline', 'pencil-minus-outline'), ('pencil-off', 'pencil-off'), ('pencil-off-outline', 'pencil-off-outline'), ('pencil-outline', 'pencil-outline'), ('pencil-plus', 'pencil-plus'), ('pencil-plus-outline', 'pencil-plus-outline'), ('pencil-remove', 'pencil-remove'), ('pencil-remove-outline', 'pencil-remove-outline'), ('pencil-ruler', 'pencil-ruler'), ('penguin', 'penguin'), ('pentagon', 'pentagon'), ('pentagon-outline', 'pentagon-outline'), ('pentagram', 'pentagram'), ('percent', 'percent'), ('percent-box', 'percent-box'), ('percent-box-outline', 'percent-box-outline'), ('percent-circle', 'percent-circle'), ('percent-circle-outline', 'percent-circle-outline'), ('percent-outline', 'percent-outline'), ('periodic-table', 'periodic-table'), ('periscope', 'periscope'), ('perspective-less', 'perspective-less'), ('perspective-more', 'perspective-more'), ('ph', 'ph'), ('phone', 'phone'), ('phone-alert', 'phone-alert'), ('phone-alert-outline', 'phone-alert-outline'), ('phone-bluetooth', 'phone-bluetooth'), ('phone-bluetooth-outline', 'phone-bluetooth-outline'), ('phone-cancel', 'phone-cancel'), ('phone-cancel-outline', 'phone-cancel-outline'), ('phone-check', 'phone-check'), ('phone-check-outline', 'phone-check-outline'), ('phone-classic', 'phone-classic'), ('phone-classic-off', 'phone-classic-off'), ('phone-clock', 'phone-clock'), ('phone-dial', 'phone-dial'), ('phone-dial-outline', 'phone-dial-outline'), ('phone-forward', 'phone-forward'), ('phone-forward-outline', 'phone-forward-outline'), ('phone-hangup', 'phone-hangup'), ('phone-hangup-outline', 'phone-hangup-outline'), ('phone-in-talk', 'phone-in-talk'), ('phone-in-talk-outline', 'phone-in-talk-outline'), ('phone-incoming', 'phone-incoming'), ('phone-incoming-outgoing', 'phone-incoming-outgoing'), ('phone-incoming-outgoing-outline', 'phone-incoming-outgoing-outline'), ('phone-incoming-outline', 'phone-incoming-outline'), ('phone-lock', 'phone-lock'), ('phone-lock-outline', 'phone-lock-outline'), ('phone-log', 'phone-log'), ('phone-log-outline', 'phone-log-outline'), ('phone-message', 'phone-message'), ('phone-message-outline', 'phone-message-outline'), ('phone-minus', 'phone-minus'), ('phone-minus-outline', 'phone-minus-outline'), ('phone-missed', 'phone-missed'), ('phone-missed-outline', 'phone-missed-outline'), ('phone-off', 'phone-off'), ('phone-off-outline', 'phone-off-outline'), ('phone-outgoing', 'phone-outgoing'), ('phone-outgoing-outline', 'phone-outgoing-outline'), ('phone-outline', 'phone-outline'), ('phone-paused', 'phone-paused'), ('phone-paused-outline', 'phone-paused-outline'), ('phone-plus', 'phone-plus'), ('phone-plus-outline', 'phone-plus-outline'), ('phone-refresh', 'phone-refresh'), ('phone-refresh-outline', 'phone-refresh-outline'), ('phone-remove', 'phone-remove'), ('phone-remove-outline', 'phone-remove-outline'), ('phone-return', 'phone-return'), ('phone-return-outline', 'phone-return-outline'), ('phone-ring', 'phone-ring'), ('phone-ring-outline', 'phone-ring-outline'), ('phone-rotate-landscape', 'phone-rotate-landscape'), ('phone-rotate-portrait', 'phone-rotate-portrait'), ('phone-settings', 'phone-settings'), ('phone-settings-outline', 'phone-settings-outline'), ('phone-sync', 'phone-sync'), ('phone-sync-outline', 'phone-sync-outline'), ('phone-voip', 'phone-voip'), ('pi', 'pi'), ('pi-box', 'pi-box'), ('pi-hole', 'pi-hole'), ('piano', 'piano'), ('piano-off', 'piano-off'), ('pickaxe', 'pickaxe'), ('picture-in-picture-bottom-right', 'picture-in-picture-bottom-right'), ('picture-in-picture-bottom-right-outline', 'picture-in-picture-bottom-right-outline'), ('picture-in-picture-top-right', 'picture-in-picture-top-right'), ('picture-in-picture-top-right-outline', 'picture-in-picture-top-right-outline'), ('pier', 'pier'), ('pier-crane', 'pier-crane'), ('pig', 'pig'), ('pig-variant', 'pig-variant'), ('pig-variant-outline', 'pig-variant-outline'), ('piggy-bank', 'piggy-bank'), ('piggy-bank-outline', 'piggy-bank-outline'), ('pill', 'pill'), ('pill-multiple', 'pill-multiple'), ('pill-off', 'pill-off'), ('pillar', 'pillar'), ('pin', 'pin'), ('pin-off', 'pin-off'), ('pin-off-outline', 'pin-off-outline'), ('pin-outline', 'pin-outline'), ('pine-tree', 'pine-tree'), ('pine-tree-box', 'pine-tree-box'), ('pine-tree-fire', 'pine-tree-fire'), ('pinterest', 'pinterest'), ('pinterest-box', 'pinterest-box'), ('pinwheel', 'pinwheel'), ('pinwheel-outline', 'pinwheel-outline'), ('pipe', 'pipe'), ('pipe-disconnected', 'pipe-disconnected'), ('pipe-leak', 'pipe-leak'), ('pipe-valve', 'pipe-valve'), ('pipe-wrench', 'pipe-wrench'), ('pirate', 'pirate'), ('pistol', 'pistol'), ('piston', 'piston'), ('pitchfork', 'pitchfork'), ('pizza', 'pizza'), ('plane-car', 'plane-car'), ('plane-train', 'plane-train'), ('play', 'play'), ('play-box', 'play-box'), ('play-box-lock', 'play-box-lock'), ('play-box-lock-open', 'play-box-lock-open'), ('play-box-lock-open-outline', 'play-box-lock-open-outline'), ('play-box-lock-outline', 'play-box-lock-outline'), ('play-box-multiple', 'play-box-multiple'), ('play-box-multiple-outline', 'play-box-multiple-outline'), ('play-box-outline', 'play-box-outline'), ('play-circle', 'play-circle'), ('play-circle-outline', 'play-circle-outline'), ('play-network', 'play-network'), ('play-network-outline', 'play-network-outline'), ('play-outline', 'play-outline'), ('play-pause', 'play-pause'), ('play-protected-content', 'play-protected-content'), ('play-speed', 'play-speed'), ('playlist-check', 'playlist-check'), ('playlist-edit', 'playlist-edit'), ('playlist-minus', 'playlist-minus'), ('playlist-music', 'playlist-music'), ('playlist-music-outline', 'playlist-music-outline'), ('playlist-play', 'playlist-play'), ('playlist-plus', 'playlist-plus'), ('playlist-remove', 'playlist-remove'), ('playlist-star', 'playlist-star'), ('plex', 'plex'), ('pliers', 'pliers'), ('plus', 'plus'), ('plus-box', 'plus-box'), ('plus-box-multiple', 'plus-box-multiple'), ('plus-box-multiple-outline', 'plus-box-multiple-outline'), ('plus-box-outline', 'plus-box-outline'), ('plus-circle', 'plus-circle'), ('plus-circle-multiple', 'plus-circle-multiple'), ('plus-circle-multiple-outline', 'plus-circle-multiple-outline'), ('plus-circle-outline', 'plus-circle-outline'), ('plus-lock', 'plus-lock'), ('plus-lock-open', 'plus-lock-open'), ('plus-minus', 'plus-minus'), ('plus-minus-box', 'plus-minus-box'), ('plus-minus-variant', 'plus-minus-variant'), ('plus-network', 'plus-network'), ('plus-network-outline', 'plus-network-outline'), ('plus-outline', 'plus-outline'), ('plus-thick', 'plus-thick'), ('pocket', 'pocket'), ('podcast', 'podcast'), ('podium', 'podium'), ('podium-bronze', 'podium-bronze'), ('podium-gold', 'podium-gold'), ('podium-silver', 'podium-silver'), ('point-of-sale', 'point-of-sale'), ('pokeball', 'pokeball'), ('pokemon-go', 'pokemon-go'), ('poker-chip', 'poker-chip'), ('polaroid', 'polaroid'), ('police-badge', 'police-badge'), ('police-badge-outline', 'police-badge-outline'), ('police-station', 'police-station'), ('poll', 'poll'), ('polo', 'polo'), ('polymer', 'polymer'), ('pool', 'pool'), ('pool-thermometer', 'pool-thermometer'), ('popcorn', 'popcorn'), ('post', 'post'), ('post-lamp', 'post-lamp'), ('post-outline', 'post-outline'), ('postage-stamp', 'postage-stamp'), ('pot', 'pot'), ('pot-mix', 'pot-mix'), ('pot-mix-outline', 'pot-mix-outline'), ('pot-outline', 'pot-outline'), ('pot-steam', 'pot-steam'), ('pot-steam-outline', 'pot-steam-outline'), ('pound', 'pound'), ('pound-box', 'pound-box'), ('pound-box-outline', 'pound-box-outline'), ('power', 'power'), ('power-cycle', 'power-cycle'), ('power-off', 'power-off'), ('power-on', 'power-on'), ('power-plug', 'power-plug'), ('power-plug-off', 'power-plug-off'), ('power-plug-off-outline', 'power-plug-off-outline'), ('power-plug-outline', 'power-plug-outline'), ('power-settings', 'power-settings'), ('power-sleep', 'power-sleep'), ('power-socket', 'power-socket'), ('power-socket-au', 'power-socket-au'), ('power-socket-ch', 'power-socket-ch'), ('power-socket-de', 'power-socket-de'), ('power-socket-eu', 'power-socket-eu'), ('power-socket-fr', 'power-socket-fr'), ('power-socket-it', 'power-socket-it'), ('power-socket-jp', 'power-socket-jp'), ('power-socket-uk', 'power-socket-uk'), ('power-socket-us', 'power-socket-us'), ('power-standby', 'power-standby'), ('powershell', 'powershell'), ('prescription', 'prescription'), ('presentation', 'presentation'), ('presentation-play', 'presentation-play'), ('pretzel', 'pretzel'), ('prezi', 'prezi'), ('printer', 'printer'), ('printer-3d', 'printer-3d'), ('printer-3d-nozzle', 'printer-3d-nozzle'), ('printer-3d-nozzle-alert', 'printer-3d-nozzle-alert'), ('printer-3d-nozzle-alert-outline', 'printer-3d-nozzle-alert-outline'), ('printer-3d-nozzle-heat', 'printer-3d-nozzle-heat'), ('printer-3d-nozzle-heat-outline', 'printer-3d-nozzle-heat-outline'), ('printer-3d-nozzle-off', 'printer-3d-nozzle-off'), ('printer-3d-nozzle-off-outline', 'printer-3d-nozzle-off-outline'), ('printer-3d-nozzle-outline', 'printer-3d-nozzle-outline'), ('printer-3d-off', 'printer-3d-off'), ('printer-alert', 'printer-alert'), ('printer-check', 'printer-check'), ('printer-eye', 'printer-eye'), ('printer-off', 'printer-off'), ('printer-off-outline', 'printer-off-outline'), ('printer-outline', 'printer-outline'), ('printer-pos', 'printer-pos'), ('printer-search', 'printer-search'), ('printer-settings', 'printer-settings'), ('printer-wireless', 'printer-wireless'), ('priority-high', 'priority-high'), ('priority-low', 'priority-low'), ('professional-hexagon', 'professional-hexagon'), ('progress-alert', 'progress-alert'), ('progress-check', 'progress-check'), ('progress-clock', 'progress-clock'), ('progress-close', 'progress-close'), ('progress-download', 'progress-download'), ('progress-helper', 'progress-helper'), ('progress-pencil', 'progress-pencil'), ('progress-question', 'progress-question'), ('progress-star', 'progress-star'), ('progress-upload', 'progress-upload'), ('progress-wrench', 'progress-wrench'), ('projector', 'projector'), ('projector-off', 'projector-off'), ('projector-screen', 'projector-screen'), ('projector-screen-off', 'projector-screen-off'), ('projector-screen-off-outline', 'projector-screen-off-outline'), ('projector-screen-outline', 'projector-screen-outline'), ('projector-screen-variant', 'projector-screen-variant'), ('projector-screen-variant-off', 'projector-screen-variant-off'), ('projector-screen-variant-off-outline', 'projector-screen-variant-off-outline'), ('projector-screen-variant-outline', 'projector-screen-variant-outline'), ('propane-tank', 'propane-tank'), ('propane-tank-outline', 'propane-tank-outline'), ('protocol', 'protocol'), ('publish', 'publish'), ('publish-off', 'publish-off'), ('pulse', 'pulse'), ('pump', 'pump'), ('pump-off', 'pump-off'), ('pumpkin', 'pumpkin'), ('purse', 'purse'), ('purse-outline', 'purse-outline'), ('puzzle', 'puzzle'), ('puzzle-check', 'puzzle-check'), ('puzzle-check-outline', 'puzzle-check-outline'), ('puzzle-edit', 'puzzle-edit'), ('puzzle-edit-outline', 'puzzle-edit-outline'), ('puzzle-heart', 'puzzle-heart'), ('puzzle-heart-outline', 'puzzle-heart-outline'), ('puzzle-minus', 'puzzle-minus'), ('puzzle-minus-outline', 'puzzle-minus-outline'), ('puzzle-outline', 'puzzle-outline'), ('puzzle-plus', 'puzzle-plus'), ('puzzle-plus-outline', 'puzzle-plus-outline'), ('puzzle-remove', 'puzzle-remove'), ('puzzle-remove-outline', 'puzzle-remove-outline'), ('puzzle-star', 'puzzle-star'), ('puzzle-star-outline', 'puzzle-star-outline'), ('pyramid', 'pyramid'), ('pyramid-off', 'pyramid-off'), ('qi', 'qi'), ('qqchat', 'qqchat'), ('qrcode', 'qrcode'), ('qrcode-edit', 'qrcode-edit'), ('qrcode-minus', 'qrcode-minus'), ('qrcode-plus', 'qrcode-plus'), ('qrcode-remove', 'qrcode-remove'), ('qrcode-scan', 'qrcode-scan'), ('quadcopter', 'quadcopter'), ('quality-high', 'quality-high'), ('quality-low', 'quality-low'), ('quality-medium', 'quality-medium'), ('quick-reply', 'quick-reply'), ('quicktime', 'quicktime'), ('quora', 'quora'), ('rabbit', 'rabbit'), ('rabbit-variant', 'rabbit-variant'), ('rabbit-variant-outline', 'rabbit-variant-outline'), ('racing-helmet', 'racing-helmet'), ('racquetball', 'racquetball'), ('radar', 'radar'), ('radiator', 'radiator'), ('radiator-disabled', 'radiator-disabled'), ('radiator-off', 'radiator-off'), ('radio', 'radio'), ('radio-am', 'radio-am'), ('radio-fm', 'radio-fm'), ('radio-handheld', 'radio-handheld'), ('radio-off', 'radio-off'), ('radio-tower', 'radio-tower'), ('radioactive', 'radioactive'), ('radioactive-circle', 'radioactive-circle'), ('radioactive-circle-outline', 'radioactive-circle-outline'), ('radioactive-off', 'radioactive-off'), ('radiobox-blank', 'radiobox-blank'), ('radiobox-marked', 'radiobox-marked'), ('radiology-box', 'radiology-box'), ('radiology-box-outline', 'radiology-box-outline'), ('radius', 'radius'), ('radius-outline', 'radius-outline'), ('railroad-light', 'railroad-light'), ('rake', 'rake'), ('raspberry-pi', 'raspberry-pi'), ('raw', 'raw'), ('raw-off', 'raw-off'), ('ray-end', 'ray-end'), ('ray-end-arrow', 'ray-end-arrow'), ('ray-start', 'ray-start'), ('ray-start-arrow', 'ray-start-arrow'), ('ray-start-end', 'ray-start-end'), ('ray-start-vertex-end', 'ray-start-vertex-end'), ('ray-vertex', 'ray-vertex'), ('razor-double-edge', 'razor-double-edge'), ('razor-single-edge', 'razor-single-edge'), ('rdio', 'rdio'), ('react', 'react'), ('read', 'read'), ('receipt', 'receipt'), ('receipt-outline', 'receipt-outline'), ('receipt-text', 'receipt-text'), ('receipt-text-check', 'receipt-text-check'), ('receipt-text-check-outline', 'receipt-text-check-outline'), ('receipt-text-minus', 'receipt-text-minus'), ('receipt-text-minus-outline', 'receipt-text-minus-outline'), ('receipt-text-outline', 'receipt-text-outline'), ('receipt-text-plus', 'receipt-text-plus'), ('receipt-text-plus-outline', 'receipt-text-plus-outline'), ('receipt-text-remove', 'receipt-text-remove'), ('receipt-text-remove-outline', 'receipt-text-remove-outline'), ('record', 'record'), ('record-circle', 'record-circle'), ('record-circle-outline', 'record-circle-outline'), ('record-player', 'record-player'), ('record-rec', 'record-rec'), ('rectangle', 'rectangle'), ('rectangle-outline', 'rectangle-outline'), ('recycle', 'recycle'), ('recycle-variant', 'recycle-variant'), ('reddit', 'reddit'), ('redhat', 'redhat'), ('redo', 'redo'), ('redo-variant', 'redo-variant'), ('reflect-horizontal', 'reflect-horizontal'), ('reflect-vertical', 'reflect-vertical'), ('refresh', 'refresh'), ('refresh-auto', 'refresh-auto'), ('refresh-circle', 'refresh-circle'), ('regex', 'regex'), ('registered-trademark', 'registered-trademark'), ('reiterate', 'reiterate'), ('relation-many-to-many', 'relation-many-to-many'), ('relation-many-to-one', 'relation-many-to-one'), ('relation-many-to-one-or-many', 'relation-many-to-one-or-many'), ('relation-many-to-only-one', 'relation-many-to-only-one'), ('relation-many-to-zero-or-many', 'relation-many-to-zero-or-many'), ('relation-many-to-zero-or-one', 'relation-many-to-zero-or-one'), ('relation-one-or-many-to-many', 'relation-one-or-many-to-many'), ('relation-one-or-many-to-one', 'relation-one-or-many-to-one'), ('relation-one-or-many-to-one-or-many', 'relation-one-or-many-to-one-or-many'), ('relation-one-or-many-to-only-one', 'relation-one-or-many-to-only-one'), ('relation-one-or-many-to-zero-or-many', 'relation-one-or-many-to-zero-or-many'), ('relation-one-or-many-to-zero-or-one', 'relation-one-or-many-to-zero-or-one'), ('relation-one-to-many', 'relation-one-to-many'), ('relation-one-to-one', 'relation-one-to-one'), ('relation-one-to-one-or-many', 'relation-one-to-one-or-many'), ('relation-one-to-only-one', 'relation-one-to-only-one'), ('relation-one-to-zero-or-many', 'relation-one-to-zero-or-many'), ('relation-one-to-zero-or-one', 'relation-one-to-zero-or-one'), ('relation-only-one-to-many', 'relation-only-one-to-many'), ('relation-only-one-to-one', 'relation-only-one-to-one'), ('relation-only-one-to-one-or-many', 'relation-only-one-to-one-or-many'), ('relation-only-one-to-only-one', 'relation-only-one-to-only-one'), ('relation-only-one-to-zero-or-many', 'relation-only-one-to-zero-or-many'), ('relation-only-one-to-zero-or-one', 'relation-only-one-to-zero-or-one'), ('relation-zero-or-many-to-many', 'relation-zero-or-many-to-many'), ('relation-zero-or-many-to-one', 'relation-zero-or-many-to-one'), ('relation-zero-or-many-to-one-or-many', 'relation-zero-or-many-to-one-or-many'), ('relation-zero-or-many-to-only-one', 'relation-zero-or-many-to-only-one'), ('relation-zero-or-many-to-zero-or-many', 'relation-zero-or-many-to-zero-or-many'), ('relation-zero-or-many-to-zero-or-one', 'relation-zero-or-many-to-zero-or-one'), ('relation-zero-or-one-to-many', 'relation-zero-or-one-to-many'), ('relation-zero-or-one-to-one', 'relation-zero-or-one-to-one'), ('relation-zero-or-one-to-one-or-many', 'relation-zero-or-one-to-one-or-many'), ('relation-zero-or-one-to-only-one', 'relation-zero-or-one-to-only-one'), ('relation-zero-or-one-to-zero-or-many', 'relation-zero-or-one-to-zero-or-many'), ('relation-zero-or-one-to-zero-or-one', 'relation-zero-or-one-to-zero-or-one'), ('relative-scale', 'relative-scale'), ('reload', 'reload'), ('reload-alert', 'reload-alert'), ('reminder', 'reminder'), ('remote', 'remote'), ('remote-desktop', 'remote-desktop'), ('remote-off', 'remote-off'), ('remote-tv', 'remote-tv'), ('remote-tv-off', 'remote-tv-off'), ('rename-box', 'rename-box'), ('reorder-horizontal', 'reorder-horizontal'), ('reorder-vertical', 'reorder-vertical'), ('repeat', 'repeat'), ('repeat-off', 'repeat-off'), ('repeat-once', 'repeat-once'), ('repeat-variant', 'repeat-variant'), ('replay', 'replay'), ('reply', 'reply'), ('reply-all', 'reply-all'), ('reply-all-outline', 'reply-all-outline'), ('reply-circle', 'reply-circle'), ('reply-outline', 'reply-outline'), ('reproduction', 'reproduction'), ('resistor', 'resistor'), ('resistor-nodes', 'resistor-nodes'), ('resize', 'resize'), ('resize-bottom-right', 'resize-bottom-right'), ('responsive', 'responsive'), ('restart', 'restart'), ('restart-alert', 'restart-alert'), ('restart-off', 'restart-off'), ('restore', 'restore'), ('restore-alert', 'restore-alert'), ('rewind', 'rewind'), ('rewind-10', 'rewind-10'), ('rewind-15', 'rewind-15'), ('rewind-30', 'rewind-30'), ('rewind-45', 'rewind-45'), ('rewind-5', 'rewind-5'), ('rewind-60', 'rewind-60'), ('rewind-outline', 'rewind-outline'), ('rhombus', 'rhombus'), ('rhombus-medium', 'rhombus-medium'), ('rhombus-medium-outline', 'rhombus-medium-outline'), ('rhombus-outline', 'rhombus-outline'), ('rhombus-split', 'rhombus-split'), ('rhombus-split-outline', 'rhombus-split-outline'), ('ribbon', 'ribbon'), ('rice', 'rice'), ('rickshaw', 'rickshaw'), ('rickshaw-electric', 'rickshaw-electric'), ('ring', 'ring'), ('rivet', 'rivet'), ('road', 'road'), ('road-variant', 'road-variant'), ('robber', 'robber'), ('robot', 'robot'), ('robot-angry', 'robot-angry'), ('robot-angry-outline', 'robot-angry-outline'), ('robot-confused', 'robot-confused'), ('robot-confused-outline', 'robot-confused-outline'), ('robot-dead', 'robot-dead'), ('robot-dead-outline', 'robot-dead-outline'), ('robot-excited', 'robot-excited'), ('robot-excited-outline', 'robot-excited-outline'), ('robot-happy', 'robot-happy'), ('robot-happy-outline', 'robot-happy-outline'), ('robot-industrial', 'robot-industrial'), ('robot-industrial-outline', 'robot-industrial-outline'), ('robot-love', 'robot-love'), ('robot-love-outline', 'robot-love-outline'), ('robot-mower', 'robot-mower'), ('robot-mower-outline', 'robot-mower-outline'), ('robot-off', 'robot-off'), ('robot-off-outline', 'robot-off-outline'), ('robot-outline', 'robot-outline'), ('robot-vacuum', 'robot-vacuum'), ('robot-vacuum-alert', 'robot-vacuum-alert'), ('robot-vacuum-variant', 'robot-vacuum-variant'), ('robot-vacuum-variant-alert', 'robot-vacuum-variant-alert'), ('rocket', 'rocket'), ('rocket-launch', 'rocket-launch'), ('rocket-launch-outline', 'rocket-launch-outline'), ('rocket-outline', 'rocket-outline'), ('rodent', 'rodent'), ('roller-shade', 'roller-shade'), ('roller-shade-closed', 'roller-shade-closed'), ('roller-skate', 'roller-skate'), ('roller-skate-off', 'roller-skate-off'), ('rollerblade', 'rollerblade'), ('rollerblade-off', 'rollerblade-off'), ('rollupjs', 'rollupjs'), ('rolodex', 'rolodex'), ('rolodex-outline', 'rolodex-outline'), ('roman-numeral-1', 'roman-numeral-1'), ('roman-numeral-10', 'roman-numeral-10'), ('roman-numeral-2', 'roman-numeral-2'), ('roman-numeral-3', 'roman-numeral-3'), ('roman-numeral-4', 'roman-numeral-4'), ('roman-numeral-5', 'roman-numeral-5'), ('roman-numeral-6', 'roman-numeral-6'), ('roman-numeral-7', 'roman-numeral-7'), ('roman-numeral-8', 'roman-numeral-8'), ('roman-numeral-9', 'roman-numeral-9'), ('room-service', 'room-service'), ('room-service-outline', 'room-service-outline'), ('rotate-360', 'rotate-360'), ('rotate-3d', 'rotate-3d'), ('rotate-3d-variant', 'rotate-3d-variant'), ('rotate-left', 'rotate-left'), ('rotate-left-variant', 'rotate-left-variant'), ('rotate-orbit', 'rotate-orbit'), ('rotate-right', 'rotate-right'), ('rotate-right-variant', 'rotate-right-variant'), ('rounded-corner', 'rounded-corner'), ('router', 'router'), ('router-network', 'router-network'), ('router-wireless', 'router-wireless'), ('router-wireless-off', 'router-wireless-off'), ('router-wireless-settings', 'router-wireless-settings'), ('routes', 'routes'), ('routes-clock', 'routes-clock'), ('rowing', 'rowing'), ('rss', 'rss'), ('rss-box', 'rss-box'), ('rss-off', 'rss-off'), ('rug', 'rug'), ('rugby', 'rugby'), ('ruler', 'ruler'), ('ruler-square', 'ruler-square'), ('ruler-square-compass', 'ruler-square-compass'), ('run', 'run'), ('run-fast', 'run-fast'), ('rv-truck', 'rv-truck'), ('sack', 'sack'), ('sack-percent', 'sack-percent'), ('safe', 'safe'), ('safe-square', 'safe-square'), ('safe-square-outline', 'safe-square-outline'), ('safety-goggles', 'safety-goggles'), ('safety-googles', 'safety-googles'), ('sail-boat', 'sail-boat'), ('sail-boat-sink', 'sail-boat-sink'), ('sale', 'sale'), ('sale-outline', 'sale-outline'), ('salesforce', 'salesforce'), ('sass', 'sass'), ('satellite', 'satellite'), ('satellite-uplink', 'satellite-uplink'), ('satellite-variant', 'satellite-variant'), ('sausage', 'sausage'), ('sausage-off', 'sausage-off'), ('saw-blade', 'saw-blade'), ('sawtooth-wave', 'sawtooth-wave'), ('saxophone', 'saxophone'), ('scale', 'scale'), ('scale-balance', 'scale-balance'), ('scale-bathroom', 'scale-bathroom'), ('scale-off', 'scale-off'), ('scale-unbalanced', 'scale-unbalanced'), ('scan-helper', 'scan-helper'), ('scanner', 'scanner'), ('scanner-off', 'scanner-off'), ('scatter-plot', 'scatter-plot'), ('scatter-plot-outline', 'scatter-plot-outline'), ('scent', 'scent'), ('scent-off', 'scent-off'), ('school', 'school'), ('school-outline', 'school-outline'), ('scissors-cutting', 'scissors-cutting'), ('scooter', 'scooter'), ('scooter-electric', 'scooter-electric'), ('scoreboard', 'scoreboard'), ('scoreboard-outline', 'scoreboard-outline'), ('screen-rotation', 'screen-rotation'), ('screen-rotation-lock', 'screen-rotation-lock'), ('screw-flat-top', 'screw-flat-top'), ('screw-lag', 'screw-lag'), ('screw-machine-flat-top', 'screw-machine-flat-top'), ('screw-machine-round-top', 'screw-machine-round-top'), ('screw-round-top', 'screw-round-top'), ('screwdriver', 'screwdriver'), ('script', 'script'), ('script-outline', 'script-outline'), ('script-text', 'script-text'), ('script-text-key', 'script-text-key'), ('script-text-key-outline', 'script-text-key-outline'), ('script-text-outline', 'script-text-outline'), ('script-text-play', 'script-text-play'), ('script-text-play-outline', 'script-text-play-outline'), ('sd', 'sd'), ('seal', 'seal'), ('seal-variant', 'seal-variant'), ('search-web', 'search-web'), ('seat', 'seat'), ('seat-flat', 'seat-flat'), ('seat-flat-angled', 'seat-flat-angled'), ('seat-individual-suite', 'seat-individual-suite'), ('seat-legroom-extra', 'seat-legroom-extra'), ('seat-legroom-normal', 'seat-legroom-normal'), ('seat-legroom-reduced', 'seat-legroom-reduced'), ('seat-outline', 'seat-outline'), ('seat-passenger', 'seat-passenger'), ('seat-recline-extra', 'seat-recline-extra'), ('seat-recline-normal', 'seat-recline-normal'), ('seatbelt', 'seatbelt'), ('security', 'security'), ('security-close', 'security-close'), ('security-network', 'security-network'), ('seed', 'seed'), ('seed-off', 'seed-off'), ('seed-off-outline', 'seed-off-outline'), ('seed-outline', 'seed-outline'), ('seed-plus', 'seed-plus'), ('seed-plus-outline', 'seed-plus-outline'), ('seesaw', 'seesaw'), ('segment', 'segment'), ('select', 'select'), ('select-all', 'select-all'), ('select-arrow-down', 'select-arrow-down'), ('select-arrow-up', 'select-arrow-up'), ('select-color', 'select-color'), ('select-compare', 'select-compare'), ('select-drag', 'select-drag'), ('select-group', 'select-group'), ('select-inverse', 'select-inverse'), ('select-marker', 'select-marker'), ('select-multiple', 'select-multiple'), ('select-multiple-marker', 'select-multiple-marker'), ('select-off', 'select-off'), ('select-place', 'select-place'), ('select-remove', 'select-remove'), ('select-search', 'select-search'), ('selection', 'selection'), ('selection-drag', 'selection-drag'), ('selection-ellipse', 'selection-ellipse'), ('selection-ellipse-arrow-inside', 'selection-ellipse-arrow-inside'), ('selection-ellipse-remove', 'selection-ellipse-remove'), ('selection-lasso', 'selection-lasso'), ('selection-marker', 'selection-marker'), ('selection-multiple', 'selection-multiple'), ('selection-multiple-marker', 'selection-multiple-marker'), ('selection-off', 'selection-off'), ('selection-remove', 'selection-remove'), ('selection-search', 'selection-search'), ('semantic-web', 'semantic-web'), ('send', 'send'), ('send-check', 'send-check'), ('send-check-outline', 'send-check-outline'), ('send-circle', 'send-circle'), ('send-circle-outline', 'send-circle-outline'), ('send-clock', 'send-clock'), ('send-clock-outline', 'send-clock-outline'), ('send-lock', 'send-lock'), ('send-lock-outline', 'send-lock-outline'), ('send-outline', 'send-outline'), ('serial-port', 'serial-port'), ('server', 'server'), ('server-minus', 'server-minus'), ('server-network', 'server-network'), ('server-network-off', 'server-network-off'), ('server-off', 'server-off'), ('server-plus', 'server-plus'), ('server-remove', 'server-remove'), ('server-security', 'server-security'), ('set-all', 'set-all'), ('set-center', 'set-center'), ('set-center-right', 'set-center-right'), ('set-left', 'set-left'), ('set-left-center', 'set-left-center'), ('set-left-right', 'set-left-right'), ('set-merge', 'set-merge'), ('set-none', 'set-none'), ('set-right', 'set-right'), ('set-split', 'set-split'), ('set-square', 'set-square'), ('set-top-box', 'set-top-box'), ('settings-helper', 'settings-helper'), ('shaker', 'shaker'), ('shaker-outline', 'shaker-outline'), ('shape', 'shape'), ('shape-circle-plus', 'shape-circle-plus'), ('shape-outline', 'shape-outline'), ('shape-oval-plus', 'shape-oval-plus'), ('shape-plus', 'shape-plus'), ('shape-polygon-plus', 'shape-polygon-plus'), ('shape-rectangle-plus', 'shape-rectangle-plus'), ('shape-square-plus', 'shape-square-plus'), ('shape-square-rounded-plus', 'shape-square-rounded-plus'), ('share', 'share'), ('share-all', 'share-all'), ('share-all-outline', 'share-all-outline'), ('share-circle', 'share-circle'), ('share-off', 'share-off'), ('share-off-outline', 'share-off-outline'), ('share-outline', 'share-outline'), ('share-variant', 'share-variant'), ('share-variant-outline', 'share-variant-outline'), ('shark', 'shark'), ('shark-fin', 'shark-fin'), ('shark-fin-outline', 'shark-fin-outline'), ('shark-off', 'shark-off'), ('sheep', 'sheep'), ('shield', 'shield'), ('shield-account', 'shield-account'), ('shield-account-outline', 'shield-account-outline'), ('shield-account-variant', 'shield-account-variant'), ('shield-account-variant-outline', 'shield-account-variant-outline'), ('shield-airplane', 'shield-airplane'), ('shield-airplane-outline', 'shield-airplane-outline'), ('shield-alert', 'shield-alert'), ('shield-alert-outline', 'shield-alert-outline'), ('shield-bug', 'shield-bug'), ('shield-bug-outline', 'shield-bug-outline'), ('shield-car', 'shield-car'), ('shield-check', 'shield-check'), ('shield-check-outline', 'shield-check-outline'), ('shield-cross', 'shield-cross'), ('shield-cross-outline', 'shield-cross-outline'), ('shield-crown', 'shield-crown'), ('shield-crown-outline', 'shield-crown-outline'), ('shield-edit', 'shield-edit'), ('shield-edit-outline', 'shield-edit-outline'), ('shield-half', 'shield-half'), ('shield-half-full', 'shield-half-full'), ('shield-home', 'shield-home'), ('shield-home-outline', 'shield-home-outline'), ('shield-key', 'shield-key'), ('shield-key-outline', 'shield-key-outline'), ('shield-link-variant', 'shield-link-variant'), ('shield-link-variant-outline', 'shield-link-variant-outline'), ('shield-lock', 'shield-lock'), ('shield-lock-open', 'shield-lock-open'), ('shield-lock-open-outline', 'shield-lock-open-outline'), ('shield-lock-outline', 'shield-lock-outline'), ('shield-moon', 'shield-moon'), ('shield-moon-outline', 'shield-moon-outline'), ('shield-off', 'shield-off'), ('shield-off-outline', 'shield-off-outline'), ('shield-outline', 'shield-outline'), ('shield-plus', 'shield-plus'), ('shield-plus-outline', 'shield-plus-outline'), ('shield-refresh', 'shield-refresh'), ('shield-refresh-outline', 'shield-refresh-outline'), ('shield-remove', 'shield-remove'), ('shield-remove-outline', 'shield-remove-outline'), ('shield-search', 'shield-search'), ('shield-star', 'shield-star'), ('shield-star-outline', 'shield-star-outline'), ('shield-sun', 'shield-sun'), ('shield-sun-outline', 'shield-sun-outline'), ('shield-sword', 'shield-sword'), ('shield-sword-outline', 'shield-sword-outline'), ('shield-sync', 'shield-sync'), ('shield-sync-outline', 'shield-sync-outline'), ('shimmer', 'shimmer'), ('ship-wheel', 'ship-wheel'), ('shipping-pallet', 'shipping-pallet'), ('shoe-ballet', 'shoe-ballet'), ('shoe-cleat', 'shoe-cleat'), ('shoe-formal', 'shoe-formal'), ('shoe-heel', 'shoe-heel'), ('shoe-print', 'shoe-print'), ('shoe-sneaker', 'shoe-sneaker'), ('shopify', 'shopify'), ('shopping', 'shopping'), ('shopping-music', 'shopping-music'), ('shopping-outline', 'shopping-outline'), ('shopping-search', 'shopping-search'), ('shopping-search-outline', 'shopping-search-outline'), ('shore', 'shore'), ('shovel', 'shovel'), ('shovel-off', 'shovel-off'), ('shower', 'shower'), ('shower-head', 'shower-head'), ('shredder', 'shredder'), ('shuffle', 'shuffle'), ('shuffle-disabled', 'shuffle-disabled'), ('shuffle-variant', 'shuffle-variant'), ('shuriken', 'shuriken'), ('sickle', 'sickle'), ('sigma', 'sigma'), ('sigma-lower', 'sigma-lower'), ('sign-caution', 'sign-caution'), ('sign-direction', 'sign-direction'), ('sign-direction-minus', 'sign-direction-minus'), ('sign-direction-plus', 'sign-direction-plus'), ('sign-direction-remove', 'sign-direction-remove'), ('sign-language', 'sign-language'), ('sign-language-outline', 'sign-language-outline'), ('sign-pole', 'sign-pole'), ('sign-real-estate', 'sign-real-estate'), ('sign-text', 'sign-text'), ('sign-yield', 'sign-yield'), ('signal', 'signal'), ('signal-2g', 'signal-2g'), ('signal-3g', 'signal-3g'), ('signal-4g', 'signal-4g'), ('signal-5g', 'signal-5g'), ('signal-cellular-1', 'signal-cellular-1'), ('signal-cellular-2', 'signal-cellular-2'), ('signal-cellular-3', 'signal-cellular-3'), ('signal-cellular-outline', 'signal-cellular-outline'), ('signal-distance-variant', 'signal-distance-variant'), ('signal-hspa', 'signal-hspa'), ('signal-hspa-plus', 'signal-hspa-plus'), ('signal-off', 'signal-off'), ('signal-variant', 'signal-variant'), ('signature', 'signature'), ('signature-freehand', 'signature-freehand'), ('signature-image', 'signature-image'), ('signature-text', 'signature-text'), ('silo', 'silo'), ('silo-outline', 'silo-outline'), ('silverware', 'silverware'), ('silverware-clean', 'silverware-clean'), ('silverware-fork', 'silverware-fork'), ('silverware-fork-knife', 'silverware-fork-knife'), ('silverware-spoon', 'silverware-spoon'), ('silverware-variant', 'silverware-variant'), ('sim', 'sim'), ('sim-alert', 'sim-alert'), ('sim-alert-outline', 'sim-alert-outline'), ('sim-off', 'sim-off'), ('sim-off-outline', 'sim-off-outline'), ('sim-outline', 'sim-outline'), ('simple-icons', 'simple-icons'), ('sina-weibo', 'sina-weibo'), ('sine-wave', 'sine-wave'), ('sitemap', 'sitemap'), ('sitemap-outline', 'sitemap-outline'), ('size-l', 'size-l'), ('size-m', 'size-m'), ('size-s', 'size-s'), ('size-xl', 'size-xl'), ('size-xs', 'size-xs'), ('size-xxl', 'size-xxl'), ('size-xxs', 'size-xxs'), ('size-xxxl', 'size-xxxl'), ('skate', 'skate'), ('skate-off', 'skate-off'), ('skateboard', 'skateboard'), ('skateboarding', 'skateboarding'), ('skew-less', 'skew-less'), ('skew-more', 'skew-more'), ('ski', 'ski'), ('ski-cross-country', 'ski-cross-country'), ('ski-water', 'ski-water'), ('skip-backward', 'skip-backward'), ('skip-backward-outline', 'skip-backward-outline'), ('skip-forward', 'skip-forward'), ('skip-forward-outline', 'skip-forward-outline'), ('skip-next', 'skip-next'), ('skip-next-circle', 'skip-next-circle'), ('skip-next-circle-outline', 'skip-next-circle-outline'), ('skip-next-outline', 'skip-next-outline'), ('skip-previous', 'skip-previous'), ('skip-previous-circle', 'skip-previous-circle'), ('skip-previous-circle-outline', 'skip-previous-circle-outline'), ('skip-previous-outline', 'skip-previous-outline'), ('skull', 'skull'), ('skull-crossbones', 'skull-crossbones'), ('skull-crossbones-outline', 'skull-crossbones-outline'), ('skull-outline', 'skull-outline'), ('skull-scan', 'skull-scan'), ('skull-scan-outline', 'skull-scan-outline'), ('skype', 'skype'), ('skype-business', 'skype-business'), ('slack', 'slack'), ('slackware', 'slackware'), ('slash-forward', 'slash-forward'), ('slash-forward-box', 'slash-forward-box'), ('sledding', 'sledding'), ('sleep', 'sleep'), ('sleep-off', 'sleep-off'), ('slide', 'slide'), ('slope-downhill', 'slope-downhill'), ('slope-uphill', 'slope-uphill'), ('slot-machine', 'slot-machine'), ('slot-machine-outline', 'slot-machine-outline'), ('smart-card', 'smart-card'), ('smart-card-off', 'smart-card-off'), ('smart-card-off-outline', 'smart-card-off-outline'), ('smart-card-outline', 'smart-card-outline'), ('smart-card-reader', 'smart-card-reader'), ('smart-card-reader-outline', 'smart-card-reader-outline'), ('smog', 'smog'), ('smoke', 'smoke'), ('smoke-detector', 'smoke-detector'), ('smoke-detector-alert', 'smoke-detector-alert'), ('smoke-detector-alert-outline', 'smoke-detector-alert-outline'), ('smoke-detector-off', 'smoke-detector-off'), ('smoke-detector-off-outline', 'smoke-detector-off-outline'), ('smoke-detector-outline', 'smoke-detector-outline'), ('smoke-detector-variant', 'smoke-detector-variant'), ('smoke-detector-variant-alert', 'smoke-detector-variant-alert'), ('smoke-detector-variant-off', 'smoke-detector-variant-off'), ('smoking', 'smoking'), ('smoking-off', 'smoking-off'), ('smoking-pipe', 'smoking-pipe'), ('smoking-pipe-off', 'smoking-pipe-off'), ('snail', 'snail'), ('snake', 'snake'), ('snapchat', 'snapchat'), ('snowboard', 'snowboard'), ('snowflake', 'snowflake'), ('snowflake-alert', 'snowflake-alert'), ('snowflake-check', 'snowflake-check'), ('snowflake-melt', 'snowflake-melt'), ('snowflake-off', 'snowflake-off'), ('snowflake-thermometer', 'snowflake-thermometer'), ('snowflake-variant', 'snowflake-variant'), ('snowman', 'snowman'), ('snowmobile', 'snowmobile'), ('snowshoeing', 'snowshoeing'), ('soccer', 'soccer'), ('soccer-field', 'soccer-field'), ('social-distance-2-meters', 'social-distance-2-meters'), ('social-distance-6-feet', 'social-distance-6-feet'), ('sofa', 'sofa'), ('sofa-outline', 'sofa-outline'), ('sofa-single', 'sofa-single'), ('sofa-single-outline', 'sofa-single-outline'), ('solar-panel', 'solar-panel'), ('solar-panel-large', 'solar-panel-large'), ('solar-power', 'solar-power'), ('solar-power-variant', 'solar-power-variant'), ('solar-power-variant-outline', 'solar-power-variant-outline'), ('soldering-iron', 'soldering-iron'), ('solid', 'solid'), ('sony-playstation', 'sony-playstation'), ('sort', 'sort'), ('sort-alphabetical-ascending', 'sort-alphabetical-ascending'), ('sort-alphabetical-ascending-variant', 'sort-alphabetical-ascending-variant'), ('sort-alphabetical-descending', 'sort-alphabetical-descending'), ('sort-alphabetical-descending-variant', 'sort-alphabetical-descending-variant'), ('sort-alphabetical-variant', 'sort-alphabetical-variant'), ('sort-ascending', 'sort-ascending'), ('sort-bool-ascending', 'sort-bool-ascending'), ('sort-bool-ascending-variant', 'sort-bool-ascending-variant'), ('sort-bool-descending', 'sort-bool-descending'), ('sort-bool-descending-variant', 'sort-bool-descending-variant'), ('sort-calendar-ascending', 'sort-calendar-ascending'), ('sort-calendar-descending', 'sort-calendar-descending'), ('sort-clock-ascending', 'sort-clock-ascending'), ('sort-clock-ascending-outline', 'sort-clock-ascending-outline'), ('sort-clock-descending', 'sort-clock-descending'), ('sort-clock-descending-outline', 'sort-clock-descending-outline'), ('sort-descending', 'sort-descending'), ('sort-numeric-ascending', 'sort-numeric-ascending'), ('sort-numeric-ascending-variant', 'sort-numeric-ascending-variant'), ('sort-numeric-descending', 'sort-numeric-descending'), ('sort-numeric-descending-variant', 'sort-numeric-descending-variant'), ('sort-numeric-variant', 'sort-numeric-variant'), ('sort-reverse-variant', 'sort-reverse-variant'), ('sort-variant', 'sort-variant'), ('sort-variant-lock', 'sort-variant-lock'), ('sort-variant-lock-open', 'sort-variant-lock-open'), ('sort-variant-off', 'sort-variant-off'), ('sort-variant-remove', 'sort-variant-remove'), ('soundbar', 'soundbar'), ('soundcloud', 'soundcloud'), ('source-branch', 'source-branch'), ('source-branch-check', 'source-branch-check'), ('source-branch-minus', 'source-branch-minus'), ('source-branch-plus', 'source-branch-plus'), ('source-branch-refresh', 'source-branch-refresh'), ('source-branch-remove', 'source-branch-remove'), ('source-branch-sync', 'source-branch-sync'), ('source-commit', 'source-commit'), ('source-commit-end', 'source-commit-end'), ('source-commit-end-local', 'source-commit-end-local'), ('source-commit-local', 'source-commit-local'), ('source-commit-next-local', 'source-commit-next-local'), ('source-commit-start', 'source-commit-start'), ('source-commit-start-next-local', 'source-commit-start-next-local'), ('source-fork', 'source-fork'), ('source-merge', 'source-merge'), ('source-pull', 'source-pull'), ('source-repository', 'source-repository'), ('source-repository-multiple', 'source-repository-multiple'), ('soy-sauce', 'soy-sauce'), ('soy-sauce-off', 'soy-sauce-off'), ('spa', 'spa'), ('spa-outline', 'spa-outline'), ('space-invaders', 'space-invaders'), ('space-station', 'space-station'), ('spade', 'spade'), ('speaker', 'speaker'), ('speaker-bluetooth', 'speaker-bluetooth'), ('speaker-message', 'speaker-message'), ('speaker-multiple', 'speaker-multiple'), ('speaker-off', 'speaker-off'), ('speaker-pause', 'speaker-pause'), ('speaker-play', 'speaker-play'), ('speaker-stop', 'speaker-stop'), ('speaker-wireless', 'speaker-wireless'), ('spear', 'spear'), ('speedometer', 'speedometer'), ('speedometer-medium', 'speedometer-medium'), ('speedometer-slow', 'speedometer-slow'), ('spellcheck', 'spellcheck'), ('sphere', 'sphere'), ('sphere-off', 'sphere-off'), ('spider', 'spider'), ('spider-thread', 'spider-thread'), ('spider-web', 'spider-web'), ('spirit-level', 'spirit-level'), ('split-horizontal', 'split-horizontal'), ('split-vertical', 'split-vertical'), ('spoon-sugar', 'spoon-sugar'), ('spotify', 'spotify'), ('spotlight', 'spotlight'), ('spotlight-beam', 'spotlight-beam'), ('spray', 'spray'), ('spray-bottle', 'spray-bottle'), ('spreadsheet', 'spreadsheet'), ('sprinkler', 'sprinkler'), ('sprinkler-fire', 'sprinkler-fire'), ('sprinkler-variant', 'sprinkler-variant'), ('sprout', 'sprout'), ('sprout-outline', 'sprout-outline'), ('square', 'square'), ('square-circle', 'square-circle'), ('square-edit-outline', 'square-edit-outline'), ('square-inc', 'square-inc'), ('square-inc-cash', 'square-inc-cash'), ('square-medium', 'square-medium'), ('square-medium-outline', 'square-medium-outline'), ('square-off', 'square-off'), ('square-off-outline', 'square-off-outline'), ('square-opacity', 'square-opacity'), ('square-outline', 'square-outline'), ('square-root', 'square-root'), ('square-root-box', 'square-root-box'), ('square-rounded', 'square-rounded'), ('square-rounded-badge', 'square-rounded-badge'), ('square-rounded-badge-outline', 'square-rounded-badge-outline'), ('square-rounded-outline', 'square-rounded-outline'), ('square-small', 'square-small'), ('square-wave', 'square-wave'), ('squeegee', 'squeegee'), ('ssh', 'ssh'), ('stack-exchange', 'stack-exchange'), ('stack-overflow', 'stack-overflow'), ('stackpath', 'stackpath'), ('stadium', 'stadium'), ('stadium-outline', 'stadium-outline'), ('stadium-variant', 'stadium-variant'), ('stairs', 'stairs'), ('stairs-box', 'stairs-box'), ('stairs-down', 'stairs-down'), ('stairs-up', 'stairs-up'), ('stamper', 'stamper'), ('standard-definition', 'standard-definition'), ('star', 'star'), ('star-box', 'star-box'), ('star-box-multiple', 'star-box-multiple'), ('star-box-multiple-outline', 'star-box-multiple-outline'), ('star-box-outline', 'star-box-outline'), ('star-check', 'star-check'), ('star-check-outline', 'star-check-outline'), ('star-circle', 'star-circle'), ('star-circle-outline', 'star-circle-outline'), ('star-cog', 'star-cog'), ('star-cog-outline', 'star-cog-outline'), ('star-crescent', 'star-crescent'), ('star-david', 'star-david'), ('star-face', 'star-face'), ('star-four-points', 'star-four-points'), ('star-four-points-outline', 'star-four-points-outline'), ('star-half', 'star-half'), ('star-half-full', 'star-half-full'), ('star-minus', 'star-minus'), ('star-minus-outline', 'star-minus-outline'), ('star-off', 'star-off'), ('star-off-outline', 'star-off-outline'), ('star-outline', 'star-outline'), ('star-plus', 'star-plus'), ('star-plus-outline', 'star-plus-outline'), ('star-remove', 'star-remove'), ('star-remove-outline', 'star-remove-outline'), ('star-settings', 'star-settings'), ('star-settings-outline', 'star-settings-outline'), ('star-shooting', 'star-shooting'), ('star-shooting-outline', 'star-shooting-outline'), ('star-three-points', 'star-three-points'), ('star-three-points-outline', 'star-three-points-outline'), ('state-machine', 'state-machine'), ('steam', 'steam'), ('steam-box', 'steam-box'), ('steering', 'steering'), ('steering-off', 'steering-off'), ('step-backward', 'step-backward'), ('step-backward-2', 'step-backward-2'), ('step-forward', 'step-forward'), ('step-forward-2', 'step-forward-2'), ('stethoscope', 'stethoscope'), ('sticker', 'sticker'), ('sticker-alert', 'sticker-alert'), ('sticker-alert-outline', 'sticker-alert-outline'), ('sticker-check', 'sticker-check'), ('sticker-check-outline', 'sticker-check-outline'), ('sticker-circle-outline', 'sticker-circle-outline'), ('sticker-emoji', 'sticker-emoji'), ('sticker-minus', 'sticker-minus'), ('sticker-minus-outline', 'sticker-minus-outline'), ('sticker-outline', 'sticker-outline'), ('sticker-plus', 'sticker-plus'), ('sticker-plus-outline', 'sticker-plus-outline'), ('sticker-remove', 'sticker-remove'), ('sticker-remove-outline', 'sticker-remove-outline'), ('sticker-text', 'sticker-text'), ('sticker-text-outline', 'sticker-text-outline'), ('stocking', 'stocking'), ('stomach', 'stomach'), ('stool', 'stool'), ('stool-outline', 'stool-outline'), ('stop', 'stop'), ('stop-circle', 'stop-circle'), ('stop-circle-outline', 'stop-circle-outline'), ('storage-tank', 'storage-tank'), ('storage-tank-outline', 'storage-tank-outline'), ('store', 'store'), ('store-24-hour', 'store-24-hour'), ('store-alert', 'store-alert'), ('store-alert-outline', 'store-alert-outline'), ('store-check', 'store-check'), ('store-check-outline', 'store-check-outline'), ('store-clock', 'store-clock'), ('store-clock-outline', 'store-clock-outline'), ('store-cog', 'store-cog'), ('store-cog-outline', 'store-cog-outline'), ('store-edit', 'store-edit'), ('store-edit-outline', 'store-edit-outline'), ('store-marker', 'store-marker'), ('store-marker-outline', 'store-marker-outline'), ('store-minus', 'store-minus'), ('store-minus-outline', 'store-minus-outline'), ('store-off', 'store-off'), ('store-off-outline', 'store-off-outline'), ('store-outline', 'store-outline'), ('store-plus', 'store-plus'), ('store-plus-outline', 'store-plus-outline'), ('store-remove', 'store-remove'), ('store-remove-outline', 'store-remove-outline'), ('store-search', 'store-search'), ('store-search-outline', 'store-search-outline'), ('store-settings', 'store-settings'), ('store-settings-outline', 'store-settings-outline'), ('storefront', 'storefront'), ('storefront-check', 'storefront-check'), ('storefront-check-outline', 'storefront-check-outline'), ('storefront-edit', 'storefront-edit'), ('storefront-edit-outline', 'storefront-edit-outline'), ('storefront-minus', 'storefront-minus'), ('storefront-minus-outline', 'storefront-minus-outline'), ('storefront-outline', 'storefront-outline'), ('storefront-plus', 'storefront-plus'), ('storefront-plus-outline', 'storefront-plus-outline'), ('storefront-remove', 'storefront-remove'), ('storefront-remove-outline', 'storefront-remove-outline'), ('stove', 'stove'), ('strategy', 'strategy'), ('strava', 'strava'), ('stretch-to-page', 'stretch-to-page'), ('stretch-to-page-outline', 'stretch-to-page-outline'), ('string-lights', 'string-lights'), ('string-lights-off', 'string-lights-off'), ('subdirectory-arrow-left', 'subdirectory-arrow-left'), ('subdirectory-arrow-right', 'subdirectory-arrow-right'), ('submarine', 'submarine'), ('subtitles', 'subtitles'), ('subtitles-outline', 'subtitles-outline'), ('subway', 'subway'), ('subway-alert-variant', 'subway-alert-variant'), ('subway-variant', 'subway-variant'), ('summit', 'summit'), ('sun-angle', 'sun-angle'), ('sun-angle-outline', 'sun-angle-outline'), ('sun-clock', 'sun-clock'), ('sun-clock-outline', 'sun-clock-outline'), ('sun-compass', 'sun-compass'), ('sun-snowflake', 'sun-snowflake'), ('sun-snowflake-variant', 'sun-snowflake-variant'), ('sun-thermometer', 'sun-thermometer'), ('sun-thermometer-outline', 'sun-thermometer-outline'), ('sun-wireless', 'sun-wireless'), ('sun-wireless-outline', 'sun-wireless-outline'), ('sunglasses', 'sunglasses'), ('surfing', 'surfing'), ('surround-sound', 'surround-sound'), ('surround-sound-2-0', 'surround-sound-2-0'), ('surround-sound-2-1', 'surround-sound-2-1'), ('surround-sound-3-1', 'surround-sound-3-1'), ('surround-sound-5-1', 'surround-sound-5-1'), ('surround-sound-5-1-2', 'surround-sound-5-1-2'), ('surround-sound-7-1', 'surround-sound-7-1'), ('svg', 'svg'), ('swap-horizontal', 'swap-horizontal'), ('swap-horizontal-bold', 'swap-horizontal-bold'), ('swap-horizontal-circle', 'swap-horizontal-circle'), ('swap-horizontal-circle-outline', 'swap-horizontal-circle-outline'), ('swap-horizontal-variant', 'swap-horizontal-variant'), ('swap-vertical', 'swap-vertical'), ('swap-vertical-bold', 'swap-vertical-bold'), ('swap-vertical-circle', 'swap-vertical-circle'), ('swap-vertical-circle-outline', 'swap-vertical-circle-outline'), ('swap-vertical-variant', 'swap-vertical-variant'), ('swim', 'swim'), ('switch', 'switch'), ('sword', 'sword'), ('sword-cross', 'sword-cross'), ('syllabary-hangul', 'syllabary-hangul'), ('syllabary-hiragana', 'syllabary-hiragana'), ('syllabary-katakana', 'syllabary-katakana'), ('syllabary-katakana-halfwidth', 'syllabary-katakana-halfwidth'), ('symbol', 'symbol'), ('symfony', 'symfony'), ('synagogue', 'synagogue'), ('synagogue-outline', 'synagogue-outline'), ('sync', 'sync'), ('sync-alert', 'sync-alert'), ('sync-circle', 'sync-circle'), ('sync-off', 'sync-off'), ('tab', 'tab'), ('tab-minus', 'tab-minus'), ('tab-plus', 'tab-plus'), ('tab-remove', 'tab-remove'), ('tab-search', 'tab-search'), ('tab-unselected', 'tab-unselected'), ('table', 'table'), ('table-account', 'table-account'), ('table-alert', 'table-alert'), ('table-arrow-down', 'table-arrow-down'), ('table-arrow-left', 'table-arrow-left'), ('table-arrow-right', 'table-arrow-right'), ('table-arrow-up', 'table-arrow-up'), ('table-border', 'table-border'), ('table-cancel', 'table-cancel'), ('table-chair', 'table-chair'), ('table-check', 'table-check'), ('table-clock', 'table-clock'), ('table-cog', 'table-cog'), ('table-column', 'table-column'), ('table-column-plus-after', 'table-column-plus-after'), ('table-column-plus-before', 'table-column-plus-before'), ('table-column-remove', 'table-column-remove'), ('table-column-width', 'table-column-width'), ('table-edit', 'table-edit'), ('table-eye', 'table-eye'), ('table-eye-off', 'table-eye-off'), ('table-filter', 'table-filter'), ('table-furniture', 'table-furniture'), ('table-headers-eye', 'table-headers-eye'), ('table-headers-eye-off', 'table-headers-eye-off'), ('table-heart', 'table-heart'), ('table-key', 'table-key'), ('table-large', 'table-large'), ('table-large-plus', 'table-large-plus'), ('table-large-remove', 'table-large-remove'), ('table-lock', 'table-lock'), ('table-merge-cells', 'table-merge-cells'), ('table-minus', 'table-minus'), ('table-multiple', 'table-multiple'), ('table-network', 'table-network'), ('table-of-contents', 'table-of-contents'), ('table-off', 'table-off'), ('table-picnic', 'table-picnic'), ('table-pivot', 'table-pivot'), ('table-plus', 'table-plus'), ('table-question', 'table-question'), ('table-refresh', 'table-refresh'), ('table-remove', 'table-remove'), ('table-row', 'table-row'), ('table-row-height', 'table-row-height'), ('table-row-plus-after', 'table-row-plus-after'), ('table-row-plus-before', 'table-row-plus-before'), ('table-row-remove', 'table-row-remove'), ('table-search', 'table-search'), ('table-settings', 'table-settings'), ('table-split-cell', 'table-split-cell'), ('table-star', 'table-star'), ('table-sync', 'table-sync'), ('table-tennis', 'table-tennis'), ('tablet', 'tablet'), ('tablet-android', 'tablet-android'), ('tablet-cellphone', 'tablet-cellphone'), ('tablet-dashboard', 'tablet-dashboard'), ('tablet-ipad', 'tablet-ipad'), ('taco', 'taco'), ('tag', 'tag'), ('tag-arrow-down', 'tag-arrow-down'), ('tag-arrow-down-outline', 'tag-arrow-down-outline'), ('tag-arrow-left', 'tag-arrow-left'), ('tag-arrow-left-outline', 'tag-arrow-left-outline'), ('tag-arrow-right', 'tag-arrow-right'), ('tag-arrow-right-outline', 'tag-arrow-right-outline'), ('tag-arrow-up', 'tag-arrow-up'), ('tag-arrow-up-outline', 'tag-arrow-up-outline'), ('tag-check', 'tag-check'), ('tag-check-outline', 'tag-check-outline'), ('tag-faces', 'tag-faces'), ('tag-heart', 'tag-heart'), ('tag-heart-outline', 'tag-heart-outline'), ('tag-minus', 'tag-minus'), ('tag-minus-outline', 'tag-minus-outline'), ('tag-multiple', 'tag-multiple'), ('tag-multiple-outline', 'tag-multiple-outline'), ('tag-off', 'tag-off'), ('tag-off-outline', 'tag-off-outline'), ('tag-outline', 'tag-outline'), ('tag-plus', 'tag-plus'), ('tag-plus-outline', 'tag-plus-outline'), ('tag-remove', 'tag-remove'), ('tag-remove-outline', 'tag-remove-outline'), ('tag-search', 'tag-search'), ('tag-search-outline', 'tag-search-outline'), ('tag-text', 'tag-text'), ('tag-text-outline', 'tag-text-outline'), ('tailwind', 'tailwind'), ('tally-mark-1', 'tally-mark-1'), ('tally-mark-2', 'tally-mark-2'), ('tally-mark-3', 'tally-mark-3'), ('tally-mark-4', 'tally-mark-4'), ('tally-mark-5', 'tally-mark-5'), ('tangram', 'tangram'), ('tank', 'tank'), ('tanker-truck', 'tanker-truck'), ('tape-drive', 'tape-drive'), ('tape-measure', 'tape-measure'), ('target', 'target'), ('target-account', 'target-account'), ('target-variant', 'target-variant'), ('taxi', 'taxi'), ('tea', 'tea'), ('tea-outline', 'tea-outline'), ('teamspeak', 'teamspeak'), ('teamviewer', 'teamviewer'), ('teddy-bear', 'teddy-bear'), ('telegram', 'telegram'), ('telescope', 'telescope'), ('television', 'television'), ('television-ambient-light', 'television-ambient-light'), ('television-box', 'television-box'), ('television-classic', 'television-classic'), ('television-classic-off', 'television-classic-off'), ('television-guide', 'television-guide'), ('television-off', 'television-off'), ('television-pause', 'television-pause'), ('television-play', 'television-play'), ('television-shimmer', 'television-shimmer'), ('television-speaker', 'television-speaker'), ('television-speaker-off', 'television-speaker-off'), ('television-stop', 'television-stop'), ('temperature-celsius', 'temperature-celsius'), ('temperature-fahrenheit', 'temperature-fahrenheit'), ('temperature-kelvin', 'temperature-kelvin'), ('temple-buddhist', 'temple-buddhist'), ('temple-buddhist-outline', 'temple-buddhist-outline'), ('temple-hindu', 'temple-hindu'), ('temple-hindu-outline', 'temple-hindu-outline'), ('tennis', 'tennis'), ('tennis-ball', 'tennis-ball'), ('tent', 'tent'), ('terraform', 'terraform'), ('terrain', 'terrain'), ('test-tube', 'test-tube'), ('test-tube-empty', 'test-tube-empty'), ('test-tube-off', 'test-tube-off'), ('text', 'text'), ('text-account', 'text-account'), ('text-box', 'text-box'), ('text-box-check', 'text-box-check'), ('text-box-check-outline', 'text-box-check-outline'), ('text-box-edit', 'text-box-edit'), ('text-box-edit-outline', 'text-box-edit-outline'), ('text-box-minus', 'text-box-minus'), ('text-box-minus-outline', 'text-box-minus-outline'), ('text-box-multiple', 'text-box-multiple'), ('text-box-multiple-outline', 'text-box-multiple-outline'), ('text-box-outline', 'text-box-outline'), ('text-box-plus', 'text-box-plus'), ('text-box-plus-outline', 'text-box-plus-outline'), ('text-box-remove', 'text-box-remove'), ('text-box-remove-outline', 'text-box-remove-outline'), ('text-box-search', 'text-box-search'), ('text-box-search-outline', 'text-box-search-outline'), ('text-long', 'text-long'), ('text-recognition', 'text-recognition'), ('text-search', 'text-search'), ('text-search-variant', 'text-search-variant'), ('text-shadow', 'text-shadow'), ('text-short', 'text-short'), ('texture', 'texture'), ('texture-box', 'texture-box'), ('theater', 'theater'), ('theme-light-dark', 'theme-light-dark'), ('thermometer', 'thermometer'), ('thermometer-alert', 'thermometer-alert'), ('thermometer-auto', 'thermometer-auto'), ('thermometer-bluetooth', 'thermometer-bluetooth'), ('thermometer-check', 'thermometer-check'), ('thermometer-chevron-down', 'thermometer-chevron-down'), ('thermometer-chevron-up', 'thermometer-chevron-up'), ('thermometer-high', 'thermometer-high'), ('thermometer-lines', 'thermometer-lines'), ('thermometer-low', 'thermometer-low'), ('thermometer-minus', 'thermometer-minus'), ('thermometer-off', 'thermometer-off'), ('thermometer-plus', 'thermometer-plus'), ('thermometer-probe', 'thermometer-probe'), ('thermometer-probe-off', 'thermometer-probe-off'), ('thermometer-water', 'thermometer-water'), ('thermostat', 'thermostat'), ('thermostat-auto', 'thermostat-auto'), ('thermostat-box', 'thermostat-box'), ('thermostat-box-auto', 'thermostat-box-auto'), ('thought-bubble', 'thought-bubble'), ('thought-bubble-outline', 'thought-bubble-outline'), ('thumb-down', 'thumb-down'), ('thumb-down-outline', 'thumb-down-outline'), ('thumb-up', 'thumb-up'), ('thumb-up-outline', 'thumb-up-outline'), ('thumbs-up-down', 'thumbs-up-down'), ('thumbs-up-down-outline', 'thumbs-up-down-outline'), ('ticket', 'ticket'), ('ticket-account', 'ticket-account'), ('ticket-confirmation', 'ticket-confirmation'), ('ticket-confirmation-outline', 'ticket-confirmation-outline'), ('ticket-outline', 'ticket-outline'), ('ticket-percent', 'ticket-percent'), ('ticket-percent-outline', 'ticket-percent-outline'), ('tie', 'tie'), ('tilde', 'tilde'), ('tilde-off', 'tilde-off'), ('timelapse', 'timelapse'), ('timeline', 'timeline'), ('timeline-alert', 'timeline-alert'), ('timeline-alert-outline', 'timeline-alert-outline'), ('timeline-check', 'timeline-check'), ('timeline-check-outline', 'timeline-check-outline'), ('timeline-clock', 'timeline-clock'), ('timeline-clock-outline', 'timeline-clock-outline'), ('timeline-minus', 'timeline-minus'), ('timeline-minus-outline', 'timeline-minus-outline'), ('timeline-outline', 'timeline-outline'), ('timeline-plus', 'timeline-plus'), ('timeline-plus-outline', 'timeline-plus-outline'), ('timeline-question', 'timeline-question'), ('timeline-question-outline', 'timeline-question-outline'), ('timeline-remove', 'timeline-remove'), ('timeline-remove-outline', 'timeline-remove-outline'), ('timeline-text', 'timeline-text'), ('timeline-text-outline', 'timeline-text-outline'), ('timer', 'timer'), ('timer-10', 'timer-10'), ('timer-3', 'timer-3'), ('timer-alert', 'timer-alert'), ('timer-alert-outline', 'timer-alert-outline'), ('timer-cancel', 'timer-cancel'), ('timer-cancel-outline', 'timer-cancel-outline'), ('timer-check', 'timer-check'), ('timer-check-outline', 'timer-check-outline'), ('timer-cog', 'timer-cog'), ('timer-cog-outline', 'timer-cog-outline'), ('timer-edit', 'timer-edit'), ('timer-edit-outline', 'timer-edit-outline'), ('timer-lock', 'timer-lock'), ('timer-lock-open', 'timer-lock-open'), ('timer-lock-open-outline', 'timer-lock-open-outline'), ('timer-lock-outline', 'timer-lock-outline'), ('timer-marker', 'timer-marker'), ('timer-marker-outline', 'timer-marker-outline'), ('timer-minus', 'timer-minus'), ('timer-minus-outline', 'timer-minus-outline'), ('timer-music', 'timer-music'), ('timer-music-outline', 'timer-music-outline'), ('timer-off', 'timer-off'), ('timer-off-outline', 'timer-off-outline'), ('timer-outline', 'timer-outline'), ('timer-pause', 'timer-pause'), ('timer-pause-outline', 'timer-pause-outline'), ('timer-play', 'timer-play'), ('timer-play-outline', 'timer-play-outline'), ('timer-plus', 'timer-plus'), ('timer-plus-outline', 'timer-plus-outline'), ('timer-refresh', 'timer-refresh'), ('timer-refresh-outline', 'timer-refresh-outline'), ('timer-remove', 'timer-remove'), ('timer-remove-outline', 'timer-remove-outline'), ('timer-sand', 'timer-sand'), ('timer-sand-complete', 'timer-sand-complete'), ('timer-sand-empty', 'timer-sand-empty'), ('timer-sand-full', 'timer-sand-full'), ('timer-sand-paused', 'timer-sand-paused'), ('timer-settings', 'timer-settings'), ('timer-settings-outline', 'timer-settings-outline'), ('timer-star', 'timer-star'), ('timer-star-outline', 'timer-star-outline'), ('timer-stop', 'timer-stop'), ('timer-stop-outline', 'timer-stop-outline'), ('timer-sync', 'timer-sync'), ('timer-sync-outline', 'timer-sync-outline'), ('timetable', 'timetable'), ('tire', 'tire'), ('toaster', 'toaster'), ('toaster-off', 'toaster-off'), ('toaster-oven', 'toaster-oven'), ('toggle-switch', 'toggle-switch'), ('toggle-switch-off', 'toggle-switch-off'), ('toggle-switch-off-outline', 'toggle-switch-off-outline'), ('toggle-switch-outline', 'toggle-switch-outline'), ('toggle-switch-variant', 'toggle-switch-variant'), ('toggle-switch-variant-off', 'toggle-switch-variant-off'), ('toilet', 'toilet'), ('toolbox', 'toolbox'), ('toolbox-outline', 'toolbox-outline'), ('tools', 'tools'), ('tooltip', 'tooltip'), ('tooltip-account', 'tooltip-account'), ('tooltip-cellphone', 'tooltip-cellphone'), ('tooltip-check', 'tooltip-check'), ('tooltip-check-outline', 'tooltip-check-outline'), ('tooltip-edit', 'tooltip-edit'), ('tooltip-edit-outline', 'tooltip-edit-outline'), ('tooltip-image', 'tooltip-image'), ('tooltip-image-outline', 'tooltip-image-outline'), ('tooltip-minus', 'tooltip-minus'), ('tooltip-minus-outline', 'tooltip-minus-outline'), ('tooltip-outline', 'tooltip-outline'), ('tooltip-plus', 'tooltip-plus'), ('tooltip-plus-outline', 'tooltip-plus-outline'), ('tooltip-question', 'tooltip-question'), ('tooltip-question-outline', 'tooltip-question-outline'), ('tooltip-remove', 'tooltip-remove'), ('tooltip-remove-outline', 'tooltip-remove-outline'), ('tooltip-text', 'tooltip-text'), ('tooltip-text-outline', 'tooltip-text-outline'), ('tooth', 'tooth'), ('tooth-outline', 'tooth-outline'), ('toothbrush', 'toothbrush'), ('toothbrush-electric', 'toothbrush-electric'), ('toothbrush-paste', 'toothbrush-paste'), ('tor', 'tor'), ('torch', 'torch'), ('tortoise', 'tortoise'), ('toslink', 'toslink'), ('tournament', 'tournament'), ('tow-truck', 'tow-truck'), ('tower-beach', 'tower-beach'), ('tower-fire', 'tower-fire'), ('town-hall', 'town-hall'), ('toy-brick', 'toy-brick'), ('toy-brick-marker', 'toy-brick-marker'), ('toy-brick-marker-outline', 'toy-brick-marker-outline'), ('toy-brick-minus', 'toy-brick-minus'), ('toy-brick-minus-outline', 'toy-brick-minus-outline'), ('toy-brick-outline', 'toy-brick-outline'), ('toy-brick-plus', 'toy-brick-plus'), ('toy-brick-plus-outline', 'toy-brick-plus-outline'), ('toy-brick-remove', 'toy-brick-remove'), ('toy-brick-remove-outline', 'toy-brick-remove-outline'), ('toy-brick-search', 'toy-brick-search'), ('toy-brick-search-outline', 'toy-brick-search-outline'), ('track-light', 'track-light'), ('track-light-off', 'track-light-off'), ('trackpad', 'trackpad'), ('trackpad-lock', 'trackpad-lock'), ('tractor', 'tractor'), ('tractor-variant', 'tractor-variant'), ('trademark', 'trademark'), ('traffic-cone', 'traffic-cone'), ('traffic-light', 'traffic-light'), ('traffic-light-outline', 'traffic-light-outline'), ('train', 'train'), ('train-car', 'train-car'), ('train-car-autorack', 'train-car-autorack'), ('train-car-box', 'train-car-box'), ('train-car-box-full', 'train-car-box-full'), ('train-car-box-open', 'train-car-box-open'), ('train-car-caboose', 'train-car-caboose'), ('train-car-centerbeam', 'train-car-centerbeam'), ('train-car-centerbeam-full', 'train-car-centerbeam-full'), ('train-car-container', 'train-car-container'), ('train-car-flatbed', 'train-car-flatbed'), ('train-car-flatbed-car', 'train-car-flatbed-car'), ('train-car-flatbed-tank', 'train-car-flatbed-tank'), ('train-car-gondola', 'train-car-gondola'), ('train-car-gondola-full', 'train-car-gondola-full'), ('train-car-hopper', 'train-car-hopper'), ('train-car-hopper-covered', 'train-car-hopper-covered'), ('train-car-hopper-full', 'train-car-hopper-full'), ('train-car-intermodal', 'train-car-intermodal'), ('train-car-passenger', 'train-car-passenger'), ('train-car-passenger-door', 'train-car-passenger-door'), ('train-car-passenger-door-open', 'train-car-passenger-door-open'), ('train-car-passenger-variant', 'train-car-passenger-variant'), ('train-car-tank', 'train-car-tank'), ('train-variant', 'train-variant'), ('tram', 'tram'), ('tram-side', 'tram-side'), ('transcribe', 'transcribe'), ('transcribe-close', 'transcribe-close'), ('transfer', 'transfer'), ('transfer-down', 'transfer-down'), ('transfer-left', 'transfer-left'), ('transfer-right', 'transfer-right'), ('transfer-up', 'transfer-up'), ('transit-connection', 'transit-connection'), ('transit-connection-horizontal', 'transit-connection-horizontal'), ('transit-connection-variant', 'transit-connection-variant'), ('transit-detour', 'transit-detour'), ('transit-skip', 'transit-skip'), ('transit-transfer', 'transit-transfer'), ('transition', 'transition'), ('transition-masked', 'transition-masked'), ('translate', 'translate'), ('translate-off', 'translate-off'), ('translate-variant', 'translate-variant'), ('transmission-tower', 'transmission-tower'), ('transmission-tower-export', 'transmission-tower-export'), ('transmission-tower-import', 'transmission-tower-import'), ('transmission-tower-off', 'transmission-tower-off'), ('trash-can', 'trash-can'), ('trash-can-outline', 'trash-can-outline'), ('tray', 'tray'), ('tray-alert', 'tray-alert'), ('tray-arrow-down', 'tray-arrow-down'), ('tray-arrow-up', 'tray-arrow-up'), ('tray-full', 'tray-full'), ('tray-minus', 'tray-minus'), ('tray-plus', 'tray-plus'), ('tray-remove', 'tray-remove'), ('treasure-chest', 'treasure-chest'), ('tree', 'tree'), ('tree-outline', 'tree-outline'), ('trello', 'trello'), ('trending-down', 'trending-down'), ('trending-neutral', 'trending-neutral'), ('trending-up', 'trending-up'), ('triangle', 'triangle'), ('triangle-outline', 'triangle-outline'), ('triangle-small-down', 'triangle-small-down'), ('triangle-small-up', 'triangle-small-up'), ('triangle-wave', 'triangle-wave'), ('triforce', 'triforce'), ('trophy', 'trophy'), ('trophy-award', 'trophy-award'), ('trophy-broken', 'trophy-broken'), ('trophy-outline', 'trophy-outline'), ('trophy-variant', 'trophy-variant'), ('trophy-variant-outline', 'trophy-variant-outline'), ('truck', 'truck'), ('truck-alert', 'truck-alert'), ('truck-alert-outline', 'truck-alert-outline'), ('truck-cargo-container', 'truck-cargo-container'), ('truck-check', 'truck-check'), ('truck-check-outline', 'truck-check-outline'), ('truck-delivery', 'truck-delivery'), ('truck-delivery-outline', 'truck-delivery-outline'), ('truck-fast', 'truck-fast'), ('truck-fast-outline', 'truck-fast-outline'), ('truck-flatbed', 'truck-flatbed'), ('truck-minus', 'truck-minus'), ('truck-minus-outline', 'truck-minus-outline'), ('truck-outline', 'truck-outline'), ('truck-plus', 'truck-plus'), ('truck-plus-outline', 'truck-plus-outline'), ('truck-remove', 'truck-remove'), ('truck-remove-outline', 'truck-remove-outline'), ('truck-snowflake', 'truck-snowflake'), ('truck-trailer', 'truck-trailer'), ('trumpet', 'trumpet'), ('tshirt-crew', 'tshirt-crew'), ('tshirt-crew-outline', 'tshirt-crew-outline'), ('tshirt-v', 'tshirt-v'), ('tshirt-v-outline', 'tshirt-v-outline'), ('tsunami', 'tsunami'), ('tumble-dryer', 'tumble-dryer'), ('tumble-dryer-alert', 'tumble-dryer-alert'), ('tumble-dryer-off', 'tumble-dryer-off'), ('tumblr', 'tumblr'), ('tumblr-box', 'tumblr-box'), ('tumblr-reblog', 'tumblr-reblog'), ('tune', 'tune'), ('tune-variant', 'tune-variant'), ('tune-vertical', 'tune-vertical'), ('tune-vertical-variant', 'tune-vertical-variant'), ('tunnel', 'tunnel'), ('tunnel-outline', 'tunnel-outline'), ('turbine', 'turbine'), ('turkey', 'turkey'), ('turnstile', 'turnstile'), ('turnstile-outline', 'turnstile-outline'), ('turtle', 'turtle'), ('twitch', 'twitch'), ('twitter', 'twitter'), ('twitter-box', 'twitter-box'), ('twitter-circle', 'twitter-circle'), ('two-factor-authentication', 'two-factor-authentication'), ('typewriter', 'typewriter'), ('uber', 'uber'), ('ubisoft', 'ubisoft'), ('ubuntu', 'ubuntu'), ('ufo', 'ufo'), ('ufo-outline', 'ufo-outline'), ('ultra-high-definition', 'ultra-high-definition'), ('umbraco', 'umbraco'), ('umbrella', 'umbrella'), ('umbrella-beach', 'umbrella-beach'), ('umbrella-beach-outline', 'umbrella-beach-outline'), ('umbrella-closed', 'umbrella-closed'), ('umbrella-closed-outline', 'umbrella-closed-outline'), ('umbrella-closed-variant', 'umbrella-closed-variant'), ('umbrella-outline', 'umbrella-outline'), ('undo', 'undo'), ('undo-variant', 'undo-variant'), ('unfold-less-horizontal', 'unfold-less-horizontal'), ('unfold-less-vertical', 'unfold-less-vertical'), ('unfold-more-horizontal', 'unfold-more-horizontal'), ('unfold-more-vertical', 'unfold-more-vertical'), ('ungroup', 'ungroup'), ('unicode', 'unicode'), ('unicorn', 'unicorn'), ('unicorn-variant', 'unicorn-variant'), ('unicycle', 'unicycle'), ('unity', 'unity'), ('unreal', 'unreal'), ('untappd', 'untappd'), ('update', 'update'), ('upload', 'upload'), ('upload-lock', 'upload-lock'), ('upload-lock-outline', 'upload-lock-outline'), ('upload-multiple', 'upload-multiple'), ('upload-network', 'upload-network'), ('upload-network-outline', 'upload-network-outline'), ('upload-off', 'upload-off'), ('upload-off-outline', 'upload-off-outline'), ('upload-outline', 'upload-outline'), ('usb', 'usb'), ('usb-flash-drive', 'usb-flash-drive'), ('usb-flash-drive-outline', 'usb-flash-drive-outline'), ('usb-port', 'usb-port'), ('vacuum', 'vacuum'), ('vacuum-outline', 'vacuum-outline'), ('valve', 'valve'), ('valve-closed', 'valve-closed'), ('valve-open', 'valve-open'), ('van-passenger', 'van-passenger'), ('van-utility', 'van-utility'), ('vanish', 'vanish'), ('vanish-quarter', 'vanish-quarter'), ('vanity-light', 'vanity-light'), ('variable', 'variable'), ('variable-box', 'variable-box'), ('vector-arrange-above', 'vector-arrange-above'), ('vector-arrange-below', 'vector-arrange-below'), ('vector-bezier', 'vector-bezier'), ('vector-circle', 'vector-circle'), ('vector-circle-variant', 'vector-circle-variant'), ('vector-combine', 'vector-combine'), ('vector-curve', 'vector-curve'), ('vector-difference', 'vector-difference'), ('vector-difference-ab', 'vector-difference-ab'), ('vector-difference-ba', 'vector-difference-ba'), ('vector-ellipse', 'vector-ellipse'), ('vector-intersection', 'vector-intersection'), ('vector-line', 'vector-line'), ('vector-link', 'vector-link'), ('vector-point', 'vector-point'), ('vector-point-edit', 'vector-point-edit'), ('vector-point-minus', 'vector-point-minus'), ('vector-point-plus', 'vector-point-plus'), ('vector-point-select', 'vector-point-select'), ('vector-polygon', 'vector-polygon'), ('vector-polygon-variant', 'vector-polygon-variant'), ('vector-polyline', 'vector-polyline'), ('vector-polyline-edit', 'vector-polyline-edit'), ('vector-polyline-minus', 'vector-polyline-minus'), ('vector-polyline-plus', 'vector-polyline-plus'), ('vector-polyline-remove', 'vector-polyline-remove'), ('vector-radius', 'vector-radius'), ('vector-rectangle', 'vector-rectangle'), ('vector-selection', 'vector-selection'), ('vector-square', 'vector-square'), ('vector-square-close', 'vector-square-close'), ('vector-square-edit', 'vector-square-edit'), ('vector-square-minus', 'vector-square-minus'), ('vector-square-open', 'vector-square-open'), ('vector-square-plus', 'vector-square-plus'), ('vector-square-remove', 'vector-square-remove'), ('vector-triangle', 'vector-triangle'), ('vector-union', 'vector-union'), ('venmo', 'venmo'), ('vhs', 'vhs'), ('vibrate', 'vibrate'), ('vibrate-off', 'vibrate-off'), ('video', 'video'), ('video-2d', 'video-2d'), ('video-3d', 'video-3d'), ('video-3d-off', 'video-3d-off'), ('video-3d-variant', 'video-3d-variant'), ('video-4k-box', 'video-4k-box'), ('video-account', 'video-account'), ('video-box', 'video-box'), ('video-box-off', 'video-box-off'), ('video-check', 'video-check'), ('video-check-outline', 'video-check-outline'), ('video-high-definition', 'video-high-definition'), ('video-image', 'video-image'), ('video-input-antenna', 'video-input-antenna'), ('video-input-component', 'video-input-component'), ('video-input-hdmi', 'video-input-hdmi'), ('video-input-scart', 'video-input-scart'), ('video-input-svideo', 'video-input-svideo'), ('video-marker', 'video-marker'), ('video-marker-outline', 'video-marker-outline'), ('video-minus', 'video-minus'), ('video-minus-outline', 'video-minus-outline'), ('video-off', 'video-off'), ('video-off-outline', 'video-off-outline'), ('video-outline', 'video-outline'), ('video-plus', 'video-plus'), ('video-plus-outline', 'video-plus-outline'), ('video-stabilization', 'video-stabilization'), ('video-switch', 'video-switch'), ('video-switch-outline', 'video-switch-outline'), ('video-vintage', 'video-vintage'), ('video-wireless', 'video-wireless'), ('video-wireless-outline', 'video-wireless-outline'), ('view-agenda', 'view-agenda'), ('view-agenda-outline', 'view-agenda-outline'), ('view-array', 'view-array'), ('view-array-outline', 'view-array-outline'), ('view-carousel', 'view-carousel'), ('view-carousel-outline', 'view-carousel-outline'), ('view-column', 'view-column'), ('view-column-outline', 'view-column-outline'), ('view-comfy', 'view-comfy'), ('view-comfy-outline', 'view-comfy-outline'), ('view-compact', 'view-compact'), ('view-compact-outline', 'view-compact-outline'), ('view-dashboard', 'view-dashboard'), ('view-dashboard-edit', 'view-dashboard-edit'), ('view-dashboard-edit-outline', 'view-dashboard-edit-outline'), ('view-dashboard-outline', 'view-dashboard-outline'), ('view-dashboard-variant', 'view-dashboard-variant'), ('view-dashboard-variant-outline', 'view-dashboard-variant-outline'), ('view-day', 'view-day'), ('view-day-outline', 'view-day-outline'), ('view-gallery', 'view-gallery'), ('view-gallery-outline', 'view-gallery-outline'), ('view-grid', 'view-grid'), ('view-grid-outline', 'view-grid-outline'), ('view-grid-plus', 'view-grid-plus'), ('view-grid-plus-outline', 'view-grid-plus-outline'), ('view-headline', 'view-headline'), ('view-list', 'view-list'), ('view-list-outline', 'view-list-outline'), ('view-module', 'view-module'), ('view-module-outline', 'view-module-outline'), ('view-parallel', 'view-parallel'), ('view-parallel-outline', 'view-parallel-outline'), ('view-quilt', 'view-quilt'), ('view-quilt-outline', 'view-quilt-outline'), ('view-sequential', 'view-sequential'), ('view-sequential-outline', 'view-sequential-outline'), ('view-split-horizontal', 'view-split-horizontal'), ('view-split-vertical', 'view-split-vertical'), ('view-stream', 'view-stream'), ('view-stream-outline', 'view-stream-outline'), ('view-week', 'view-week'), ('view-week-outline', 'view-week-outline'), ('vimeo', 'vimeo'), ('vine', 'vine'), ('violin', 'violin'), ('virtual-reality', 'virtual-reality'), ('virus', 'virus'), ('virus-off', 'virus-off'), ('virus-off-outline', 'virus-off-outline'), ('virus-outline', 'virus-outline'), ('vk', 'vk'), ('vk-box', 'vk-box'), ('vk-circle', 'vk-circle'), ('vlc', 'vlc'), ('voicemail', 'voicemail'), ('volcano', 'volcano'), ('volcano-outline', 'volcano-outline'), ('volleyball', 'volleyball'), ('volume', 'volume'), ('volume-equal', 'volume-equal'), ('volume-high', 'volume-high'), ('volume-low', 'volume-low'), ('volume-medium', 'volume-medium'), ('volume-minus', 'volume-minus'), ('volume-mute', 'volume-mute'), ('volume-off', 'volume-off'), ('volume-plus', 'volume-plus'), ('volume-source', 'volume-source'), ('volume-variant-off', 'volume-variant-off'), ('volume-vibrate', 'volume-vibrate'), ('vote', 'vote'), ('vote-outline', 'vote-outline'), ('vpn', 'vpn'), ('vuejs', 'vuejs'), ('vuetify', 'vuetify'), ('walk', 'walk'), ('wall', 'wall'), ('wall-fire', 'wall-fire'), ('wall-sconce', 'wall-sconce'), ('wall-sconce-flat', 'wall-sconce-flat'), ('wall-sconce-flat-outline', 'wall-sconce-flat-outline'), ('wall-sconce-flat-variant', 'wall-sconce-flat-variant'), ('wall-sconce-flat-variant-outline', 'wall-sconce-flat-variant-outline'), ('wall-sconce-outline', 'wall-sconce-outline'), ('wall-sconce-round', 'wall-sconce-round'), ('wall-sconce-round-outline', 'wall-sconce-round-outline'), ('wall-sconce-round-variant', 'wall-sconce-round-variant'), ('wall-sconce-round-variant-outline', 'wall-sconce-round-variant-outline'), ('wall-sconce-variant', 'wall-sconce-variant'), ('wallet', 'wallet'), ('wallet-giftcard', 'wallet-giftcard'), ('wallet-membership', 'wallet-membership'), ('wallet-outline', 'wallet-outline'), ('wallet-plus', 'wallet-plus'), ('wallet-plus-outline', 'wallet-plus-outline'), ('wallet-travel', 'wallet-travel'), ('wallpaper', 'wallpaper'), ('wan', 'wan'), ('wardrobe', 'wardrobe'), ('wardrobe-outline', 'wardrobe-outline'), ('warehouse', 'warehouse'), ('washing-machine', 'washing-machine'), ('washing-machine-alert', 'washing-machine-alert'), ('washing-machine-off', 'washing-machine-off'), ('watch', 'watch'), ('watch-export', 'watch-export'), ('watch-export-variant', 'watch-export-variant'), ('watch-import', 'watch-import'), ('watch-import-variant', 'watch-import-variant'), ('watch-variant', 'watch-variant'), ('watch-vibrate', 'watch-vibrate'), ('watch-vibrate-off', 'watch-vibrate-off'), ('water', 'water'), ('water-alert', 'water-alert'), ('water-alert-outline', 'water-alert-outline'), ('water-boiler', 'water-boiler'), ('water-boiler-alert', 'water-boiler-alert'), ('water-boiler-auto', 'water-boiler-auto'), ('water-boiler-off', 'water-boiler-off'), ('water-check', 'water-check'), ('water-check-outline', 'water-check-outline'), ('water-circle', 'water-circle'), ('water-minus', 'water-minus'), ('water-minus-outline', 'water-minus-outline'), ('water-off', 'water-off'), ('water-off-outline', 'water-off-outline'), ('water-opacity', 'water-opacity'), ('water-outline', 'water-outline'), ('water-percent', 'water-percent'), ('water-percent-alert', 'water-percent-alert'), ('water-plus', 'water-plus'), ('water-plus-outline', 'water-plus-outline'), ('water-polo', 'water-polo'), ('water-pump', 'water-pump'), ('water-pump-off', 'water-pump-off'), ('water-remove', 'water-remove'), ('water-remove-outline', 'water-remove-outline'), ('water-sync', 'water-sync'), ('water-thermometer', 'water-thermometer'), ('water-thermometer-outline', 'water-thermometer-outline'), ('water-well', 'water-well'), ('water-well-outline', 'water-well-outline'), ('waterfall', 'waterfall'), ('watering-can', 'watering-can'), ('watering-can-outline', 'watering-can-outline'), ('watermark', 'watermark'), ('wave', 'wave'), ('waveform', 'waveform'), ('waves', 'waves'), ('waves-arrow-left', 'waves-arrow-left'), ('waves-arrow-right', 'waves-arrow-right'), ('waves-arrow-up', 'waves-arrow-up'), ('waze', 'waze'), ('weather-cloudy', 'weather-cloudy'), ('weather-cloudy-alert', 'weather-cloudy-alert'), ('weather-cloudy-arrow-right', 'weather-cloudy-arrow-right'), ('weather-cloudy-clock', 'weather-cloudy-clock'), ('weather-dust', 'weather-dust'), ('weather-fog', 'weather-fog'), ('weather-hail', 'weather-hail'), ('weather-hazy', 'weather-hazy'), ('weather-hurricane', 'weather-hurricane'), ('weather-lightning', 'weather-lightning'), ('weather-lightning-rainy', 'weather-lightning-rainy'), ('weather-night', 'weather-night'), ('weather-night-partly-cloudy', 'weather-night-partly-cloudy'), ('weather-partly-cloudy', 'weather-partly-cloudy'), ('weather-partly-lightning', 'weather-partly-lightning'), ('weather-partly-rainy', 'weather-partly-rainy'), ('weather-partly-snowy', 'weather-partly-snowy'), ('weather-partly-snowy-rainy', 'weather-partly-snowy-rainy'), ('weather-pouring', 'weather-pouring'), ('weather-rainy', 'weather-rainy'), ('weather-snowy', 'weather-snowy'), ('weather-snowy-heavy', 'weather-snowy-heavy'), ('weather-snowy-rainy', 'weather-snowy-rainy'), ('weather-sunny', 'weather-sunny'), ('weather-sunny-alert', 'weather-sunny-alert'), ('weather-sunny-off', 'weather-sunny-off'), ('weather-sunset', 'weather-sunset'), ('weather-sunset-down', 'weather-sunset-down'), ('weather-sunset-up', 'weather-sunset-up'), ('weather-tornado', 'weather-tornado'), ('weather-windy', 'weather-windy'), ('weather-windy-variant', 'weather-windy-variant'), ('web', 'web'), ('web-box', 'web-box'), ('web-cancel', 'web-cancel'), ('web-check', 'web-check'), ('web-clock', 'web-clock'), ('web-minus', 'web-minus'), ('web-off', 'web-off'), ('web-plus', 'web-plus'), ('web-refresh', 'web-refresh'), ('web-remove', 'web-remove'), ('web-sync', 'web-sync'), ('webcam', 'webcam'), ('webcam-off', 'webcam-off'), ('webhook', 'webhook'), ('webpack', 'webpack'), ('webrtc', 'webrtc'), ('wechat', 'wechat'), ('weight', 'weight'), ('weight-gram', 'weight-gram'), ('weight-kilogram', 'weight-kilogram'), ('weight-lifter', 'weight-lifter'), ('weight-pound', 'weight-pound'), ('whatsapp', 'whatsapp'), ('wheel-barrow', 'wheel-barrow'), ('wheelchair', 'wheelchair'), ('wheelchair-accessibility', 'wheelchair-accessibility'), ('whistle', 'whistle'), ('whistle-outline', 'whistle-outline'), ('white-balance-auto', 'white-balance-auto'), ('white-balance-incandescent', 'white-balance-incandescent'), ('white-balance-iridescent', 'white-balance-iridescent'), ('white-balance-sunny', 'white-balance-sunny'), ('widgets', 'widgets'), ('widgets-outline', 'widgets-outline'), ('wifi', 'wifi'), ('wifi-alert', 'wifi-alert'), ('wifi-arrow-down', 'wifi-arrow-down'), ('wifi-arrow-left', 'wifi-arrow-left'), ('wifi-arrow-left-right', 'wifi-arrow-left-right'), ('wifi-arrow-right', 'wifi-arrow-right'), ('wifi-arrow-up', 'wifi-arrow-up'), ('wifi-arrow-up-down', 'wifi-arrow-up-down'), ('wifi-cancel', 'wifi-cancel'), ('wifi-check', 'wifi-check'), ('wifi-cog', 'wifi-cog'), ('wifi-lock', 'wifi-lock'), ('wifi-lock-open', 'wifi-lock-open'), ('wifi-marker', 'wifi-marker'), ('wifi-minus', 'wifi-minus'), ('wifi-off', 'wifi-off'), ('wifi-plus', 'wifi-plus'), ('wifi-refresh', 'wifi-refresh'), ('wifi-remove', 'wifi-remove'), ('wifi-settings', 'wifi-settings'), ('wifi-star', 'wifi-star'), ('wifi-strength-1', 'wifi-strength-1'), ('wifi-strength-1-alert', 'wifi-strength-1-alert'), ('wifi-strength-1-lock', 'wifi-strength-1-lock'), ('wifi-strength-1-lock-open', 'wifi-strength-1-lock-open'), ('wifi-strength-2', 'wifi-strength-2'), ('wifi-strength-2-alert', 'wifi-strength-2-alert'), ('wifi-strength-2-lock', 'wifi-strength-2-lock'), ('wifi-strength-2-lock-open', 'wifi-strength-2-lock-open'), ('wifi-strength-3', 'wifi-strength-3'), ('wifi-strength-3-alert', 'wifi-strength-3-alert'), ('wifi-strength-3-lock', 'wifi-strength-3-lock'), ('wifi-strength-3-lock-open', 'wifi-strength-3-lock-open'), ('wifi-strength-4', 'wifi-strength-4'), ('wifi-strength-4-alert', 'wifi-strength-4-alert'), ('wifi-strength-4-lock', 'wifi-strength-4-lock'), ('wifi-strength-4-lock-open', 'wifi-strength-4-lock-open'), ('wifi-strength-alert-outline', 'wifi-strength-alert-outline'), ('wifi-strength-lock-open-outline', 'wifi-strength-lock-open-outline'), ('wifi-strength-lock-outline', 'wifi-strength-lock-outline'), ('wifi-strength-off', 'wifi-strength-off'), ('wifi-strength-off-outline', 'wifi-strength-off-outline'), ('wifi-strength-outline', 'wifi-strength-outline'), ('wifi-sync', 'wifi-sync'), ('wikipedia', 'wikipedia'), ('wind-power', 'wind-power'), ('wind-power-outline', 'wind-power-outline'), ('wind-turbine', 'wind-turbine'), ('wind-turbine-alert', 'wind-turbine-alert'), ('wind-turbine-check', 'wind-turbine-check'), ('window-close', 'window-close'), ('window-closed', 'window-closed'), ('window-closed-variant', 'window-closed-variant'), ('window-maximize', 'window-maximize'), ('window-minimize', 'window-minimize'), ('window-open', 'window-open'), ('window-open-variant', 'window-open-variant'), ('window-restore', 'window-restore'), ('window-shutter', 'window-shutter'), ('window-shutter-alert', 'window-shutter-alert'), ('window-shutter-auto', 'window-shutter-auto'), ('window-shutter-cog', 'window-shutter-cog'), ('window-shutter-open', 'window-shutter-open'), ('window-shutter-settings', 'window-shutter-settings'), ('windsock', 'windsock'), ('wiper', 'wiper'), ('wiper-wash', 'wiper-wash'), ('wiper-wash-alert', 'wiper-wash-alert'), ('wizard-hat', 'wizard-hat'), ('wordpress', 'wordpress'), ('wrap', 'wrap'), ('wrap-disabled', 'wrap-disabled'), ('wrench', 'wrench'), ('wrench-check', 'wrench-check'), ('wrench-check-outline', 'wrench-check-outline'), ('wrench-clock', 'wrench-clock'), ('wrench-clock-outline', 'wrench-clock-outline'), ('wrench-cog', 'wrench-cog'), ('wrench-cog-outline', 'wrench-cog-outline'), ('wrench-outline', 'wrench-outline'), ('wunderlist', 'wunderlist'), ('xamarin', 'xamarin'), ('xamarin-outline', 'xamarin-outline'), ('xda', 'xda'), ('xing', 'xing'), ('xing-circle', 'xing-circle'), ('xml', 'xml'), ('xmpp', 'xmpp'), ('y-combinator', 'y-combinator'), ('yahoo', 'yahoo'), ('yammer', 'yammer'), ('yeast', 'yeast'), ('yelp', 'yelp'), ('yin-yang', 'yin-yang'), ('yoga', 'yoga'), ('youtube', 'youtube'), ('youtube-gaming', 'youtube-gaming'), ('youtube-studio', 'youtube-studio'), ('youtube-subscription', 'youtube-subscription'), ('youtube-tv', 'youtube-tv'), ('yurt', 'yurt'), ('z-wave', 'z-wave'), ('zend', 'zend'), ('zigbee', 'zigbee'), ('zip-box', 'zip-box'), ('zip-box-outline', 'zip-box-outline'), ('zip-disk', 'zip-disk'), ('zodiac-aquarius', 'zodiac-aquarius'), ('zodiac-aries', 'zodiac-aries'), ('zodiac-cancer', 'zodiac-cancer'), ('zodiac-capricorn', 'zodiac-capricorn'), ('zodiac-gemini', 'zodiac-gemini'), ('zodiac-leo', 'zodiac-leo'), ('zodiac-libra', 'zodiac-libra'), ('zodiac-pisces', 'zodiac-pisces'), ('zodiac-sagittarius', 'zodiac-sagittarius'), ('zodiac-scorpio', 'zodiac-scorpio'), ('zodiac-taurus', 'zodiac-taurus'), ('zodiac-virgo', 'zodiac-virgo')], default='information-outline', max_length=50, verbose_name='Icon'), + ), + ] diff --git a/aleksis/core/migrations/0047_add_room_model.py b/aleksis/core/migrations/0047_add_room_model.py new file mode 100644 index 0000000000000000000000000000000000000000..36464dd97e3757ca97d22c7c7957fbfa141f75b8 --- /dev/null +++ b/aleksis/core/migrations/0047_add_room_model.py @@ -0,0 +1,65 @@ +# Generated by Django 3.2.15 on 2022-11-20 14:20 + +from django.apps import apps +import django.contrib.sites.managers +from django.db import migrations, models +from django.db.utils import ProgrammingError +import django.db.models.deletion +import django.utils.timezone +import oauth2_provider.generators +import oauth2_provider.models +from psycopg2.errors import UndefinedTable + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0002_alter_domain_unique'), + ('core', '0046_notification_create_field_icon'), + ] + + # This migration must run after Chronos' migration 1 through 12, but before + # 13. That's because we are in fact moving a model, and we need to make sure + # that this migration runs at the right time. + if "chronos" in apps.app_configs: + recorder = migrations.recorder + applied = False + try: + applied = recorder.MigrationRecorder.Migration.objects.filter(app="core", name="0046_add_room_model").exists() + except ProgrammingError: + applied = False + if not applied: + dependencies.append(('chronos', '0012_add_supervision_global_permission')) + + operations = [ + migrations.CreateModel( + name='Room', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', models.JSONField(default=dict, editable=False)), + ('short_name', models.CharField(max_length=255, verbose_name='Short name')), + ('name', models.CharField(max_length=255, verbose_name='Long name')), + ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), + ], + options={ + 'verbose_name': 'Room', + 'verbose_name_plural': 'Rooms', + 'ordering': ['name', 'short_name'], + 'permissions': (('view_room_timetable', 'Can view room timetable'),), + }, + managers=[ + ('objects', django.contrib.sites.managers.CurrentSiteManager()), + ], + ), + migrations.AddConstraint( + model_name='room', + constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_room_short_name_per_site'), + ), + # Migrate data from Chronos table; deletion will be handled by Chronos + migrations.RunSQL( + """ + -- Copy rooms from chronos if table exists + DO $$BEGIN INSERT INTO core_room SELECT * FROM chronos_room; EXCEPTION WHEN undefined_table THEN NULL; END$$; + """ + ), + ] diff --git a/aleksis/core/migrations/0048_delete_personalicalurl.py b/aleksis/core/migrations/0048_delete_personalicalurl.py new file mode 100644 index 0000000000000000000000000000000000000000..5af5f16294cfe5dfc58231a0c0483adac77fac20 --- /dev/null +++ b/aleksis/core/migrations/0048_delete_personalicalurl.py @@ -0,0 +1,15068 @@ +# Generated by Django 4.1.5 on 2023-01-18 15:42 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import oauth2_provider.generators +import oauth2_provider.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("core", "0047_add_room_model"), + ] + + operations = [ + migrations.AlterField( + model_name="custommenuitem", + name="icon", + field=models.CharField( + blank=True, + choices=[ + ("ab-testing", "ab-testing"), + ("abacus", "abacus"), + ("abjad-arabic", "abjad-arabic"), + ("abjad-hebrew", "abjad-hebrew"), + ("abugida-devanagari", "abugida-devanagari"), + ("abugida-thai", "abugida-thai"), + ("access-point", "access-point"), + ("access-point-check", "access-point-check"), + ("access-point-minus", "access-point-minus"), + ("access-point-network", "access-point-network"), + ("access-point-network-off", "access-point-network-off"), + ("access-point-off", "access-point-off"), + ("access-point-plus", "access-point-plus"), + ("access-point-remove", "access-point-remove"), + ("account", "account"), + ("account-alert", "account-alert"), + ("account-alert-outline", "account-alert-outline"), + ("account-arrow-down", "account-arrow-down"), + ("account-arrow-down-outline", "account-arrow-down-outline"), + ("account-arrow-left", "account-arrow-left"), + ("account-arrow-left-outline", "account-arrow-left-outline"), + ("account-arrow-right", "account-arrow-right"), + ("account-arrow-right-outline", "account-arrow-right-outline"), + ("account-arrow-up", "account-arrow-up"), + ("account-arrow-up-outline", "account-arrow-up-outline"), + ("account-badge", "account-badge"), + ("account-badge-outline", "account-badge-outline"), + ("account-box", "account-box"), + ("account-box-multiple", "account-box-multiple"), + ("account-box-multiple-outline", "account-box-multiple-outline"), + ("account-box-outline", "account-box-outline"), + ("account-cancel", "account-cancel"), + ("account-cancel-outline", "account-cancel-outline"), + ("account-card", "account-card"), + ("account-card-outline", "account-card-outline"), + ("account-cash", "account-cash"), + ("account-cash-outline", "account-cash-outline"), + ("account-check", "account-check"), + ("account-check-outline", "account-check-outline"), + ("account-child", "account-child"), + ("account-child-circle", "account-child-circle"), + ("account-child-outline", "account-child-outline"), + ("account-circle", "account-circle"), + ("account-circle-outline", "account-circle-outline"), + ("account-clock", "account-clock"), + ("account-clock-outline", "account-clock-outline"), + ("account-cog", "account-cog"), + ("account-cog-outline", "account-cog-outline"), + ("account-convert", "account-convert"), + ("account-convert-outline", "account-convert-outline"), + ("account-cowboy-hat", "account-cowboy-hat"), + ("account-cowboy-hat-outline", "account-cowboy-hat-outline"), + ("account-credit-card", "account-credit-card"), + ("account-credit-card-outline", "account-credit-card-outline"), + ("account-details", "account-details"), + ("account-details-outline", "account-details-outline"), + ("account-edit", "account-edit"), + ("account-edit-outline", "account-edit-outline"), + ("account-eye", "account-eye"), + ("account-eye-outline", "account-eye-outline"), + ("account-filter", "account-filter"), + ("account-filter-outline", "account-filter-outline"), + ("account-group", "account-group"), + ("account-group-outline", "account-group-outline"), + ("account-hard-hat", "account-hard-hat"), + ("account-hard-hat-outline", "account-hard-hat-outline"), + ("account-heart", "account-heart"), + ("account-heart-outline", "account-heart-outline"), + ("account-injury", "account-injury"), + ("account-injury-outline", "account-injury-outline"), + ("account-key", "account-key"), + ("account-key-outline", "account-key-outline"), + ("account-lock", "account-lock"), + ("account-lock-open", "account-lock-open"), + ("account-lock-open-outline", "account-lock-open-outline"), + ("account-lock-outline", "account-lock-outline"), + ("account-minus", "account-minus"), + ("account-minus-outline", "account-minus-outline"), + ("account-multiple", "account-multiple"), + ("account-multiple-check", "account-multiple-check"), + ("account-multiple-check-outline", "account-multiple-check-outline"), + ("account-multiple-minus", "account-multiple-minus"), + ("account-multiple-minus-outline", "account-multiple-minus-outline"), + ("account-multiple-outline", "account-multiple-outline"), + ("account-multiple-plus", "account-multiple-plus"), + ("account-multiple-plus-outline", "account-multiple-plus-outline"), + ("account-multiple-remove", "account-multiple-remove"), + ("account-multiple-remove-outline", "account-multiple-remove-outline"), + ("account-music", "account-music"), + ("account-music-outline", "account-music-outline"), + ("account-network", "account-network"), + ("account-network-off", "account-network-off"), + ("account-network-off-outline", "account-network-off-outline"), + ("account-network-outline", "account-network-outline"), + ("account-off", "account-off"), + ("account-off-outline", "account-off-outline"), + ("account-outline", "account-outline"), + ("account-plus", "account-plus"), + ("account-plus-outline", "account-plus-outline"), + ("account-question", "account-question"), + ("account-question-outline", "account-question-outline"), + ("account-reactivate", "account-reactivate"), + ("account-reactivate-outline", "account-reactivate-outline"), + ("account-remove", "account-remove"), + ("account-remove-outline", "account-remove-outline"), + ("account-school", "account-school"), + ("account-school-outline", "account-school-outline"), + ("account-search", "account-search"), + ("account-search-outline", "account-search-outline"), + ("account-settings", "account-settings"), + ("account-settings-outline", "account-settings-outline"), + ("account-settings-variant", "account-settings-variant"), + ("account-star", "account-star"), + ("account-star-outline", "account-star-outline"), + ("account-supervisor", "account-supervisor"), + ("account-supervisor-circle", "account-supervisor-circle"), + ("account-supervisor-circle-outline", "account-supervisor-circle-outline"), + ("account-supervisor-outline", "account-supervisor-outline"), + ("account-switch", "account-switch"), + ("account-switch-outline", "account-switch-outline"), + ("account-sync", "account-sync"), + ("account-sync-outline", "account-sync-outline"), + ("account-tag", "account-tag"), + ("account-tag-outline", "account-tag-outline"), + ("account-tie", "account-tie"), + ("account-tie-hat", "account-tie-hat"), + ("account-tie-hat-outline", "account-tie-hat-outline"), + ("account-tie-outline", "account-tie-outline"), + ("account-tie-voice", "account-tie-voice"), + ("account-tie-voice-off", "account-tie-voice-off"), + ("account-tie-voice-off-outline", "account-tie-voice-off-outline"), + ("account-tie-voice-outline", "account-tie-voice-outline"), + ("account-tie-woman", "account-tie-woman"), + ("account-voice", "account-voice"), + ("account-voice-off", "account-voice-off"), + ("account-wrench", "account-wrench"), + ("account-wrench-outline", "account-wrench-outline"), + ("accusoft", "accusoft"), + ("ad-choices", "ad-choices"), + ("adchoices", "adchoices"), + ("adjust", "adjust"), + ("adobe", "adobe"), + ("advertisements", "advertisements"), + ("advertisements-off", "advertisements-off"), + ("air-conditioner", "air-conditioner"), + ("air-filter", "air-filter"), + ("air-horn", "air-horn"), + ("air-humidifier", "air-humidifier"), + ("air-humidifier-off", "air-humidifier-off"), + ("air-purifier", "air-purifier"), + ("air-purifier-off", "air-purifier-off"), + ("airbag", "airbag"), + ("airballoon", "airballoon"), + ("airballoon-outline", "airballoon-outline"), + ("airplane", "airplane"), + ("airplane-alert", "airplane-alert"), + ("airplane-check", "airplane-check"), + ("airplane-clock", "airplane-clock"), + ("airplane-cog", "airplane-cog"), + ("airplane-edit", "airplane-edit"), + ("airplane-landing", "airplane-landing"), + ("airplane-marker", "airplane-marker"), + ("airplane-minus", "airplane-minus"), + ("airplane-off", "airplane-off"), + ("airplane-plus", "airplane-plus"), + ("airplane-remove", "airplane-remove"), + ("airplane-search", "airplane-search"), + ("airplane-settings", "airplane-settings"), + ("airplane-takeoff", "airplane-takeoff"), + ("airport", "airport"), + ("alarm", "alarm"), + ("alarm-bell", "alarm-bell"), + ("alarm-check", "alarm-check"), + ("alarm-light", "alarm-light"), + ("alarm-light-off", "alarm-light-off"), + ("alarm-light-off-outline", "alarm-light-off-outline"), + ("alarm-light-outline", "alarm-light-outline"), + ("alarm-multiple", "alarm-multiple"), + ("alarm-note", "alarm-note"), + ("alarm-note-off", "alarm-note-off"), + ("alarm-off", "alarm-off"), + ("alarm-panel", "alarm-panel"), + ("alarm-panel-outline", "alarm-panel-outline"), + ("alarm-plus", "alarm-plus"), + ("alarm-snooze", "alarm-snooze"), + ("album", "album"), + ("alert", "alert"), + ("alert-box", "alert-box"), + ("alert-box-outline", "alert-box-outline"), + ("alert-circle", "alert-circle"), + ("alert-circle-check", "alert-circle-check"), + ("alert-circle-check-outline", "alert-circle-check-outline"), + ("alert-circle-outline", "alert-circle-outline"), + ("alert-decagram", "alert-decagram"), + ("alert-decagram-outline", "alert-decagram-outline"), + ("alert-minus", "alert-minus"), + ("alert-minus-outline", "alert-minus-outline"), + ("alert-octagon", "alert-octagon"), + ("alert-octagon-outline", "alert-octagon-outline"), + ("alert-octagram", "alert-octagram"), + ("alert-octagram-outline", "alert-octagram-outline"), + ("alert-outline", "alert-outline"), + ("alert-plus", "alert-plus"), + ("alert-plus-outline", "alert-plus-outline"), + ("alert-remove", "alert-remove"), + ("alert-remove-outline", "alert-remove-outline"), + ("alert-rhombus", "alert-rhombus"), + ("alert-rhombus-outline", "alert-rhombus-outline"), + ("alien", "alien"), + ("alien-outline", "alien-outline"), + ("align-horizontal-center", "align-horizontal-center"), + ("align-horizontal-distribute", "align-horizontal-distribute"), + ("align-horizontal-left", "align-horizontal-left"), + ("align-horizontal-right", "align-horizontal-right"), + ("align-vertical-bottom", "align-vertical-bottom"), + ("align-vertical-center", "align-vertical-center"), + ("align-vertical-distribute", "align-vertical-distribute"), + ("align-vertical-top", "align-vertical-top"), + ("all-inclusive", "all-inclusive"), + ("all-inclusive-box", "all-inclusive-box"), + ("all-inclusive-box-outline", "all-inclusive-box-outline"), + ("allergy", "allergy"), + ("allo", "allo"), + ("alpha", "alpha"), + ("alpha-a", "alpha-a"), + ("alpha-a-box", "alpha-a-box"), + ("alpha-a-box-outline", "alpha-a-box-outline"), + ("alpha-a-circle", "alpha-a-circle"), + ("alpha-a-circle-outline", "alpha-a-circle-outline"), + ("alpha-b", "alpha-b"), + ("alpha-b-box", "alpha-b-box"), + ("alpha-b-box-outline", "alpha-b-box-outline"), + ("alpha-b-circle", "alpha-b-circle"), + ("alpha-b-circle-outline", "alpha-b-circle-outline"), + ("alpha-c", "alpha-c"), + ("alpha-c-box", "alpha-c-box"), + ("alpha-c-box-outline", "alpha-c-box-outline"), + ("alpha-c-circle", "alpha-c-circle"), + ("alpha-c-circle-outline", "alpha-c-circle-outline"), + ("alpha-d", "alpha-d"), + ("alpha-d-box", "alpha-d-box"), + ("alpha-d-box-outline", "alpha-d-box-outline"), + ("alpha-d-circle", "alpha-d-circle"), + ("alpha-d-circle-outline", "alpha-d-circle-outline"), + ("alpha-e", "alpha-e"), + ("alpha-e-box", "alpha-e-box"), + ("alpha-e-box-outline", "alpha-e-box-outline"), + ("alpha-e-circle", "alpha-e-circle"), + ("alpha-e-circle-outline", "alpha-e-circle-outline"), + ("alpha-f", "alpha-f"), + ("alpha-f-box", "alpha-f-box"), + ("alpha-f-box-outline", "alpha-f-box-outline"), + ("alpha-f-circle", "alpha-f-circle"), + ("alpha-f-circle-outline", "alpha-f-circle-outline"), + ("alpha-g", "alpha-g"), + ("alpha-g-box", "alpha-g-box"), + ("alpha-g-box-outline", "alpha-g-box-outline"), + ("alpha-g-circle", "alpha-g-circle"), + ("alpha-g-circle-outline", "alpha-g-circle-outline"), + ("alpha-h", "alpha-h"), + ("alpha-h-box", "alpha-h-box"), + ("alpha-h-box-outline", "alpha-h-box-outline"), + ("alpha-h-circle", "alpha-h-circle"), + ("alpha-h-circle-outline", "alpha-h-circle-outline"), + ("alpha-i", "alpha-i"), + ("alpha-i-box", "alpha-i-box"), + ("alpha-i-box-outline", "alpha-i-box-outline"), + ("alpha-i-circle", "alpha-i-circle"), + ("alpha-i-circle-outline", "alpha-i-circle-outline"), + ("alpha-j", "alpha-j"), + ("alpha-j-box", "alpha-j-box"), + ("alpha-j-box-outline", "alpha-j-box-outline"), + ("alpha-j-circle", "alpha-j-circle"), + ("alpha-j-circle-outline", "alpha-j-circle-outline"), + ("alpha-k", "alpha-k"), + ("alpha-k-box", "alpha-k-box"), + ("alpha-k-box-outline", "alpha-k-box-outline"), + ("alpha-k-circle", "alpha-k-circle"), + ("alpha-k-circle-outline", "alpha-k-circle-outline"), + ("alpha-l", "alpha-l"), + ("alpha-l-box", "alpha-l-box"), + ("alpha-l-box-outline", "alpha-l-box-outline"), + ("alpha-l-circle", "alpha-l-circle"), + ("alpha-l-circle-outline", "alpha-l-circle-outline"), + ("alpha-m", "alpha-m"), + ("alpha-m-box", "alpha-m-box"), + ("alpha-m-box-outline", "alpha-m-box-outline"), + ("alpha-m-circle", "alpha-m-circle"), + ("alpha-m-circle-outline", "alpha-m-circle-outline"), + ("alpha-n", "alpha-n"), + ("alpha-n-box", "alpha-n-box"), + ("alpha-n-box-outline", "alpha-n-box-outline"), + ("alpha-n-circle", "alpha-n-circle"), + ("alpha-n-circle-outline", "alpha-n-circle-outline"), + ("alpha-o", "alpha-o"), + ("alpha-o-box", "alpha-o-box"), + ("alpha-o-box-outline", "alpha-o-box-outline"), + ("alpha-o-circle", "alpha-o-circle"), + ("alpha-o-circle-outline", "alpha-o-circle-outline"), + ("alpha-p", "alpha-p"), + ("alpha-p-box", "alpha-p-box"), + ("alpha-p-box-outline", "alpha-p-box-outline"), + ("alpha-p-circle", "alpha-p-circle"), + ("alpha-p-circle-outline", "alpha-p-circle-outline"), + ("alpha-q", "alpha-q"), + ("alpha-q-box", "alpha-q-box"), + ("alpha-q-box-outline", "alpha-q-box-outline"), + ("alpha-q-circle", "alpha-q-circle"), + ("alpha-q-circle-outline", "alpha-q-circle-outline"), + ("alpha-r", "alpha-r"), + ("alpha-r-box", "alpha-r-box"), + ("alpha-r-box-outline", "alpha-r-box-outline"), + ("alpha-r-circle", "alpha-r-circle"), + ("alpha-r-circle-outline", "alpha-r-circle-outline"), + ("alpha-s", "alpha-s"), + ("alpha-s-box", "alpha-s-box"), + ("alpha-s-box-outline", "alpha-s-box-outline"), + ("alpha-s-circle", "alpha-s-circle"), + ("alpha-s-circle-outline", "alpha-s-circle-outline"), + ("alpha-t", "alpha-t"), + ("alpha-t-box", "alpha-t-box"), + ("alpha-t-box-outline", "alpha-t-box-outline"), + ("alpha-t-circle", "alpha-t-circle"), + ("alpha-t-circle-outline", "alpha-t-circle-outline"), + ("alpha-u", "alpha-u"), + ("alpha-u-box", "alpha-u-box"), + ("alpha-u-box-outline", "alpha-u-box-outline"), + ("alpha-u-circle", "alpha-u-circle"), + ("alpha-u-circle-outline", "alpha-u-circle-outline"), + ("alpha-v", "alpha-v"), + ("alpha-v-box", "alpha-v-box"), + ("alpha-v-box-outline", "alpha-v-box-outline"), + ("alpha-v-circle", "alpha-v-circle"), + ("alpha-v-circle-outline", "alpha-v-circle-outline"), + ("alpha-w", "alpha-w"), + ("alpha-w-box", "alpha-w-box"), + ("alpha-w-box-outline", "alpha-w-box-outline"), + ("alpha-w-circle", "alpha-w-circle"), + ("alpha-w-circle-outline", "alpha-w-circle-outline"), + ("alpha-x", "alpha-x"), + ("alpha-x-box", "alpha-x-box"), + ("alpha-x-box-outline", "alpha-x-box-outline"), + ("alpha-x-circle", "alpha-x-circle"), + ("alpha-x-circle-outline", "alpha-x-circle-outline"), + ("alpha-y", "alpha-y"), + ("alpha-y-box", "alpha-y-box"), + ("alpha-y-box-outline", "alpha-y-box-outline"), + ("alpha-y-circle", "alpha-y-circle"), + ("alpha-y-circle-outline", "alpha-y-circle-outline"), + ("alpha-z", "alpha-z"), + ("alpha-z-box", "alpha-z-box"), + ("alpha-z-box-outline", "alpha-z-box-outline"), + ("alpha-z-circle", "alpha-z-circle"), + ("alpha-z-circle-outline", "alpha-z-circle-outline"), + ("alphabet-aurebesh", "alphabet-aurebesh"), + ("alphabet-cyrillic", "alphabet-cyrillic"), + ("alphabet-greek", "alphabet-greek"), + ("alphabet-latin", "alphabet-latin"), + ("alphabet-piqad", "alphabet-piqad"), + ("alphabet-tengwar", "alphabet-tengwar"), + ("alphabetical", "alphabetical"), + ("alphabetical-off", "alphabetical-off"), + ("alphabetical-variant", "alphabetical-variant"), + ("alphabetical-variant-off", "alphabetical-variant-off"), + ("altimeter", "altimeter"), + ("amazon", "amazon"), + ("amazon-alexa", "amazon-alexa"), + ("amazon-drive", "amazon-drive"), + ("ambulance", "ambulance"), + ("ammunition", "ammunition"), + ("ampersand", "ampersand"), + ("amplifier", "amplifier"), + ("amplifier-off", "amplifier-off"), + ("anchor", "anchor"), + ("android", "android"), + ("android-auto", "android-auto"), + ("android-debug-bridge", "android-debug-bridge"), + ("android-head", "android-head"), + ("android-messages", "android-messages"), + ("android-studio", "android-studio"), + ("angle-acute", "angle-acute"), + ("angle-obtuse", "angle-obtuse"), + ("angle-right", "angle-right"), + ("angular", "angular"), + ("angularjs", "angularjs"), + ("animation", "animation"), + ("animation-outline", "animation-outline"), + ("animation-play", "animation-play"), + ("animation-play-outline", "animation-play-outline"), + ("ansible", "ansible"), + ("antenna", "antenna"), + ("anvil", "anvil"), + ("apache-kafka", "apache-kafka"), + ("api", "api"), + ("api-off", "api-off"), + ("apple", "apple"), + ("apple-finder", "apple-finder"), + ("apple-icloud", "apple-icloud"), + ("apple-ios", "apple-ios"), + ("apple-keyboard-caps", "apple-keyboard-caps"), + ("apple-keyboard-command", "apple-keyboard-command"), + ("apple-keyboard-control", "apple-keyboard-control"), + ("apple-keyboard-option", "apple-keyboard-option"), + ("apple-keyboard-shift", "apple-keyboard-shift"), + ("apple-safari", "apple-safari"), + ("application", "application"), + ("application-array", "application-array"), + ("application-array-outline", "application-array-outline"), + ("application-braces", "application-braces"), + ("application-braces-outline", "application-braces-outline"), + ("application-brackets", "application-brackets"), + ("application-brackets-outline", "application-brackets-outline"), + ("application-cog", "application-cog"), + ("application-cog-outline", "application-cog-outline"), + ("application-edit", "application-edit"), + ("application-edit-outline", "application-edit-outline"), + ("application-export", "application-export"), + ("application-import", "application-import"), + ("application-outline", "application-outline"), + ("application-parentheses", "application-parentheses"), + ("application-parentheses-outline", "application-parentheses-outline"), + ("application-settings", "application-settings"), + ("application-settings-outline", "application-settings-outline"), + ("application-variable", "application-variable"), + ("application-variable-outline", "application-variable-outline"), + ("appnet", "appnet"), + ("approximately-equal", "approximately-equal"), + ("approximately-equal-box", "approximately-equal-box"), + ("apps", "apps"), + ("apps-box", "apps-box"), + ("arch", "arch"), + ("archive", "archive"), + ("archive-alert", "archive-alert"), + ("archive-alert-outline", "archive-alert-outline"), + ("archive-arrow-down", "archive-arrow-down"), + ("archive-arrow-down-outline", "archive-arrow-down-outline"), + ("archive-arrow-up", "archive-arrow-up"), + ("archive-arrow-up-outline", "archive-arrow-up-outline"), + ("archive-cancel", "archive-cancel"), + ("archive-cancel-outline", "archive-cancel-outline"), + ("archive-check", "archive-check"), + ("archive-check-outline", "archive-check-outline"), + ("archive-clock", "archive-clock"), + ("archive-clock-outline", "archive-clock-outline"), + ("archive-cog", "archive-cog"), + ("archive-cog-outline", "archive-cog-outline"), + ("archive-edit", "archive-edit"), + ("archive-edit-outline", "archive-edit-outline"), + ("archive-eye", "archive-eye"), + ("archive-eye-outline", "archive-eye-outline"), + ("archive-lock", "archive-lock"), + ("archive-lock-open", "archive-lock-open"), + ("archive-lock-open-outline", "archive-lock-open-outline"), + ("archive-lock-outline", "archive-lock-outline"), + ("archive-marker", "archive-marker"), + ("archive-marker-outline", "archive-marker-outline"), + ("archive-minus", "archive-minus"), + ("archive-minus-outline", "archive-minus-outline"), + ("archive-music", "archive-music"), + ("archive-music-outline", "archive-music-outline"), + ("archive-off", "archive-off"), + ("archive-off-outline", "archive-off-outline"), + ("archive-outline", "archive-outline"), + ("archive-plus", "archive-plus"), + ("archive-plus-outline", "archive-plus-outline"), + ("archive-refresh", "archive-refresh"), + ("archive-refresh-outline", "archive-refresh-outline"), + ("archive-remove", "archive-remove"), + ("archive-remove-outline", "archive-remove-outline"), + ("archive-search", "archive-search"), + ("archive-search-outline", "archive-search-outline"), + ("archive-settings", "archive-settings"), + ("archive-settings-outline", "archive-settings-outline"), + ("archive-star", "archive-star"), + ("archive-star-outline", "archive-star-outline"), + ("archive-sync", "archive-sync"), + ("archive-sync-outline", "archive-sync-outline"), + ("arm-flex", "arm-flex"), + ("arm-flex-outline", "arm-flex-outline"), + ("arrange-bring-forward", "arrange-bring-forward"), + ("arrange-bring-to-front", "arrange-bring-to-front"), + ("arrange-send-backward", "arrange-send-backward"), + ("arrange-send-to-back", "arrange-send-to-back"), + ("arrow-all", "arrow-all"), + ("arrow-bottom-left", "arrow-bottom-left"), + ("arrow-bottom-left-bold-box", "arrow-bottom-left-bold-box"), + ("arrow-bottom-left-bold-box-outline", "arrow-bottom-left-bold-box-outline"), + ("arrow-bottom-left-bold-outline", "arrow-bottom-left-bold-outline"), + ("arrow-bottom-left-thick", "arrow-bottom-left-thick"), + ("arrow-bottom-left-thin", "arrow-bottom-left-thin"), + ( + "arrow-bottom-left-thin-circle-outline", + "arrow-bottom-left-thin-circle-outline", + ), + ("arrow-bottom-right", "arrow-bottom-right"), + ("arrow-bottom-right-bold-box", "arrow-bottom-right-bold-box"), + ("arrow-bottom-right-bold-box-outline", "arrow-bottom-right-bold-box-outline"), + ("arrow-bottom-right-bold-outline", "arrow-bottom-right-bold-outline"), + ("arrow-bottom-right-thick", "arrow-bottom-right-thick"), + ("arrow-bottom-right-thin", "arrow-bottom-right-thin"), + ( + "arrow-bottom-right-thin-circle-outline", + "arrow-bottom-right-thin-circle-outline", + ), + ("arrow-collapse", "arrow-collapse"), + ("arrow-collapse-all", "arrow-collapse-all"), + ("arrow-collapse-down", "arrow-collapse-down"), + ("arrow-collapse-horizontal", "arrow-collapse-horizontal"), + ("arrow-collapse-left", "arrow-collapse-left"), + ("arrow-collapse-right", "arrow-collapse-right"), + ("arrow-collapse-up", "arrow-collapse-up"), + ("arrow-collapse-vertical", "arrow-collapse-vertical"), + ("arrow-decision", "arrow-decision"), + ("arrow-decision-auto", "arrow-decision-auto"), + ("arrow-decision-auto-outline", "arrow-decision-auto-outline"), + ("arrow-decision-outline", "arrow-decision-outline"), + ("arrow-down", "arrow-down"), + ("arrow-down-bold", "arrow-down-bold"), + ("arrow-down-bold-box", "arrow-down-bold-box"), + ("arrow-down-bold-box-outline", "arrow-down-bold-box-outline"), + ("arrow-down-bold-circle", "arrow-down-bold-circle"), + ("arrow-down-bold-circle-outline", "arrow-down-bold-circle-outline"), + ("arrow-down-bold-hexagon-outline", "arrow-down-bold-hexagon-outline"), + ("arrow-down-bold-outline", "arrow-down-bold-outline"), + ("arrow-down-box", "arrow-down-box"), + ("arrow-down-circle", "arrow-down-circle"), + ("arrow-down-circle-outline", "arrow-down-circle-outline"), + ("arrow-down-drop-circle", "arrow-down-drop-circle"), + ("arrow-down-drop-circle-outline", "arrow-down-drop-circle-outline"), + ("arrow-down-left", "arrow-down-left"), + ("arrow-down-left-bold", "arrow-down-left-bold"), + ("arrow-down-right", "arrow-down-right"), + ("arrow-down-right-bold", "arrow-down-right-bold"), + ("arrow-down-thick", "arrow-down-thick"), + ("arrow-down-thin", "arrow-down-thin"), + ("arrow-down-thin-circle-outline", "arrow-down-thin-circle-outline"), + ("arrow-expand", "arrow-expand"), + ("arrow-expand-all", "arrow-expand-all"), + ("arrow-expand-down", "arrow-expand-down"), + ("arrow-expand-horizontal", "arrow-expand-horizontal"), + ("arrow-expand-left", "arrow-expand-left"), + ("arrow-expand-right", "arrow-expand-right"), + ("arrow-expand-up", "arrow-expand-up"), + ("arrow-expand-vertical", "arrow-expand-vertical"), + ("arrow-horizontal-lock", "arrow-horizontal-lock"), + ("arrow-left", "arrow-left"), + ("arrow-left-bold", "arrow-left-bold"), + ("arrow-left-bold-box", "arrow-left-bold-box"), + ("arrow-left-bold-box-outline", "arrow-left-bold-box-outline"), + ("arrow-left-bold-circle", "arrow-left-bold-circle"), + ("arrow-left-bold-circle-outline", "arrow-left-bold-circle-outline"), + ("arrow-left-bold-hexagon-outline", "arrow-left-bold-hexagon-outline"), + ("arrow-left-bold-outline", "arrow-left-bold-outline"), + ("arrow-left-bottom", "arrow-left-bottom"), + ("arrow-left-bottom-bold", "arrow-left-bottom-bold"), + ("arrow-left-box", "arrow-left-box"), + ("arrow-left-circle", "arrow-left-circle"), + ("arrow-left-circle-outline", "arrow-left-circle-outline"), + ("arrow-left-drop-circle", "arrow-left-drop-circle"), + ("arrow-left-drop-circle-outline", "arrow-left-drop-circle-outline"), + ("arrow-left-right", "arrow-left-right"), + ("arrow-left-right-bold", "arrow-left-right-bold"), + ("arrow-left-right-bold-outline", "arrow-left-right-bold-outline"), + ("arrow-left-thick", "arrow-left-thick"), + ("arrow-left-thin", "arrow-left-thin"), + ("arrow-left-thin-circle-outline", "arrow-left-thin-circle-outline"), + ("arrow-left-top", "arrow-left-top"), + ("arrow-left-top-bold", "arrow-left-top-bold"), + ("arrow-projectile", "arrow-projectile"), + ("arrow-projectile-multiple", "arrow-projectile-multiple"), + ("arrow-right", "arrow-right"), + ("arrow-right-bold", "arrow-right-bold"), + ("arrow-right-bold-box", "arrow-right-bold-box"), + ("arrow-right-bold-box-outline", "arrow-right-bold-box-outline"), + ("arrow-right-bold-circle", "arrow-right-bold-circle"), + ("arrow-right-bold-circle-outline", "arrow-right-bold-circle-outline"), + ("arrow-right-bold-hexagon-outline", "arrow-right-bold-hexagon-outline"), + ("arrow-right-bold-outline", "arrow-right-bold-outline"), + ("arrow-right-bottom", "arrow-right-bottom"), + ("arrow-right-bottom-bold", "arrow-right-bottom-bold"), + ("arrow-right-box", "arrow-right-box"), + ("arrow-right-circle", "arrow-right-circle"), + ("arrow-right-circle-outline", "arrow-right-circle-outline"), + ("arrow-right-drop-circle", "arrow-right-drop-circle"), + ("arrow-right-drop-circle-outline", "arrow-right-drop-circle-outline"), + ("arrow-right-thick", "arrow-right-thick"), + ("arrow-right-thin", "arrow-right-thin"), + ("arrow-right-thin-circle-outline", "arrow-right-thin-circle-outline"), + ("arrow-right-top", "arrow-right-top"), + ("arrow-right-top-bold", "arrow-right-top-bold"), + ("arrow-split-horizontal", "arrow-split-horizontal"), + ("arrow-split-vertical", "arrow-split-vertical"), + ("arrow-top-left", "arrow-top-left"), + ("arrow-top-left-bold-box", "arrow-top-left-bold-box"), + ("arrow-top-left-bold-box-outline", "arrow-top-left-bold-box-outline"), + ("arrow-top-left-bold-outline", "arrow-top-left-bold-outline"), + ("arrow-top-left-bottom-right", "arrow-top-left-bottom-right"), + ("arrow-top-left-bottom-right-bold", "arrow-top-left-bottom-right-bold"), + ("arrow-top-left-thick", "arrow-top-left-thick"), + ("arrow-top-left-thin", "arrow-top-left-thin"), + ("arrow-top-left-thin-circle-outline", "arrow-top-left-thin-circle-outline"), + ("arrow-top-right", "arrow-top-right"), + ("arrow-top-right-bold-box", "arrow-top-right-bold-box"), + ("arrow-top-right-bold-box-outline", "arrow-top-right-bold-box-outline"), + ("arrow-top-right-bold-outline", "arrow-top-right-bold-outline"), + ("arrow-top-right-bottom-left", "arrow-top-right-bottom-left"), + ("arrow-top-right-bottom-left-bold", "arrow-top-right-bottom-left-bold"), + ("arrow-top-right-thick", "arrow-top-right-thick"), + ("arrow-top-right-thin", "arrow-top-right-thin"), + ("arrow-top-right-thin-circle-outline", "arrow-top-right-thin-circle-outline"), + ("arrow-u-down-left", "arrow-u-down-left"), + ("arrow-u-down-left-bold", "arrow-u-down-left-bold"), + ("arrow-u-down-right", "arrow-u-down-right"), + ("arrow-u-down-right-bold", "arrow-u-down-right-bold"), + ("arrow-u-left-bottom", "arrow-u-left-bottom"), + ("arrow-u-left-bottom-bold", "arrow-u-left-bottom-bold"), + ("arrow-u-left-top", "arrow-u-left-top"), + ("arrow-u-left-top-bold", "arrow-u-left-top-bold"), + ("arrow-u-right-bottom", "arrow-u-right-bottom"), + ("arrow-u-right-bottom-bold", "arrow-u-right-bottom-bold"), + ("arrow-u-right-top", "arrow-u-right-top"), + ("arrow-u-right-top-bold", "arrow-u-right-top-bold"), + ("arrow-u-up-left", "arrow-u-up-left"), + ("arrow-u-up-left-bold", "arrow-u-up-left-bold"), + ("arrow-u-up-right", "arrow-u-up-right"), + ("arrow-u-up-right-bold", "arrow-u-up-right-bold"), + ("arrow-up", "arrow-up"), + ("arrow-up-bold", "arrow-up-bold"), + ("arrow-up-bold-box", "arrow-up-bold-box"), + ("arrow-up-bold-box-outline", "arrow-up-bold-box-outline"), + ("arrow-up-bold-circle", "arrow-up-bold-circle"), + ("arrow-up-bold-circle-outline", "arrow-up-bold-circle-outline"), + ("arrow-up-bold-hexagon-outline", "arrow-up-bold-hexagon-outline"), + ("arrow-up-bold-outline", "arrow-up-bold-outline"), + ("arrow-up-box", "arrow-up-box"), + ("arrow-up-circle", "arrow-up-circle"), + ("arrow-up-circle-outline", "arrow-up-circle-outline"), + ("arrow-up-down", "arrow-up-down"), + ("arrow-up-down-bold", "arrow-up-down-bold"), + ("arrow-up-down-bold-outline", "arrow-up-down-bold-outline"), + ("arrow-up-drop-circle", "arrow-up-drop-circle"), + ("arrow-up-drop-circle-outline", "arrow-up-drop-circle-outline"), + ("arrow-up-left", "arrow-up-left"), + ("arrow-up-left-bold", "arrow-up-left-bold"), + ("arrow-up-right", "arrow-up-right"), + ("arrow-up-right-bold", "arrow-up-right-bold"), + ("arrow-up-thick", "arrow-up-thick"), + ("arrow-up-thin", "arrow-up-thin"), + ("arrow-up-thin-circle-outline", "arrow-up-thin-circle-outline"), + ("arrow-vertical-lock", "arrow-vertical-lock"), + ("artboard", "artboard"), + ("artstation", "artstation"), + ("aspect-ratio", "aspect-ratio"), + ("assistant", "assistant"), + ("asterisk", "asterisk"), + ("asterisk-circle-outline", "asterisk-circle-outline"), + ("at", "at"), + ("atlassian", "atlassian"), + ("atm", "atm"), + ("atom", "atom"), + ("atom-variant", "atom-variant"), + ("attachment", "attachment"), + ("attachment-check", "attachment-check"), + ("attachment-lock", "attachment-lock"), + ("attachment-minus", "attachment-minus"), + ("attachment-off", "attachment-off"), + ("attachment-plus", "attachment-plus"), + ("attachment-remove", "attachment-remove"), + ("atv", "atv"), + ("audio-input-rca", "audio-input-rca"), + ("audio-input-stereo-minijack", "audio-input-stereo-minijack"), + ("audio-input-xlr", "audio-input-xlr"), + ("audio-video", "audio-video"), + ("audio-video-off", "audio-video-off"), + ("augmented-reality", "augmented-reality"), + ("aurora", "aurora"), + ("auto-download", "auto-download"), + ("auto-fix", "auto-fix"), + ("auto-upload", "auto-upload"), + ("autorenew", "autorenew"), + ("autorenew-off", "autorenew-off"), + ("av-timer", "av-timer"), + ("awning", "awning"), + ("awning-outline", "awning-outline"), + ("aws", "aws"), + ("axe", "axe"), + ("axe-battle", "axe-battle"), + ("axis", "axis"), + ("axis-arrow", "axis-arrow"), + ("axis-arrow-info", "axis-arrow-info"), + ("axis-arrow-lock", "axis-arrow-lock"), + ("axis-lock", "axis-lock"), + ("axis-x-arrow", "axis-x-arrow"), + ("axis-x-arrow-lock", "axis-x-arrow-lock"), + ("axis-x-rotate-clockwise", "axis-x-rotate-clockwise"), + ("axis-x-rotate-counterclockwise", "axis-x-rotate-counterclockwise"), + ("axis-x-y-arrow-lock", "axis-x-y-arrow-lock"), + ("axis-y-arrow", "axis-y-arrow"), + ("axis-y-arrow-lock", "axis-y-arrow-lock"), + ("axis-y-rotate-clockwise", "axis-y-rotate-clockwise"), + ("axis-y-rotate-counterclockwise", "axis-y-rotate-counterclockwise"), + ("axis-z-arrow", "axis-z-arrow"), + ("axis-z-arrow-lock", "axis-z-arrow-lock"), + ("axis-z-rotate-clockwise", "axis-z-rotate-clockwise"), + ("axis-z-rotate-counterclockwise", "axis-z-rotate-counterclockwise"), + ("babel", "babel"), + ("baby", "baby"), + ("baby-bottle", "baby-bottle"), + ("baby-bottle-outline", "baby-bottle-outline"), + ("baby-buggy", "baby-buggy"), + ("baby-buggy-off", "baby-buggy-off"), + ("baby-carriage", "baby-carriage"), + ("baby-carriage-off", "baby-carriage-off"), + ("baby-face", "baby-face"), + ("baby-face-outline", "baby-face-outline"), + ("backburger", "backburger"), + ("backspace", "backspace"), + ("backspace-outline", "backspace-outline"), + ("backspace-reverse", "backspace-reverse"), + ("backspace-reverse-outline", "backspace-reverse-outline"), + ("backup-restore", "backup-restore"), + ("bacteria", "bacteria"), + ("bacteria-outline", "bacteria-outline"), + ("badge-account", "badge-account"), + ("badge-account-alert", "badge-account-alert"), + ("badge-account-alert-outline", "badge-account-alert-outline"), + ("badge-account-horizontal", "badge-account-horizontal"), + ("badge-account-horizontal-outline", "badge-account-horizontal-outline"), + ("badge-account-outline", "badge-account-outline"), + ("badminton", "badminton"), + ("bag-carry-on", "bag-carry-on"), + ("bag-carry-on-check", "bag-carry-on-check"), + ("bag-carry-on-off", "bag-carry-on-off"), + ("bag-checked", "bag-checked"), + ("bag-personal", "bag-personal"), + ("bag-personal-off", "bag-personal-off"), + ("bag-personal-off-outline", "bag-personal-off-outline"), + ("bag-personal-outline", "bag-personal-outline"), + ("bag-personal-tag", "bag-personal-tag"), + ("bag-personal-tag-outline", "bag-personal-tag-outline"), + ("bag-suitcase", "bag-suitcase"), + ("bag-suitcase-off", "bag-suitcase-off"), + ("bag-suitcase-off-outline", "bag-suitcase-off-outline"), + ("bag-suitcase-outline", "bag-suitcase-outline"), + ("baguette", "baguette"), + ("balcony", "balcony"), + ("balloon", "balloon"), + ("ballot", "ballot"), + ("ballot-outline", "ballot-outline"), + ("ballot-recount", "ballot-recount"), + ("ballot-recount-outline", "ballot-recount-outline"), + ("bandage", "bandage"), + ("bandcamp", "bandcamp"), + ("bank", "bank"), + ("bank-check", "bank-check"), + ("bank-circle", "bank-circle"), + ("bank-circle-outline", "bank-circle-outline"), + ("bank-minus", "bank-minus"), + ("bank-off", "bank-off"), + ("bank-off-outline", "bank-off-outline"), + ("bank-outline", "bank-outline"), + ("bank-plus", "bank-plus"), + ("bank-remove", "bank-remove"), + ("bank-transfer", "bank-transfer"), + ("bank-transfer-in", "bank-transfer-in"), + ("bank-transfer-out", "bank-transfer-out"), + ("barcode", "barcode"), + ("barcode-off", "barcode-off"), + ("barcode-scan", "barcode-scan"), + ("barley", "barley"), + ("barley-off", "barley-off"), + ("barn", "barn"), + ("barrel", "barrel"), + ("barrel-outline", "barrel-outline"), + ("baseball", "baseball"), + ("baseball-bat", "baseball-bat"), + ("baseball-diamond", "baseball-diamond"), + ("baseball-diamond-outline", "baseball-diamond-outline"), + ("basecamp", "basecamp"), + ("bash", "bash"), + ("basket", "basket"), + ("basket-check", "basket-check"), + ("basket-check-outline", "basket-check-outline"), + ("basket-fill", "basket-fill"), + ("basket-minus", "basket-minus"), + ("basket-minus-outline", "basket-minus-outline"), + ("basket-off", "basket-off"), + ("basket-off-outline", "basket-off-outline"), + ("basket-outline", "basket-outline"), + ("basket-plus", "basket-plus"), + ("basket-plus-outline", "basket-plus-outline"), + ("basket-remove", "basket-remove"), + ("basket-remove-outline", "basket-remove-outline"), + ("basket-unfill", "basket-unfill"), + ("basketball", "basketball"), + ("basketball-hoop", "basketball-hoop"), + ("basketball-hoop-outline", "basketball-hoop-outline"), + ("bat", "bat"), + ("bathtub", "bathtub"), + ("bathtub-outline", "bathtub-outline"), + ("battery", "battery"), + ("battery-10", "battery-10"), + ("battery-10-bluetooth", "battery-10-bluetooth"), + ("battery-20", "battery-20"), + ("battery-20-bluetooth", "battery-20-bluetooth"), + ("battery-30", "battery-30"), + ("battery-30-bluetooth", "battery-30-bluetooth"), + ("battery-40", "battery-40"), + ("battery-40-bluetooth", "battery-40-bluetooth"), + ("battery-50", "battery-50"), + ("battery-50-bluetooth", "battery-50-bluetooth"), + ("battery-60", "battery-60"), + ("battery-60-bluetooth", "battery-60-bluetooth"), + ("battery-70", "battery-70"), + ("battery-70-bluetooth", "battery-70-bluetooth"), + ("battery-80", "battery-80"), + ("battery-80-bluetooth", "battery-80-bluetooth"), + ("battery-90", "battery-90"), + ("battery-90-bluetooth", "battery-90-bluetooth"), + ("battery-alert", "battery-alert"), + ("battery-alert-bluetooth", "battery-alert-bluetooth"), + ("battery-alert-variant", "battery-alert-variant"), + ("battery-alert-variant-outline", "battery-alert-variant-outline"), + ("battery-arrow-down", "battery-arrow-down"), + ("battery-arrow-down-outline", "battery-arrow-down-outline"), + ("battery-arrow-up", "battery-arrow-up"), + ("battery-arrow-up-outline", "battery-arrow-up-outline"), + ("battery-bluetooth", "battery-bluetooth"), + ("battery-bluetooth-variant", "battery-bluetooth-variant"), + ("battery-charging", "battery-charging"), + ("battery-charging-10", "battery-charging-10"), + ("battery-charging-100", "battery-charging-100"), + ("battery-charging-20", "battery-charging-20"), + ("battery-charging-30", "battery-charging-30"), + ("battery-charging-40", "battery-charging-40"), + ("battery-charging-50", "battery-charging-50"), + ("battery-charging-60", "battery-charging-60"), + ("battery-charging-70", "battery-charging-70"), + ("battery-charging-80", "battery-charging-80"), + ("battery-charging-90", "battery-charging-90"), + ("battery-charging-high", "battery-charging-high"), + ("battery-charging-low", "battery-charging-low"), + ("battery-charging-medium", "battery-charging-medium"), + ("battery-charging-outline", "battery-charging-outline"), + ("battery-charging-wireless", "battery-charging-wireless"), + ("battery-charging-wireless-10", "battery-charging-wireless-10"), + ("battery-charging-wireless-20", "battery-charging-wireless-20"), + ("battery-charging-wireless-30", "battery-charging-wireless-30"), + ("battery-charging-wireless-40", "battery-charging-wireless-40"), + ("battery-charging-wireless-50", "battery-charging-wireless-50"), + ("battery-charging-wireless-60", "battery-charging-wireless-60"), + ("battery-charging-wireless-70", "battery-charging-wireless-70"), + ("battery-charging-wireless-80", "battery-charging-wireless-80"), + ("battery-charging-wireless-90", "battery-charging-wireless-90"), + ("battery-charging-wireless-alert", "battery-charging-wireless-alert"), + ("battery-charging-wireless-outline", "battery-charging-wireless-outline"), + ("battery-check", "battery-check"), + ("battery-check-outline", "battery-check-outline"), + ("battery-clock", "battery-clock"), + ("battery-clock-outline", "battery-clock-outline"), + ("battery-heart", "battery-heart"), + ("battery-heart-outline", "battery-heart-outline"), + ("battery-heart-variant", "battery-heart-variant"), + ("battery-high", "battery-high"), + ("battery-lock", "battery-lock"), + ("battery-lock-open", "battery-lock-open"), + ("battery-low", "battery-low"), + ("battery-medium", "battery-medium"), + ("battery-minus", "battery-minus"), + ("battery-minus-outline", "battery-minus-outline"), + ("battery-minus-variant", "battery-minus-variant"), + ("battery-negative", "battery-negative"), + ("battery-off", "battery-off"), + ("battery-off-outline", "battery-off-outline"), + ("battery-outline", "battery-outline"), + ("battery-plus", "battery-plus"), + ("battery-plus-outline", "battery-plus-outline"), + ("battery-plus-variant", "battery-plus-variant"), + ("battery-positive", "battery-positive"), + ("battery-remove", "battery-remove"), + ("battery-remove-outline", "battery-remove-outline"), + ("battery-standard", "battery-standard"), + ("battery-sync", "battery-sync"), + ("battery-sync-outline", "battery-sync-outline"), + ("battery-unknown", "battery-unknown"), + ("battery-unknown-bluetooth", "battery-unknown-bluetooth"), + ("battlenet", "battlenet"), + ("beach", "beach"), + ("beaker", "beaker"), + ("beaker-alert", "beaker-alert"), + ("beaker-alert-outline", "beaker-alert-outline"), + ("beaker-check", "beaker-check"), + ("beaker-check-outline", "beaker-check-outline"), + ("beaker-minus", "beaker-minus"), + ("beaker-minus-outline", "beaker-minus-outline"), + ("beaker-outline", "beaker-outline"), + ("beaker-plus", "beaker-plus"), + ("beaker-plus-outline", "beaker-plus-outline"), + ("beaker-question", "beaker-question"), + ("beaker-question-outline", "beaker-question-outline"), + ("beaker-remove", "beaker-remove"), + ("beaker-remove-outline", "beaker-remove-outline"), + ("beam", "beam"), + ("beats", "beats"), + ("bed", "bed"), + ("bed-clock", "bed-clock"), + ("bed-double", "bed-double"), + ("bed-double-outline", "bed-double-outline"), + ("bed-empty", "bed-empty"), + ("bed-king", "bed-king"), + ("bed-king-outline", "bed-king-outline"), + ("bed-outline", "bed-outline"), + ("bed-queen", "bed-queen"), + ("bed-queen-outline", "bed-queen-outline"), + ("bed-single", "bed-single"), + ("bed-single-outline", "bed-single-outline"), + ("bee", "bee"), + ("bee-flower", "bee-flower"), + ("beehive-off-outline", "beehive-off-outline"), + ("beehive-outline", "beehive-outline"), + ("beekeeper", "beekeeper"), + ("beer", "beer"), + ("beer-outline", "beer-outline"), + ("behance", "behance"), + ("bell", "bell"), + ("bell-alert", "bell-alert"), + ("bell-alert-outline", "bell-alert-outline"), + ("bell-badge", "bell-badge"), + ("bell-badge-outline", "bell-badge-outline"), + ("bell-cancel", "bell-cancel"), + ("bell-cancel-outline", "bell-cancel-outline"), + ("bell-check", "bell-check"), + ("bell-check-outline", "bell-check-outline"), + ("bell-circle", "bell-circle"), + ("bell-circle-outline", "bell-circle-outline"), + ("bell-cog", "bell-cog"), + ("bell-cog-outline", "bell-cog-outline"), + ("bell-minus", "bell-minus"), + ("bell-minus-outline", "bell-minus-outline"), + ("bell-off", "bell-off"), + ("bell-off-outline", "bell-off-outline"), + ("bell-outline", "bell-outline"), + ("bell-plus", "bell-plus"), + ("bell-plus-outline", "bell-plus-outline"), + ("bell-remove", "bell-remove"), + ("bell-remove-outline", "bell-remove-outline"), + ("bell-ring", "bell-ring"), + ("bell-ring-outline", "bell-ring-outline"), + ("bell-sleep", "bell-sleep"), + ("bell-sleep-outline", "bell-sleep-outline"), + ("beta", "beta"), + ("betamax", "betamax"), + ("biathlon", "biathlon"), + ("bicycle", "bicycle"), + ("bicycle-basket", "bicycle-basket"), + ("bicycle-cargo", "bicycle-cargo"), + ("bicycle-electric", "bicycle-electric"), + ("bicycle-penny-farthing", "bicycle-penny-farthing"), + ("bike", "bike"), + ("bike-fast", "bike-fast"), + ("billboard", "billboard"), + ("billiards", "billiards"), + ("billiards-rack", "billiards-rack"), + ("binoculars", "binoculars"), + ("bio", "bio"), + ("biohazard", "biohazard"), + ("bird", "bird"), + ("bitbucket", "bitbucket"), + ("bitcoin", "bitcoin"), + ("black-mesa", "black-mesa"), + ("blackberry", "blackberry"), + ("blender", "blender"), + ("blender-outline", "blender-outline"), + ("blender-software", "blender-software"), + ("blinds", "blinds"), + ("blinds-horizontal", "blinds-horizontal"), + ("blinds-horizontal-closed", "blinds-horizontal-closed"), + ("blinds-open", "blinds-open"), + ("blinds-vertical", "blinds-vertical"), + ("blinds-vertical-closed", "blinds-vertical-closed"), + ("block-helper", "block-helper"), + ("blogger", "blogger"), + ("blood-bag", "blood-bag"), + ("bluetooth", "bluetooth"), + ("bluetooth-audio", "bluetooth-audio"), + ("bluetooth-connect", "bluetooth-connect"), + ("bluetooth-off", "bluetooth-off"), + ("bluetooth-settings", "bluetooth-settings"), + ("bluetooth-transfer", "bluetooth-transfer"), + ("blur", "blur"), + ("blur-linear", "blur-linear"), + ("blur-off", "blur-off"), + ("blur-radial", "blur-radial"), + ("bolt", "bolt"), + ("bomb", "bomb"), + ("bomb-off", "bomb-off"), + ("bone", "bone"), + ("bone-off", "bone-off"), + ("book", "book"), + ("book-account", "book-account"), + ("book-account-outline", "book-account-outline"), + ("book-alert", "book-alert"), + ("book-alert-outline", "book-alert-outline"), + ("book-alphabet", "book-alphabet"), + ("book-arrow-down", "book-arrow-down"), + ("book-arrow-down-outline", "book-arrow-down-outline"), + ("book-arrow-left", "book-arrow-left"), + ("book-arrow-left-outline", "book-arrow-left-outline"), + ("book-arrow-right", "book-arrow-right"), + ("book-arrow-right-outline", "book-arrow-right-outline"), + ("book-arrow-up", "book-arrow-up"), + ("book-arrow-up-outline", "book-arrow-up-outline"), + ("book-cancel", "book-cancel"), + ("book-cancel-outline", "book-cancel-outline"), + ("book-check", "book-check"), + ("book-check-outline", "book-check-outline"), + ("book-clock", "book-clock"), + ("book-clock-outline", "book-clock-outline"), + ("book-cog", "book-cog"), + ("book-cog-outline", "book-cog-outline"), + ("book-cross", "book-cross"), + ("book-edit", "book-edit"), + ("book-edit-outline", "book-edit-outline"), + ("book-education", "book-education"), + ("book-education-outline", "book-education-outline"), + ("book-heart", "book-heart"), + ("book-heart-outline", "book-heart-outline"), + ("book-information-variant", "book-information-variant"), + ("book-lock", "book-lock"), + ("book-lock-open", "book-lock-open"), + ("book-lock-open-outline", "book-lock-open-outline"), + ("book-lock-outline", "book-lock-outline"), + ("book-marker", "book-marker"), + ("book-marker-outline", "book-marker-outline"), + ("book-minus", "book-minus"), + ("book-minus-multiple", "book-minus-multiple"), + ("book-minus-multiple-outline", "book-minus-multiple-outline"), + ("book-minus-outline", "book-minus-outline"), + ("book-multiple", "book-multiple"), + ("book-multiple-minus", "book-multiple-minus"), + ("book-multiple-outline", "book-multiple-outline"), + ("book-multiple-plus", "book-multiple-plus"), + ("book-multiple-remove", "book-multiple-remove"), + ("book-multiple-variant", "book-multiple-variant"), + ("book-music", "book-music"), + ("book-music-outline", "book-music-outline"), + ("book-off", "book-off"), + ("book-off-outline", "book-off-outline"), + ("book-open", "book-open"), + ("book-open-blank-variant", "book-open-blank-variant"), + ("book-open-outline", "book-open-outline"), + ("book-open-page-variant", "book-open-page-variant"), + ("book-open-page-variant-outline", "book-open-page-variant-outline"), + ("book-open-variant", "book-open-variant"), + ("book-outline", "book-outline"), + ("book-play", "book-play"), + ("book-play-outline", "book-play-outline"), + ("book-plus", "book-plus"), + ("book-plus-multiple", "book-plus-multiple"), + ("book-plus-multiple-outline", "book-plus-multiple-outline"), + ("book-plus-outline", "book-plus-outline"), + ("book-refresh", "book-refresh"), + ("book-refresh-outline", "book-refresh-outline"), + ("book-remove", "book-remove"), + ("book-remove-multiple", "book-remove-multiple"), + ("book-remove-multiple-outline", "book-remove-multiple-outline"), + ("book-remove-outline", "book-remove-outline"), + ("book-search", "book-search"), + ("book-search-outline", "book-search-outline"), + ("book-settings", "book-settings"), + ("book-settings-outline", "book-settings-outline"), + ("book-sync", "book-sync"), + ("book-sync-outline", "book-sync-outline"), + ("book-variant", "book-variant"), + ("book-variant-multiple", "book-variant-multiple"), + ("bookmark", "bookmark"), + ("bookmark-box", "bookmark-box"), + ("bookmark-box-multiple", "bookmark-box-multiple"), + ("bookmark-box-multiple-outline", "bookmark-box-multiple-outline"), + ("bookmark-box-outline", "bookmark-box-outline"), + ("bookmark-check", "bookmark-check"), + ("bookmark-check-outline", "bookmark-check-outline"), + ("bookmark-minus", "bookmark-minus"), + ("bookmark-minus-outline", "bookmark-minus-outline"), + ("bookmark-multiple", "bookmark-multiple"), + ("bookmark-multiple-outline", "bookmark-multiple-outline"), + ("bookmark-music", "bookmark-music"), + ("bookmark-music-outline", "bookmark-music-outline"), + ("bookmark-off", "bookmark-off"), + ("bookmark-off-outline", "bookmark-off-outline"), + ("bookmark-outline", "bookmark-outline"), + ("bookmark-plus", "bookmark-plus"), + ("bookmark-plus-outline", "bookmark-plus-outline"), + ("bookmark-remove", "bookmark-remove"), + ("bookmark-remove-outline", "bookmark-remove-outline"), + ("bookshelf", "bookshelf"), + ("boom-gate", "boom-gate"), + ("boom-gate-alert", "boom-gate-alert"), + ("boom-gate-alert-outline", "boom-gate-alert-outline"), + ("boom-gate-arrow-down", "boom-gate-arrow-down"), + ("boom-gate-arrow-down-outline", "boom-gate-arrow-down-outline"), + ("boom-gate-arrow-up", "boom-gate-arrow-up"), + ("boom-gate-arrow-up-outline", "boom-gate-arrow-up-outline"), + ("boom-gate-outline", "boom-gate-outline"), + ("boom-gate-up", "boom-gate-up"), + ("boom-gate-up-outline", "boom-gate-up-outline"), + ("boombox", "boombox"), + ("boomerang", "boomerang"), + ("bootstrap", "bootstrap"), + ("border-all", "border-all"), + ("border-all-variant", "border-all-variant"), + ("border-bottom", "border-bottom"), + ("border-bottom-variant", "border-bottom-variant"), + ("border-color", "border-color"), + ("border-horizontal", "border-horizontal"), + ("border-inside", "border-inside"), + ("border-left", "border-left"), + ("border-left-variant", "border-left-variant"), + ("border-none", "border-none"), + ("border-none-variant", "border-none-variant"), + ("border-outside", "border-outside"), + ("border-radius", "border-radius"), + ("border-right", "border-right"), + ("border-right-variant", "border-right-variant"), + ("border-style", "border-style"), + ("border-top", "border-top"), + ("border-top-variant", "border-top-variant"), + ("border-vertical", "border-vertical"), + ("bottle-soda", "bottle-soda"), + ("bottle-soda-classic", "bottle-soda-classic"), + ("bottle-soda-classic-outline", "bottle-soda-classic-outline"), + ("bottle-soda-outline", "bottle-soda-outline"), + ("bottle-tonic", "bottle-tonic"), + ("bottle-tonic-outline", "bottle-tonic-outline"), + ("bottle-tonic-plus", "bottle-tonic-plus"), + ("bottle-tonic-plus-outline", "bottle-tonic-plus-outline"), + ("bottle-tonic-skull", "bottle-tonic-skull"), + ("bottle-tonic-skull-outline", "bottle-tonic-skull-outline"), + ("bottle-wine", "bottle-wine"), + ("bottle-wine-outline", "bottle-wine-outline"), + ("bow-arrow", "bow-arrow"), + ("bow-tie", "bow-tie"), + ("bowl", "bowl"), + ("bowl-mix", "bowl-mix"), + ("bowl-mix-outline", "bowl-mix-outline"), + ("bowl-outline", "bowl-outline"), + ("bowling", "bowling"), + ("box", "box"), + ("box-cutter", "box-cutter"), + ("box-cutter-off", "box-cutter-off"), + ("box-download", "box-download"), + ("box-shadow", "box-shadow"), + ("box-upload", "box-upload"), + ("boxing-glove", "boxing-glove"), + ("boxing-gloves", "boxing-gloves"), + ("braille", "braille"), + ("brain", "brain"), + ("bread-slice", "bread-slice"), + ("bread-slice-outline", "bread-slice-outline"), + ("bridge", "bridge"), + ("briefcase", "briefcase"), + ("briefcase-account", "briefcase-account"), + ("briefcase-account-outline", "briefcase-account-outline"), + ("briefcase-arrow-left-right", "briefcase-arrow-left-right"), + ("briefcase-arrow-left-right-outline", "briefcase-arrow-left-right-outline"), + ("briefcase-arrow-up-down", "briefcase-arrow-up-down"), + ("briefcase-arrow-up-down-outline", "briefcase-arrow-up-down-outline"), + ("briefcase-check", "briefcase-check"), + ("briefcase-check-outline", "briefcase-check-outline"), + ("briefcase-clock", "briefcase-clock"), + ("briefcase-clock-outline", "briefcase-clock-outline"), + ("briefcase-download", "briefcase-download"), + ("briefcase-download-outline", "briefcase-download-outline"), + ("briefcase-edit", "briefcase-edit"), + ("briefcase-edit-outline", "briefcase-edit-outline"), + ("briefcase-eye", "briefcase-eye"), + ("briefcase-eye-outline", "briefcase-eye-outline"), + ("briefcase-minus", "briefcase-minus"), + ("briefcase-minus-outline", "briefcase-minus-outline"), + ("briefcase-off", "briefcase-off"), + ("briefcase-off-outline", "briefcase-off-outline"), + ("briefcase-outline", "briefcase-outline"), + ("briefcase-plus", "briefcase-plus"), + ("briefcase-plus-outline", "briefcase-plus-outline"), + ("briefcase-remove", "briefcase-remove"), + ("briefcase-remove-outline", "briefcase-remove-outline"), + ("briefcase-search", "briefcase-search"), + ("briefcase-search-outline", "briefcase-search-outline"), + ("briefcase-upload", "briefcase-upload"), + ("briefcase-upload-outline", "briefcase-upload-outline"), + ("briefcase-variant", "briefcase-variant"), + ("briefcase-variant-off", "briefcase-variant-off"), + ("briefcase-variant-off-outline", "briefcase-variant-off-outline"), + ("briefcase-variant-outline", "briefcase-variant-outline"), + ("brightness", "brightness"), + ("brightness-1", "brightness-1"), + ("brightness-2", "brightness-2"), + ("brightness-3", "brightness-3"), + ("brightness-4", "brightness-4"), + ("brightness-5", "brightness-5"), + ("brightness-6", "brightness-6"), + ("brightness-7", "brightness-7"), + ("brightness-auto", "brightness-auto"), + ("brightness-percent", "brightness-percent"), + ("broadcast", "broadcast"), + ("broadcast-off", "broadcast-off"), + ("broom", "broom"), + ("brush", "brush"), + ("brush-off", "brush-off"), + ("brush-outline", "brush-outline"), + ("brush-variant", "brush-variant"), + ("bucket", "bucket"), + ("bucket-outline", "bucket-outline"), + ("buffer", "buffer"), + ("buffet", "buffet"), + ("bug", "bug"), + ("bug-check", "bug-check"), + ("bug-check-outline", "bug-check-outline"), + ("bug-outline", "bug-outline"), + ("bug-pause", "bug-pause"), + ("bug-pause-outline", "bug-pause-outline"), + ("bug-play", "bug-play"), + ("bug-play-outline", "bug-play-outline"), + ("bug-stop", "bug-stop"), + ("bug-stop-outline", "bug-stop-outline"), + ("bugle", "bugle"), + ("bulkhead-light", "bulkhead-light"), + ("bulldozer", "bulldozer"), + ("bullet", "bullet"), + ("bulletin-board", "bulletin-board"), + ("bullhorn", "bullhorn"), + ("bullhorn-outline", "bullhorn-outline"), + ("bullhorn-variant", "bullhorn-variant"), + ("bullhorn-variant-outline", "bullhorn-variant-outline"), + ("bullseye", "bullseye"), + ("bullseye-arrow", "bullseye-arrow"), + ("bulma", "bulma"), + ("bunk-bed", "bunk-bed"), + ("bunk-bed-outline", "bunk-bed-outline"), + ("bus", "bus"), + ("bus-alert", "bus-alert"), + ("bus-articulated-end", "bus-articulated-end"), + ("bus-articulated-front", "bus-articulated-front"), + ("bus-clock", "bus-clock"), + ("bus-double-decker", "bus-double-decker"), + ("bus-electric", "bus-electric"), + ("bus-marker", "bus-marker"), + ("bus-multiple", "bus-multiple"), + ("bus-school", "bus-school"), + ("bus-side", "bus-side"), + ("bus-stop", "bus-stop"), + ("bus-stop-covered", "bus-stop-covered"), + ("bus-stop-uncovered", "bus-stop-uncovered"), + ("butterfly", "butterfly"), + ("butterfly-outline", "butterfly-outline"), + ("button-cursor", "button-cursor"), + ("button-pointer", "button-pointer"), + ("cabin-a-frame", "cabin-a-frame"), + ("cable-data", "cable-data"), + ("cached", "cached"), + ("cactus", "cactus"), + ("cake", "cake"), + ("cake-layered", "cake-layered"), + ("cake-variant", "cake-variant"), + ("cake-variant-outline", "cake-variant-outline"), + ("calculator", "calculator"), + ("calculator-off", "calculator-off"), + ("calculator-variant", "calculator-variant"), + ("calculator-variant-outline", "calculator-variant-outline"), + ("calendar", "calendar"), + ("calendar-account", "calendar-account"), + ("calendar-account-outline", "calendar-account-outline"), + ("calendar-alert", "calendar-alert"), + ("calendar-alert-outline", "calendar-alert-outline"), + ("calendar-arrow-left", "calendar-arrow-left"), + ("calendar-arrow-right", "calendar-arrow-right"), + ("calendar-badge", "calendar-badge"), + ("calendar-badge-outline", "calendar-badge-outline"), + ("calendar-blank", "calendar-blank"), + ("calendar-blank-multiple", "calendar-blank-multiple"), + ("calendar-blank-outline", "calendar-blank-outline"), + ("calendar-check", "calendar-check"), + ("calendar-check-outline", "calendar-check-outline"), + ("calendar-clock", "calendar-clock"), + ("calendar-clock-outline", "calendar-clock-outline"), + ("calendar-collapse-horizontal", "calendar-collapse-horizontal"), + ( + "calendar-collapse-horizontal-outline", + "calendar-collapse-horizontal-outline", + ), + ("calendar-cursor", "calendar-cursor"), + ("calendar-cursor-outline", "calendar-cursor-outline"), + ("calendar-edit", "calendar-edit"), + ("calendar-edit-outline", "calendar-edit-outline"), + ("calendar-end", "calendar-end"), + ("calendar-end-outline", "calendar-end-outline"), + ("calendar-expand-horizontal", "calendar-expand-horizontal"), + ("calendar-expand-horizontal-outline", "calendar-expand-horizontal-outline"), + ("calendar-export", "calendar-export"), + ("calendar-export-outline", "calendar-export-outline"), + ("calendar-filter", "calendar-filter"), + ("calendar-filter-outline", "calendar-filter-outline"), + ("calendar-heart", "calendar-heart"), + ("calendar-heart-outline", "calendar-heart-outline"), + ("calendar-import", "calendar-import"), + ("calendar-import-outline", "calendar-import-outline"), + ("calendar-lock", "calendar-lock"), + ("calendar-lock-open", "calendar-lock-open"), + ("calendar-lock-open-outline", "calendar-lock-open-outline"), + ("calendar-lock-outline", "calendar-lock-outline"), + ("calendar-minus", "calendar-minus"), + ("calendar-minus-outline", "calendar-minus-outline"), + ("calendar-month", "calendar-month"), + ("calendar-month-outline", "calendar-month-outline"), + ("calendar-multiple", "calendar-multiple"), + ("calendar-multiple-check", "calendar-multiple-check"), + ("calendar-multiselect", "calendar-multiselect"), + ("calendar-multiselect-outline", "calendar-multiselect-outline"), + ("calendar-outline", "calendar-outline"), + ("calendar-plus", "calendar-plus"), + ("calendar-plus-outline", "calendar-plus-outline"), + ("calendar-question", "calendar-question"), + ("calendar-question-outline", "calendar-question-outline"), + ("calendar-range", "calendar-range"), + ("calendar-range-outline", "calendar-range-outline"), + ("calendar-refresh", "calendar-refresh"), + ("calendar-refresh-outline", "calendar-refresh-outline"), + ("calendar-remove", "calendar-remove"), + ("calendar-remove-outline", "calendar-remove-outline"), + ("calendar-search", "calendar-search"), + ("calendar-search-outline", "calendar-search-outline"), + ("calendar-select", "calendar-select"), + ("calendar-star", "calendar-star"), + ("calendar-star-outline", "calendar-star-outline"), + ("calendar-start", "calendar-start"), + ("calendar-start-outline", "calendar-start-outline"), + ("calendar-sync", "calendar-sync"), + ("calendar-sync-outline", "calendar-sync-outline"), + ("calendar-text", "calendar-text"), + ("calendar-text-outline", "calendar-text-outline"), + ("calendar-today", "calendar-today"), + ("calendar-today-outline", "calendar-today-outline"), + ("calendar-week", "calendar-week"), + ("calendar-week-begin", "calendar-week-begin"), + ("calendar-week-begin-outline", "calendar-week-begin-outline"), + ("calendar-week-end", "calendar-week-end"), + ("calendar-week-end-outline", "calendar-week-end-outline"), + ("calendar-week-outline", "calendar-week-outline"), + ("calendar-weekend", "calendar-weekend"), + ("calendar-weekend-outline", "calendar-weekend-outline"), + ("call-made", "call-made"), + ("call-merge", "call-merge"), + ("call-missed", "call-missed"), + ("call-received", "call-received"), + ("call-split", "call-split"), + ("camcorder", "camcorder"), + ("camcorder-off", "camcorder-off"), + ("camera", "camera"), + ("camera-account", "camera-account"), + ("camera-burst", "camera-burst"), + ("camera-control", "camera-control"), + ("camera-document", "camera-document"), + ("camera-document-off", "camera-document-off"), + ("camera-enhance", "camera-enhance"), + ("camera-enhance-outline", "camera-enhance-outline"), + ("camera-flip", "camera-flip"), + ("camera-flip-outline", "camera-flip-outline"), + ("camera-focus", "camera-focus"), + ("camera-front", "camera-front"), + ("camera-front-variant", "camera-front-variant"), + ("camera-gopro", "camera-gopro"), + ("camera-image", "camera-image"), + ("camera-iris", "camera-iris"), + ("camera-lock", "camera-lock"), + ("camera-lock-open", "camera-lock-open"), + ("camera-lock-open-outline", "camera-lock-open-outline"), + ("camera-lock-outline", "camera-lock-outline"), + ("camera-marker", "camera-marker"), + ("camera-marker-outline", "camera-marker-outline"), + ("camera-metering-center", "camera-metering-center"), + ("camera-metering-matrix", "camera-metering-matrix"), + ("camera-metering-partial", "camera-metering-partial"), + ("camera-metering-spot", "camera-metering-spot"), + ("camera-off", "camera-off"), + ("camera-off-outline", "camera-off-outline"), + ("camera-outline", "camera-outline"), + ("camera-party-mode", "camera-party-mode"), + ("camera-plus", "camera-plus"), + ("camera-plus-outline", "camera-plus-outline"), + ("camera-rear", "camera-rear"), + ("camera-rear-variant", "camera-rear-variant"), + ("camera-retake", "camera-retake"), + ("camera-retake-outline", "camera-retake-outline"), + ("camera-switch", "camera-switch"), + ("camera-switch-outline", "camera-switch-outline"), + ("camera-timer", "camera-timer"), + ("camera-wireless", "camera-wireless"), + ("camera-wireless-outline", "camera-wireless-outline"), + ("campfire", "campfire"), + ("cancel", "cancel"), + ("candelabra", "candelabra"), + ("candelabra-fire", "candelabra-fire"), + ("candle", "candle"), + ("candy", "candy"), + ("candy-off", "candy-off"), + ("candy-off-outline", "candy-off-outline"), + ("candy-outline", "candy-outline"), + ("candycane", "candycane"), + ("cannabis", "cannabis"), + ("cannabis-off", "cannabis-off"), + ("caps-lock", "caps-lock"), + ("car", "car"), + ("car-2-plus", "car-2-plus"), + ("car-3-plus", "car-3-plus"), + ("car-arrow-left", "car-arrow-left"), + ("car-arrow-right", "car-arrow-right"), + ("car-back", "car-back"), + ("car-battery", "car-battery"), + ("car-brake-abs", "car-brake-abs"), + ("car-brake-alert", "car-brake-alert"), + ("car-brake-fluid-level", "car-brake-fluid-level"), + ("car-brake-hold", "car-brake-hold"), + ("car-brake-low-pressure", "car-brake-low-pressure"), + ("car-brake-parking", "car-brake-parking"), + ("car-brake-retarder", "car-brake-retarder"), + ("car-brake-temperature", "car-brake-temperature"), + ("car-brake-worn-linings", "car-brake-worn-linings"), + ("car-child-seat", "car-child-seat"), + ("car-clock", "car-clock"), + ("car-clutch", "car-clutch"), + ("car-cog", "car-cog"), + ("car-connected", "car-connected"), + ("car-convertable", "car-convertable"), + ("car-convertible", "car-convertible"), + ("car-coolant-level", "car-coolant-level"), + ("car-cruise-control", "car-cruise-control"), + ("car-defrost-front", "car-defrost-front"), + ("car-defrost-rear", "car-defrost-rear"), + ("car-door", "car-door"), + ("car-door-lock", "car-door-lock"), + ("car-electric", "car-electric"), + ("car-electric-outline", "car-electric-outline"), + ("car-emergency", "car-emergency"), + ("car-esp", "car-esp"), + ("car-estate", "car-estate"), + ("car-hatchback", "car-hatchback"), + ("car-info", "car-info"), + ("car-key", "car-key"), + ("car-lifted-pickup", "car-lifted-pickup"), + ("car-light-alert", "car-light-alert"), + ("car-light-dimmed", "car-light-dimmed"), + ("car-light-fog", "car-light-fog"), + ("car-light-high", "car-light-high"), + ("car-limousine", "car-limousine"), + ("car-multiple", "car-multiple"), + ("car-off", "car-off"), + ("car-outline", "car-outline"), + ("car-parking-lights", "car-parking-lights"), + ("car-pickup", "car-pickup"), + ("car-search", "car-search"), + ("car-search-outline", "car-search-outline"), + ("car-seat", "car-seat"), + ("car-seat-cooler", "car-seat-cooler"), + ("car-seat-heater", "car-seat-heater"), + ("car-select", "car-select"), + ("car-settings", "car-settings"), + ("car-shift-pattern", "car-shift-pattern"), + ("car-side", "car-side"), + ("car-speed-limiter", "car-speed-limiter"), + ("car-sports", "car-sports"), + ("car-tire-alert", "car-tire-alert"), + ("car-traction-control", "car-traction-control"), + ("car-turbocharger", "car-turbocharger"), + ("car-wash", "car-wash"), + ("car-windshield", "car-windshield"), + ("car-windshield-outline", "car-windshield-outline"), + ("car-wireless", "car-wireless"), + ("car-wrench", "car-wrench"), + ("carabiner", "carabiner"), + ("caravan", "caravan"), + ("card", "card"), + ("card-account-details", "card-account-details"), + ("card-account-details-outline", "card-account-details-outline"), + ("card-account-details-star", "card-account-details-star"), + ("card-account-details-star-outline", "card-account-details-star-outline"), + ("card-account-mail", "card-account-mail"), + ("card-account-mail-outline", "card-account-mail-outline"), + ("card-account-phone", "card-account-phone"), + ("card-account-phone-outline", "card-account-phone-outline"), + ("card-bulleted", "card-bulleted"), + ("card-bulleted-off", "card-bulleted-off"), + ("card-bulleted-off-outline", "card-bulleted-off-outline"), + ("card-bulleted-outline", "card-bulleted-outline"), + ("card-bulleted-settings", "card-bulleted-settings"), + ("card-bulleted-settings-outline", "card-bulleted-settings-outline"), + ("card-minus", "card-minus"), + ("card-minus-outline", "card-minus-outline"), + ("card-multiple", "card-multiple"), + ("card-multiple-outline", "card-multiple-outline"), + ("card-off", "card-off"), + ("card-off-outline", "card-off-outline"), + ("card-outline", "card-outline"), + ("card-plus", "card-plus"), + ("card-plus-outline", "card-plus-outline"), + ("card-remove", "card-remove"), + ("card-remove-outline", "card-remove-outline"), + ("card-search", "card-search"), + ("card-search-outline", "card-search-outline"), + ("card-text", "card-text"), + ("card-text-outline", "card-text-outline"), + ("cards", "cards"), + ("cards-club", "cards-club"), + ("cards-club-outline", "cards-club-outline"), + ("cards-diamond", "cards-diamond"), + ("cards-diamond-outline", "cards-diamond-outline"), + ("cards-heart", "cards-heart"), + ("cards-heart-outline", "cards-heart-outline"), + ("cards-outline", "cards-outline"), + ("cards-playing", "cards-playing"), + ("cards-playing-club", "cards-playing-club"), + ("cards-playing-club-multiple", "cards-playing-club-multiple"), + ("cards-playing-club-multiple-outline", "cards-playing-club-multiple-outline"), + ("cards-playing-club-outline", "cards-playing-club-outline"), + ("cards-playing-diamond", "cards-playing-diamond"), + ("cards-playing-diamond-multiple", "cards-playing-diamond-multiple"), + ( + "cards-playing-diamond-multiple-outline", + "cards-playing-diamond-multiple-outline", + ), + ("cards-playing-diamond-outline", "cards-playing-diamond-outline"), + ("cards-playing-heart", "cards-playing-heart"), + ("cards-playing-heart-multiple", "cards-playing-heart-multiple"), + ( + "cards-playing-heart-multiple-outline", + "cards-playing-heart-multiple-outline", + ), + ("cards-playing-heart-outline", "cards-playing-heart-outline"), + ("cards-playing-outline", "cards-playing-outline"), + ("cards-playing-spade", "cards-playing-spade"), + ("cards-playing-spade-multiple", "cards-playing-spade-multiple"), + ( + "cards-playing-spade-multiple-outline", + "cards-playing-spade-multiple-outline", + ), + ("cards-playing-spade-outline", "cards-playing-spade-outline"), + ("cards-spade", "cards-spade"), + ("cards-spade-outline", "cards-spade-outline"), + ("cards-variant", "cards-variant"), + ("carrot", "carrot"), + ("cart", "cart"), + ("cart-arrow-down", "cart-arrow-down"), + ("cart-arrow-right", "cart-arrow-right"), + ("cart-arrow-up", "cart-arrow-up"), + ("cart-check", "cart-check"), + ("cart-heart", "cart-heart"), + ("cart-minus", "cart-minus"), + ("cart-off", "cart-off"), + ("cart-outline", "cart-outline"), + ("cart-percent", "cart-percent"), + ("cart-plus", "cart-plus"), + ("cart-remove", "cart-remove"), + ("cart-variant", "cart-variant"), + ("case-sensitive-alt", "case-sensitive-alt"), + ("cash", "cash"), + ("cash-100", "cash-100"), + ("cash-check", "cash-check"), + ("cash-clock", "cash-clock"), + ("cash-fast", "cash-fast"), + ("cash-lock", "cash-lock"), + ("cash-lock-open", "cash-lock-open"), + ("cash-marker", "cash-marker"), + ("cash-minus", "cash-minus"), + ("cash-multiple", "cash-multiple"), + ("cash-plus", "cash-plus"), + ("cash-refund", "cash-refund"), + ("cash-register", "cash-register"), + ("cash-remove", "cash-remove"), + ("cash-sync", "cash-sync"), + ("cash-usd", "cash-usd"), + ("cash-usd-outline", "cash-usd-outline"), + ("cassette", "cassette"), + ("cast", "cast"), + ("cast-audio", "cast-audio"), + ("cast-audio-variant", "cast-audio-variant"), + ("cast-connected", "cast-connected"), + ("cast-education", "cast-education"), + ("cast-off", "cast-off"), + ("cast-variant", "cast-variant"), + ("castle", "castle"), + ("cat", "cat"), + ("cctv", "cctv"), + ("cctv-off", "cctv-off"), + ("ceiling-fan", "ceiling-fan"), + ("ceiling-fan-light", "ceiling-fan-light"), + ("ceiling-light", "ceiling-light"), + ("ceiling-light-multiple", "ceiling-light-multiple"), + ("ceiling-light-multiple-outline", "ceiling-light-multiple-outline"), + ("ceiling-light-outline", "ceiling-light-outline"), + ("cellphone", "cellphone"), + ("cellphone-android", "cellphone-android"), + ("cellphone-arrow-down", "cellphone-arrow-down"), + ("cellphone-arrow-down-variant", "cellphone-arrow-down-variant"), + ("cellphone-basic", "cellphone-basic"), + ("cellphone-charging", "cellphone-charging"), + ("cellphone-check", "cellphone-check"), + ("cellphone-cog", "cellphone-cog"), + ("cellphone-dock", "cellphone-dock"), + ("cellphone-information", "cellphone-information"), + ("cellphone-iphone", "cellphone-iphone"), + ("cellphone-key", "cellphone-key"), + ("cellphone-link", "cellphone-link"), + ("cellphone-link-off", "cellphone-link-off"), + ("cellphone-lock", "cellphone-lock"), + ("cellphone-marker", "cellphone-marker"), + ("cellphone-message", "cellphone-message"), + ("cellphone-message-off", "cellphone-message-off"), + ("cellphone-nfc", "cellphone-nfc"), + ("cellphone-nfc-off", "cellphone-nfc-off"), + ("cellphone-off", "cellphone-off"), + ("cellphone-play", "cellphone-play"), + ("cellphone-remove", "cellphone-remove"), + ("cellphone-screenshot", "cellphone-screenshot"), + ("cellphone-settings", "cellphone-settings"), + ("cellphone-sound", "cellphone-sound"), + ("cellphone-text", "cellphone-text"), + ("cellphone-wireless", "cellphone-wireless"), + ("centos", "centos"), + ("certificate", "certificate"), + ("certificate-outline", "certificate-outline"), + ("chair-rolling", "chair-rolling"), + ("chair-school", "chair-school"), + ("chandelier", "chandelier"), + ("charity", "charity"), + ("chart-arc", "chart-arc"), + ("chart-areaspline", "chart-areaspline"), + ("chart-areaspline-variant", "chart-areaspline-variant"), + ("chart-bar", "chart-bar"), + ("chart-bar-stacked", "chart-bar-stacked"), + ("chart-bell-curve", "chart-bell-curve"), + ("chart-bell-curve-cumulative", "chart-bell-curve-cumulative"), + ("chart-box", "chart-box"), + ("chart-box-outline", "chart-box-outline"), + ("chart-box-plus-outline", "chart-box-plus-outline"), + ("chart-bubble", "chart-bubble"), + ("chart-donut", "chart-donut"), + ("chart-donut-variant", "chart-donut-variant"), + ("chart-gantt", "chart-gantt"), + ("chart-histogram", "chart-histogram"), + ("chart-line", "chart-line"), + ("chart-line-stacked", "chart-line-stacked"), + ("chart-line-variant", "chart-line-variant"), + ("chart-multiline", "chart-multiline"), + ("chart-multiple", "chart-multiple"), + ("chart-pie", "chart-pie"), + ("chart-pie-outline", "chart-pie-outline"), + ("chart-ppf", "chart-ppf"), + ("chart-sankey", "chart-sankey"), + ("chart-sankey-variant", "chart-sankey-variant"), + ("chart-scatter-plot", "chart-scatter-plot"), + ("chart-scatter-plot-hexbin", "chart-scatter-plot-hexbin"), + ("chart-timeline", "chart-timeline"), + ("chart-timeline-variant", "chart-timeline-variant"), + ("chart-timeline-variant-shimmer", "chart-timeline-variant-shimmer"), + ("chart-tree", "chart-tree"), + ("chart-waterfall", "chart-waterfall"), + ("chat", "chat"), + ("chat-alert", "chat-alert"), + ("chat-alert-outline", "chat-alert-outline"), + ("chat-minus", "chat-minus"), + ("chat-minus-outline", "chat-minus-outline"), + ("chat-outline", "chat-outline"), + ("chat-plus", "chat-plus"), + ("chat-plus-outline", "chat-plus-outline"), + ("chat-processing", "chat-processing"), + ("chat-processing-outline", "chat-processing-outline"), + ("chat-question", "chat-question"), + ("chat-question-outline", "chat-question-outline"), + ("chat-remove", "chat-remove"), + ("chat-remove-outline", "chat-remove-outline"), + ("chat-sleep", "chat-sleep"), + ("chat-sleep-outline", "chat-sleep-outline"), + ("check", "check"), + ("check-all", "check-all"), + ("check-bold", "check-bold"), + ("check-bookmark", "check-bookmark"), + ("check-circle", "check-circle"), + ("check-circle-outline", "check-circle-outline"), + ("check-decagram", "check-decagram"), + ("check-decagram-outline", "check-decagram-outline"), + ("check-network", "check-network"), + ("check-network-outline", "check-network-outline"), + ("check-outline", "check-outline"), + ("check-underline", "check-underline"), + ("check-underline-circle", "check-underline-circle"), + ("check-underline-circle-outline", "check-underline-circle-outline"), + ("checkbook", "checkbook"), + ("checkbox-blank", "checkbox-blank"), + ("checkbox-blank-badge", "checkbox-blank-badge"), + ("checkbox-blank-badge-outline", "checkbox-blank-badge-outline"), + ("checkbox-blank-circle", "checkbox-blank-circle"), + ("checkbox-blank-circle-outline", "checkbox-blank-circle-outline"), + ("checkbox-blank-off", "checkbox-blank-off"), + ("checkbox-blank-off-outline", "checkbox-blank-off-outline"), + ("checkbox-blank-outline", "checkbox-blank-outline"), + ("checkbox-indeterminate", "checkbox-indeterminate"), + ("checkbox-intermediate", "checkbox-intermediate"), + ("checkbox-intermediate-variant", "checkbox-intermediate-variant"), + ("checkbox-marked", "checkbox-marked"), + ("checkbox-marked-circle", "checkbox-marked-circle"), + ("checkbox-marked-circle-outline", "checkbox-marked-circle-outline"), + ("checkbox-marked-circle-plus-outline", "checkbox-marked-circle-plus-outline"), + ("checkbox-marked-outline", "checkbox-marked-outline"), + ("checkbox-multiple-blank", "checkbox-multiple-blank"), + ("checkbox-multiple-blank-circle", "checkbox-multiple-blank-circle"), + ( + "checkbox-multiple-blank-circle-outline", + "checkbox-multiple-blank-circle-outline", + ), + ("checkbox-multiple-blank-outline", "checkbox-multiple-blank-outline"), + ("checkbox-multiple-marked", "checkbox-multiple-marked"), + ("checkbox-multiple-marked-circle", "checkbox-multiple-marked-circle"), + ( + "checkbox-multiple-marked-circle-outline", + "checkbox-multiple-marked-circle-outline", + ), + ("checkbox-multiple-marked-outline", "checkbox-multiple-marked-outline"), + ("checkbox-multiple-outline", "checkbox-multiple-outline"), + ("checkbox-outline", "checkbox-outline"), + ("checkerboard", "checkerboard"), + ("checkerboard-minus", "checkerboard-minus"), + ("checkerboard-plus", "checkerboard-plus"), + ("checkerboard-remove", "checkerboard-remove"), + ("cheese", "cheese"), + ("cheese-off", "cheese-off"), + ("chef-hat", "chef-hat"), + ("chemical-weapon", "chemical-weapon"), + ("chess-bishop", "chess-bishop"), + ("chess-king", "chess-king"), + ("chess-knight", "chess-knight"), + ("chess-pawn", "chess-pawn"), + ("chess-queen", "chess-queen"), + ("chess-rook", "chess-rook"), + ("chevron-double-down", "chevron-double-down"), + ("chevron-double-left", "chevron-double-left"), + ("chevron-double-right", "chevron-double-right"), + ("chevron-double-up", "chevron-double-up"), + ("chevron-down", "chevron-down"), + ("chevron-down-box", "chevron-down-box"), + ("chevron-down-box-outline", "chevron-down-box-outline"), + ("chevron-down-circle", "chevron-down-circle"), + ("chevron-down-circle-outline", "chevron-down-circle-outline"), + ("chevron-left", "chevron-left"), + ("chevron-left-box", "chevron-left-box"), + ("chevron-left-box-outline", "chevron-left-box-outline"), + ("chevron-left-circle", "chevron-left-circle"), + ("chevron-left-circle-outline", "chevron-left-circle-outline"), + ("chevron-right", "chevron-right"), + ("chevron-right-box", "chevron-right-box"), + ("chevron-right-box-outline", "chevron-right-box-outline"), + ("chevron-right-circle", "chevron-right-circle"), + ("chevron-right-circle-outline", "chevron-right-circle-outline"), + ("chevron-triple-down", "chevron-triple-down"), + ("chevron-triple-left", "chevron-triple-left"), + ("chevron-triple-right", "chevron-triple-right"), + ("chevron-triple-up", "chevron-triple-up"), + ("chevron-up", "chevron-up"), + ("chevron-up-box", "chevron-up-box"), + ("chevron-up-box-outline", "chevron-up-box-outline"), + ("chevron-up-circle", "chevron-up-circle"), + ("chevron-up-circle-outline", "chevron-up-circle-outline"), + ("chili-alert", "chili-alert"), + ("chili-alert-outline", "chili-alert-outline"), + ("chili-hot", "chili-hot"), + ("chili-hot-outline", "chili-hot-outline"), + ("chili-medium", "chili-medium"), + ("chili-medium-outline", "chili-medium-outline"), + ("chili-mild", "chili-mild"), + ("chili-mild-outline", "chili-mild-outline"), + ("chili-off", "chili-off"), + ("chili-off-outline", "chili-off-outline"), + ("chip", "chip"), + ("church", "church"), + ("church-outline", "church-outline"), + ("cigar", "cigar"), + ("cigar-off", "cigar-off"), + ("circle", "circle"), + ("circle-box", "circle-box"), + ("circle-box-outline", "circle-box-outline"), + ("circle-double", "circle-double"), + ("circle-edit-outline", "circle-edit-outline"), + ("circle-expand", "circle-expand"), + ("circle-half", "circle-half"), + ("circle-half-full", "circle-half-full"), + ("circle-medium", "circle-medium"), + ("circle-multiple", "circle-multiple"), + ("circle-multiple-outline", "circle-multiple-outline"), + ("circle-off-outline", "circle-off-outline"), + ("circle-opacity", "circle-opacity"), + ("circle-outline", "circle-outline"), + ("circle-slice-1", "circle-slice-1"), + ("circle-slice-2", "circle-slice-2"), + ("circle-slice-3", "circle-slice-3"), + ("circle-slice-4", "circle-slice-4"), + ("circle-slice-5", "circle-slice-5"), + ("circle-slice-6", "circle-slice-6"), + ("circle-slice-7", "circle-slice-7"), + ("circle-slice-8", "circle-slice-8"), + ("circle-small", "circle-small"), + ("circular-saw", "circular-saw"), + ("cisco-webex", "cisco-webex"), + ("city", "city"), + ("city-variant", "city-variant"), + ("city-variant-outline", "city-variant-outline"), + ("clipboard", "clipboard"), + ("clipboard-account", "clipboard-account"), + ("clipboard-account-outline", "clipboard-account-outline"), + ("clipboard-alert", "clipboard-alert"), + ("clipboard-alert-outline", "clipboard-alert-outline"), + ("clipboard-arrow-down", "clipboard-arrow-down"), + ("clipboard-arrow-down-outline", "clipboard-arrow-down-outline"), + ("clipboard-arrow-left", "clipboard-arrow-left"), + ("clipboard-arrow-left-outline", "clipboard-arrow-left-outline"), + ("clipboard-arrow-right", "clipboard-arrow-right"), + ("clipboard-arrow-right-outline", "clipboard-arrow-right-outline"), + ("clipboard-arrow-up", "clipboard-arrow-up"), + ("clipboard-arrow-up-outline", "clipboard-arrow-up-outline"), + ("clipboard-check", "clipboard-check"), + ("clipboard-check-multiple", "clipboard-check-multiple"), + ("clipboard-check-multiple-outline", "clipboard-check-multiple-outline"), + ("clipboard-check-outline", "clipboard-check-outline"), + ("clipboard-clock", "clipboard-clock"), + ("clipboard-clock-outline", "clipboard-clock-outline"), + ("clipboard-edit", "clipboard-edit"), + ("clipboard-edit-outline", "clipboard-edit-outline"), + ("clipboard-file", "clipboard-file"), + ("clipboard-file-outline", "clipboard-file-outline"), + ("clipboard-flow", "clipboard-flow"), + ("clipboard-flow-outline", "clipboard-flow-outline"), + ("clipboard-list", "clipboard-list"), + ("clipboard-list-outline", "clipboard-list-outline"), + ("clipboard-minus", "clipboard-minus"), + ("clipboard-minus-outline", "clipboard-minus-outline"), + ("clipboard-multiple", "clipboard-multiple"), + ("clipboard-multiple-outline", "clipboard-multiple-outline"), + ("clipboard-off", "clipboard-off"), + ("clipboard-off-outline", "clipboard-off-outline"), + ("clipboard-outline", "clipboard-outline"), + ("clipboard-play", "clipboard-play"), + ("clipboard-play-multiple", "clipboard-play-multiple"), + ("clipboard-play-multiple-outline", "clipboard-play-multiple-outline"), + ("clipboard-play-outline", "clipboard-play-outline"), + ("clipboard-plus", "clipboard-plus"), + ("clipboard-plus-outline", "clipboard-plus-outline"), + ("clipboard-pulse", "clipboard-pulse"), + ("clipboard-pulse-outline", "clipboard-pulse-outline"), + ("clipboard-remove", "clipboard-remove"), + ("clipboard-remove-outline", "clipboard-remove-outline"), + ("clipboard-search", "clipboard-search"), + ("clipboard-search-outline", "clipboard-search-outline"), + ("clipboard-text", "clipboard-text"), + ("clipboard-text-clock", "clipboard-text-clock"), + ("clipboard-text-clock-outline", "clipboard-text-clock-outline"), + ("clipboard-text-multiple", "clipboard-text-multiple"), + ("clipboard-text-multiple-outline", "clipboard-text-multiple-outline"), + ("clipboard-text-off", "clipboard-text-off"), + ("clipboard-text-off-outline", "clipboard-text-off-outline"), + ("clipboard-text-outline", "clipboard-text-outline"), + ("clipboard-text-play", "clipboard-text-play"), + ("clipboard-text-play-outline", "clipboard-text-play-outline"), + ("clipboard-text-search", "clipboard-text-search"), + ("clipboard-text-search-outline", "clipboard-text-search-outline"), + ("clippy", "clippy"), + ("clock", "clock"), + ("clock-alert", "clock-alert"), + ("clock-alert-outline", "clock-alert-outline"), + ("clock-check", "clock-check"), + ("clock-check-outline", "clock-check-outline"), + ("clock-digital", "clock-digital"), + ("clock-edit", "clock-edit"), + ("clock-edit-outline", "clock-edit-outline"), + ("clock-end", "clock-end"), + ("clock-fast", "clock-fast"), + ("clock-in", "clock-in"), + ("clock-minus", "clock-minus"), + ("clock-minus-outline", "clock-minus-outline"), + ("clock-out", "clock-out"), + ("clock-outline", "clock-outline"), + ("clock-plus", "clock-plus"), + ("clock-plus-outline", "clock-plus-outline"), + ("clock-remove", "clock-remove"), + ("clock-remove-outline", "clock-remove-outline"), + ("clock-start", "clock-start"), + ("clock-time-eight", "clock-time-eight"), + ("clock-time-eight-outline", "clock-time-eight-outline"), + ("clock-time-eleven", "clock-time-eleven"), + ("clock-time-eleven-outline", "clock-time-eleven-outline"), + ("clock-time-five", "clock-time-five"), + ("clock-time-five-outline", "clock-time-five-outline"), + ("clock-time-four", "clock-time-four"), + ("clock-time-four-outline", "clock-time-four-outline"), + ("clock-time-nine", "clock-time-nine"), + ("clock-time-nine-outline", "clock-time-nine-outline"), + ("clock-time-one", "clock-time-one"), + ("clock-time-one-outline", "clock-time-one-outline"), + ("clock-time-seven", "clock-time-seven"), + ("clock-time-seven-outline", "clock-time-seven-outline"), + ("clock-time-six", "clock-time-six"), + ("clock-time-six-outline", "clock-time-six-outline"), + ("clock-time-ten", "clock-time-ten"), + ("clock-time-ten-outline", "clock-time-ten-outline"), + ("clock-time-three", "clock-time-three"), + ("clock-time-three-outline", "clock-time-three-outline"), + ("clock-time-twelve", "clock-time-twelve"), + ("clock-time-twelve-outline", "clock-time-twelve-outline"), + ("clock-time-two", "clock-time-two"), + ("clock-time-two-outline", "clock-time-two-outline"), + ("close", "close"), + ("close-box", "close-box"), + ("close-box-multiple", "close-box-multiple"), + ("close-box-multiple-outline", "close-box-multiple-outline"), + ("close-box-outline", "close-box-outline"), + ("close-circle", "close-circle"), + ("close-circle-multiple", "close-circle-multiple"), + ("close-circle-multiple-outline", "close-circle-multiple-outline"), + ("close-circle-outline", "close-circle-outline"), + ("close-network", "close-network"), + ("close-network-outline", "close-network-outline"), + ("close-octagon", "close-octagon"), + ("close-octagon-outline", "close-octagon-outline"), + ("close-outline", "close-outline"), + ("close-thick", "close-thick"), + ("closed-caption", "closed-caption"), + ("closed-caption-outline", "closed-caption-outline"), + ("cloud", "cloud"), + ("cloud-alert", "cloud-alert"), + ("cloud-alert-outline", "cloud-alert-outline"), + ("cloud-arrow-down", "cloud-arrow-down"), + ("cloud-arrow-down-outline", "cloud-arrow-down-outline"), + ("cloud-arrow-left", "cloud-arrow-left"), + ("cloud-arrow-left-outline", "cloud-arrow-left-outline"), + ("cloud-arrow-right", "cloud-arrow-right"), + ("cloud-arrow-right-outline", "cloud-arrow-right-outline"), + ("cloud-arrow-up", "cloud-arrow-up"), + ("cloud-arrow-up-outline", "cloud-arrow-up-outline"), + ("cloud-braces", "cloud-braces"), + ("cloud-cancel", "cloud-cancel"), + ("cloud-cancel-outline", "cloud-cancel-outline"), + ("cloud-check", "cloud-check"), + ("cloud-check-outline", "cloud-check-outline"), + ("cloud-check-variant", "cloud-check-variant"), + ("cloud-check-variant-outline", "cloud-check-variant-outline"), + ("cloud-circle", "cloud-circle"), + ("cloud-circle-outline", "cloud-circle-outline"), + ("cloud-clock", "cloud-clock"), + ("cloud-clock-outline", "cloud-clock-outline"), + ("cloud-cog", "cloud-cog"), + ("cloud-cog-outline", "cloud-cog-outline"), + ("cloud-download", "cloud-download"), + ("cloud-download-outline", "cloud-download-outline"), + ("cloud-lock", "cloud-lock"), + ("cloud-lock-open", "cloud-lock-open"), + ("cloud-lock-open-outline", "cloud-lock-open-outline"), + ("cloud-lock-outline", "cloud-lock-outline"), + ("cloud-minus", "cloud-minus"), + ("cloud-minus-outline", "cloud-minus-outline"), + ("cloud-off", "cloud-off"), + ("cloud-off-outline", "cloud-off-outline"), + ("cloud-outline", "cloud-outline"), + ("cloud-percent", "cloud-percent"), + ("cloud-percent-outline", "cloud-percent-outline"), + ("cloud-plus", "cloud-plus"), + ("cloud-plus-outline", "cloud-plus-outline"), + ("cloud-print", "cloud-print"), + ("cloud-print-outline", "cloud-print-outline"), + ("cloud-question", "cloud-question"), + ("cloud-question-outline", "cloud-question-outline"), + ("cloud-refresh", "cloud-refresh"), + ("cloud-refresh-outline", "cloud-refresh-outline"), + ("cloud-refresh-variant", "cloud-refresh-variant"), + ("cloud-refresh-variant-outline", "cloud-refresh-variant-outline"), + ("cloud-remove", "cloud-remove"), + ("cloud-remove-outline", "cloud-remove-outline"), + ("cloud-search", "cloud-search"), + ("cloud-search-outline", "cloud-search-outline"), + ("cloud-sync", "cloud-sync"), + ("cloud-sync-outline", "cloud-sync-outline"), + ("cloud-tags", "cloud-tags"), + ("cloud-upload", "cloud-upload"), + ("cloud-upload-outline", "cloud-upload-outline"), + ("clouds", "clouds"), + ("clover", "clover"), + ("coach-lamp", "coach-lamp"), + ("coach-lamp-variant", "coach-lamp-variant"), + ("coat-rack", "coat-rack"), + ("code-array", "code-array"), + ("code-braces", "code-braces"), + ("code-braces-box", "code-braces-box"), + ("code-brackets", "code-brackets"), + ("code-equal", "code-equal"), + ("code-greater-than", "code-greater-than"), + ("code-greater-than-or-equal", "code-greater-than-or-equal"), + ("code-json", "code-json"), + ("code-less-than", "code-less-than"), + ("code-less-than-or-equal", "code-less-than-or-equal"), + ("code-not-equal", "code-not-equal"), + ("code-not-equal-variant", "code-not-equal-variant"), + ("code-parentheses", "code-parentheses"), + ("code-parentheses-box", "code-parentheses-box"), + ("code-string", "code-string"), + ("code-tags", "code-tags"), + ("code-tags-check", "code-tags-check"), + ("codepen", "codepen"), + ("coffee", "coffee"), + ("coffee-maker", "coffee-maker"), + ("coffee-maker-check", "coffee-maker-check"), + ("coffee-maker-check-outline", "coffee-maker-check-outline"), + ("coffee-maker-outline", "coffee-maker-outline"), + ("coffee-off", "coffee-off"), + ("coffee-off-outline", "coffee-off-outline"), + ("coffee-outline", "coffee-outline"), + ("coffee-to-go", "coffee-to-go"), + ("coffee-to-go-outline", "coffee-to-go-outline"), + ("coffin", "coffin"), + ("cog", "cog"), + ("cog-box", "cog-box"), + ("cog-clockwise", "cog-clockwise"), + ("cog-counterclockwise", "cog-counterclockwise"), + ("cog-off", "cog-off"), + ("cog-off-outline", "cog-off-outline"), + ("cog-outline", "cog-outline"), + ("cog-pause", "cog-pause"), + ("cog-pause-outline", "cog-pause-outline"), + ("cog-play", "cog-play"), + ("cog-play-outline", "cog-play-outline"), + ("cog-refresh", "cog-refresh"), + ("cog-refresh-outline", "cog-refresh-outline"), + ("cog-stop", "cog-stop"), + ("cog-stop-outline", "cog-stop-outline"), + ("cog-sync", "cog-sync"), + ("cog-sync-outline", "cog-sync-outline"), + ("cog-transfer", "cog-transfer"), + ("cog-transfer-outline", "cog-transfer-outline"), + ("cogs", "cogs"), + ("collage", "collage"), + ("collapse-all", "collapse-all"), + ("collapse-all-outline", "collapse-all-outline"), + ("color-helper", "color-helper"), + ("comma", "comma"), + ("comma-box", "comma-box"), + ("comma-box-outline", "comma-box-outline"), + ("comma-circle", "comma-circle"), + ("comma-circle-outline", "comma-circle-outline"), + ("comment", "comment"), + ("comment-account", "comment-account"), + ("comment-account-outline", "comment-account-outline"), + ("comment-alert", "comment-alert"), + ("comment-alert-outline", "comment-alert-outline"), + ("comment-arrow-left", "comment-arrow-left"), + ("comment-arrow-left-outline", "comment-arrow-left-outline"), + ("comment-arrow-right", "comment-arrow-right"), + ("comment-arrow-right-outline", "comment-arrow-right-outline"), + ("comment-bookmark", "comment-bookmark"), + ("comment-bookmark-outline", "comment-bookmark-outline"), + ("comment-check", "comment-check"), + ("comment-check-outline", "comment-check-outline"), + ("comment-edit", "comment-edit"), + ("comment-edit-outline", "comment-edit-outline"), + ("comment-eye", "comment-eye"), + ("comment-eye-outline", "comment-eye-outline"), + ("comment-flash", "comment-flash"), + ("comment-flash-outline", "comment-flash-outline"), + ("comment-minus", "comment-minus"), + ("comment-minus-outline", "comment-minus-outline"), + ("comment-multiple", "comment-multiple"), + ("comment-multiple-outline", "comment-multiple-outline"), + ("comment-off", "comment-off"), + ("comment-off-outline", "comment-off-outline"), + ("comment-outline", "comment-outline"), + ("comment-plus", "comment-plus"), + ("comment-plus-outline", "comment-plus-outline"), + ("comment-processing", "comment-processing"), + ("comment-processing-outline", "comment-processing-outline"), + ("comment-question", "comment-question"), + ("comment-question-outline", "comment-question-outline"), + ("comment-quote", "comment-quote"), + ("comment-quote-outline", "comment-quote-outline"), + ("comment-remove", "comment-remove"), + ("comment-remove-outline", "comment-remove-outline"), + ("comment-search", "comment-search"), + ("comment-search-outline", "comment-search-outline"), + ("comment-text", "comment-text"), + ("comment-text-multiple", "comment-text-multiple"), + ("comment-text-multiple-outline", "comment-text-multiple-outline"), + ("comment-text-outline", "comment-text-outline"), + ("compare", "compare"), + ("compare-horizontal", "compare-horizontal"), + ("compare-remove", "compare-remove"), + ("compare-vertical", "compare-vertical"), + ("compass", "compass"), + ("compass-off", "compass-off"), + ("compass-off-outline", "compass-off-outline"), + ("compass-outline", "compass-outline"), + ("compass-rose", "compass-rose"), + ("compost", "compost"), + ("concourse-ci", "concourse-ci"), + ("cone", "cone"), + ("cone-off", "cone-off"), + ("connection", "connection"), + ("console", "console"), + ("console-line", "console-line"), + ("console-network", "console-network"), + ("console-network-outline", "console-network-outline"), + ("consolidate", "consolidate"), + ("contactless-payment", "contactless-payment"), + ("contactless-payment-circle", "contactless-payment-circle"), + ("contactless-payment-circle-outline", "contactless-payment-circle-outline"), + ("contacts", "contacts"), + ("contacts-outline", "contacts-outline"), + ("contain", "contain"), + ("contain-end", "contain-end"), + ("contain-start", "contain-start"), + ("content-copy", "content-copy"), + ("content-cut", "content-cut"), + ("content-duplicate", "content-duplicate"), + ("content-paste", "content-paste"), + ("content-save", "content-save"), + ("content-save-alert", "content-save-alert"), + ("content-save-alert-outline", "content-save-alert-outline"), + ("content-save-all", "content-save-all"), + ("content-save-all-outline", "content-save-all-outline"), + ("content-save-check", "content-save-check"), + ("content-save-check-outline", "content-save-check-outline"), + ("content-save-cog", "content-save-cog"), + ("content-save-cog-outline", "content-save-cog-outline"), + ("content-save-edit", "content-save-edit"), + ("content-save-edit-outline", "content-save-edit-outline"), + ("content-save-minus", "content-save-minus"), + ("content-save-minus-outline", "content-save-minus-outline"), + ("content-save-move", "content-save-move"), + ("content-save-move-outline", "content-save-move-outline"), + ("content-save-off", "content-save-off"), + ("content-save-off-outline", "content-save-off-outline"), + ("content-save-outline", "content-save-outline"), + ("content-save-plus", "content-save-plus"), + ("content-save-plus-outline", "content-save-plus-outline"), + ("content-save-settings", "content-save-settings"), + ("content-save-settings-outline", "content-save-settings-outline"), + ("contrast", "contrast"), + ("contrast-box", "contrast-box"), + ("contrast-circle", "contrast-circle"), + ("controller", "controller"), + ("controller-classic", "controller-classic"), + ("controller-classic-outline", "controller-classic-outline"), + ("controller-off", "controller-off"), + ("controller-xbox", "controller-xbox"), + ("cookie", "cookie"), + ("cookie-alert", "cookie-alert"), + ("cookie-alert-outline", "cookie-alert-outline"), + ("cookie-check", "cookie-check"), + ("cookie-check-outline", "cookie-check-outline"), + ("cookie-clock", "cookie-clock"), + ("cookie-clock-outline", "cookie-clock-outline"), + ("cookie-cog", "cookie-cog"), + ("cookie-cog-outline", "cookie-cog-outline"), + ("cookie-edit", "cookie-edit"), + ("cookie-edit-outline", "cookie-edit-outline"), + ("cookie-lock", "cookie-lock"), + ("cookie-lock-outline", "cookie-lock-outline"), + ("cookie-minus", "cookie-minus"), + ("cookie-minus-outline", "cookie-minus-outline"), + ("cookie-off", "cookie-off"), + ("cookie-off-outline", "cookie-off-outline"), + ("cookie-outline", "cookie-outline"), + ("cookie-plus", "cookie-plus"), + ("cookie-plus-outline", "cookie-plus-outline"), + ("cookie-refresh", "cookie-refresh"), + ("cookie-refresh-outline", "cookie-refresh-outline"), + ("cookie-remove", "cookie-remove"), + ("cookie-remove-outline", "cookie-remove-outline"), + ("cookie-settings", "cookie-settings"), + ("cookie-settings-outline", "cookie-settings-outline"), + ("coolant-temperature", "coolant-temperature"), + ("copyleft", "copyleft"), + ("copyright", "copyright"), + ("cordova", "cordova"), + ("corn", "corn"), + ("corn-off", "corn-off"), + ("cosine-wave", "cosine-wave"), + ("counter", "counter"), + ("countertop", "countertop"), + ("countertop-outline", "countertop-outline"), + ("cow", "cow"), + ("cow-off", "cow-off"), + ("cpu-32-bit", "cpu-32-bit"), + ("cpu-64-bit", "cpu-64-bit"), + ("cradle", "cradle"), + ("cradle-outline", "cradle-outline"), + ("crane", "crane"), + ("creation", "creation"), + ("creative-commons", "creative-commons"), + ("credit-card", "credit-card"), + ("credit-card-check", "credit-card-check"), + ("credit-card-check-outline", "credit-card-check-outline"), + ("credit-card-chip", "credit-card-chip"), + ("credit-card-chip-outline", "credit-card-chip-outline"), + ("credit-card-clock", "credit-card-clock"), + ("credit-card-clock-outline", "credit-card-clock-outline"), + ("credit-card-edit", "credit-card-edit"), + ("credit-card-edit-outline", "credit-card-edit-outline"), + ("credit-card-fast", "credit-card-fast"), + ("credit-card-fast-outline", "credit-card-fast-outline"), + ("credit-card-lock", "credit-card-lock"), + ("credit-card-lock-outline", "credit-card-lock-outline"), + ("credit-card-marker", "credit-card-marker"), + ("credit-card-marker-outline", "credit-card-marker-outline"), + ("credit-card-minus", "credit-card-minus"), + ("credit-card-minus-outline", "credit-card-minus-outline"), + ("credit-card-multiple", "credit-card-multiple"), + ("credit-card-multiple-outline", "credit-card-multiple-outline"), + ("credit-card-off", "credit-card-off"), + ("credit-card-off-outline", "credit-card-off-outline"), + ("credit-card-outline", "credit-card-outline"), + ("credit-card-plus", "credit-card-plus"), + ("credit-card-plus-outline", "credit-card-plus-outline"), + ("credit-card-refresh", "credit-card-refresh"), + ("credit-card-refresh-outline", "credit-card-refresh-outline"), + ("credit-card-refund", "credit-card-refund"), + ("credit-card-refund-outline", "credit-card-refund-outline"), + ("credit-card-remove", "credit-card-remove"), + ("credit-card-remove-outline", "credit-card-remove-outline"), + ("credit-card-scan", "credit-card-scan"), + ("credit-card-scan-outline", "credit-card-scan-outline"), + ("credit-card-search", "credit-card-search"), + ("credit-card-search-outline", "credit-card-search-outline"), + ("credit-card-settings", "credit-card-settings"), + ("credit-card-settings-outline", "credit-card-settings-outline"), + ("credit-card-sync", "credit-card-sync"), + ("credit-card-sync-outline", "credit-card-sync-outline"), + ("credit-card-wireless", "credit-card-wireless"), + ("credit-card-wireless-off", "credit-card-wireless-off"), + ("credit-card-wireless-off-outline", "credit-card-wireless-off-outline"), + ("credit-card-wireless-outline", "credit-card-wireless-outline"), + ("cricket", "cricket"), + ("crop", "crop"), + ("crop-free", "crop-free"), + ("crop-landscape", "crop-landscape"), + ("crop-portrait", "crop-portrait"), + ("crop-rotate", "crop-rotate"), + ("crop-square", "crop-square"), + ("cross", "cross"), + ("cross-bolnisi", "cross-bolnisi"), + ("cross-celtic", "cross-celtic"), + ("cross-outline", "cross-outline"), + ("crosshairs", "crosshairs"), + ("crosshairs-gps", "crosshairs-gps"), + ("crosshairs-off", "crosshairs-off"), + ("crosshairs-question", "crosshairs-question"), + ("crowd", "crowd"), + ("crown", "crown"), + ("crown-circle", "crown-circle"), + ("crown-circle-outline", "crown-circle-outline"), + ("crown-outline", "crown-outline"), + ("cryengine", "cryengine"), + ("crystal-ball", "crystal-ball"), + ("cube", "cube"), + ("cube-off", "cube-off"), + ("cube-off-outline", "cube-off-outline"), + ("cube-outline", "cube-outline"), + ("cube-scan", "cube-scan"), + ("cube-send", "cube-send"), + ("cube-unfolded", "cube-unfolded"), + ("cup", "cup"), + ("cup-off", "cup-off"), + ("cup-off-outline", "cup-off-outline"), + ("cup-outline", "cup-outline"), + ("cup-water", "cup-water"), + ("cupboard", "cupboard"), + ("cupboard-outline", "cupboard-outline"), + ("cupcake", "cupcake"), + ("curling", "curling"), + ("currency-bdt", "currency-bdt"), + ("currency-brl", "currency-brl"), + ("currency-btc", "currency-btc"), + ("currency-chf", "currency-chf"), + ("currency-cny", "currency-cny"), + ("currency-eth", "currency-eth"), + ("currency-eur", "currency-eur"), + ("currency-eur-off", "currency-eur-off"), + ("currency-fra", "currency-fra"), + ("currency-gbp", "currency-gbp"), + ("currency-ils", "currency-ils"), + ("currency-inr", "currency-inr"), + ("currency-jpy", "currency-jpy"), + ("currency-krw", "currency-krw"), + ("currency-kzt", "currency-kzt"), + ("currency-mnt", "currency-mnt"), + ("currency-ngn", "currency-ngn"), + ("currency-php", "currency-php"), + ("currency-rial", "currency-rial"), + ("currency-rub", "currency-rub"), + ("currency-rupee", "currency-rupee"), + ("currency-sign", "currency-sign"), + ("currency-thb", "currency-thb"), + ("currency-try", "currency-try"), + ("currency-twd", "currency-twd"), + ("currency-uah", "currency-uah"), + ("currency-usd", "currency-usd"), + ("currency-usd-circle", "currency-usd-circle"), + ("currency-usd-circle-outline", "currency-usd-circle-outline"), + ("currency-usd-off", "currency-usd-off"), + ("current-ac", "current-ac"), + ("current-dc", "current-dc"), + ("cursor-default", "cursor-default"), + ("cursor-default-click", "cursor-default-click"), + ("cursor-default-click-outline", "cursor-default-click-outline"), + ("cursor-default-gesture", "cursor-default-gesture"), + ("cursor-default-gesture-outline", "cursor-default-gesture-outline"), + ("cursor-default-outline", "cursor-default-outline"), + ("cursor-move", "cursor-move"), + ("cursor-pointer", "cursor-pointer"), + ("cursor-text", "cursor-text"), + ("curtains", "curtains"), + ("curtains-closed", "curtains-closed"), + ("cylinder", "cylinder"), + ("cylinder-off", "cylinder-off"), + ("dance-ballroom", "dance-ballroom"), + ("dance-pole", "dance-pole"), + ("data", "data"), + ("data-matrix", "data-matrix"), + ("data-matrix-edit", "data-matrix-edit"), + ("data-matrix-minus", "data-matrix-minus"), + ("data-matrix-plus", "data-matrix-plus"), + ("data-matrix-remove", "data-matrix-remove"), + ("data-matrix-scan", "data-matrix-scan"), + ("database", "database"), + ("database-alert", "database-alert"), + ("database-alert-outline", "database-alert-outline"), + ("database-arrow-down", "database-arrow-down"), + ("database-arrow-down-outline", "database-arrow-down-outline"), + ("database-arrow-left", "database-arrow-left"), + ("database-arrow-left-outline", "database-arrow-left-outline"), + ("database-arrow-right", "database-arrow-right"), + ("database-arrow-right-outline", "database-arrow-right-outline"), + ("database-arrow-up", "database-arrow-up"), + ("database-arrow-up-outline", "database-arrow-up-outline"), + ("database-check", "database-check"), + ("database-check-outline", "database-check-outline"), + ("database-clock", "database-clock"), + ("database-clock-outline", "database-clock-outline"), + ("database-cog", "database-cog"), + ("database-cog-outline", "database-cog-outline"), + ("database-edit", "database-edit"), + ("database-edit-outline", "database-edit-outline"), + ("database-export", "database-export"), + ("database-export-outline", "database-export-outline"), + ("database-eye", "database-eye"), + ("database-eye-off", "database-eye-off"), + ("database-eye-off-outline", "database-eye-off-outline"), + ("database-eye-outline", "database-eye-outline"), + ("database-import", "database-import"), + ("database-import-outline", "database-import-outline"), + ("database-lock", "database-lock"), + ("database-lock-outline", "database-lock-outline"), + ("database-marker", "database-marker"), + ("database-marker-outline", "database-marker-outline"), + ("database-minus", "database-minus"), + ("database-minus-outline", "database-minus-outline"), + ("database-off", "database-off"), + ("database-off-outline", "database-off-outline"), + ("database-outline", "database-outline"), + ("database-plus", "database-plus"), + ("database-plus-outline", "database-plus-outline"), + ("database-refresh", "database-refresh"), + ("database-refresh-outline", "database-refresh-outline"), + ("database-remove", "database-remove"), + ("database-remove-outline", "database-remove-outline"), + ("database-search", "database-search"), + ("database-search-outline", "database-search-outline"), + ("database-settings", "database-settings"), + ("database-settings-outline", "database-settings-outline"), + ("database-sync", "database-sync"), + ("database-sync-outline", "database-sync-outline"), + ("death-star", "death-star"), + ("death-star-variant", "death-star-variant"), + ("deathly-hallows", "deathly-hallows"), + ("debian", "debian"), + ("debug-step-into", "debug-step-into"), + ("debug-step-out", "debug-step-out"), + ("debug-step-over", "debug-step-over"), + ("decagram", "decagram"), + ("decagram-outline", "decagram-outline"), + ("decimal", "decimal"), + ("decimal-comma", "decimal-comma"), + ("decimal-comma-decrease", "decimal-comma-decrease"), + ("decimal-comma-increase", "decimal-comma-increase"), + ("decimal-decrease", "decimal-decrease"), + ("decimal-increase", "decimal-increase"), + ("delete", "delete"), + ("delete-alert", "delete-alert"), + ("delete-alert-outline", "delete-alert-outline"), + ("delete-circle", "delete-circle"), + ("delete-circle-outline", "delete-circle-outline"), + ("delete-clock", "delete-clock"), + ("delete-clock-outline", "delete-clock-outline"), + ("delete-empty", "delete-empty"), + ("delete-empty-outline", "delete-empty-outline"), + ("delete-forever", "delete-forever"), + ("delete-forever-outline", "delete-forever-outline"), + ("delete-off", "delete-off"), + ("delete-off-outline", "delete-off-outline"), + ("delete-outline", "delete-outline"), + ("delete-restore", "delete-restore"), + ("delete-sweep", "delete-sweep"), + ("delete-sweep-outline", "delete-sweep-outline"), + ("delete-variant", "delete-variant"), + ("delta", "delta"), + ("desk", "desk"), + ("desk-lamp", "desk-lamp"), + ("desk-lamp-off", "desk-lamp-off"), + ("desk-lamp-on", "desk-lamp-on"), + ("deskphone", "deskphone"), + ("desktop-classic", "desktop-classic"), + ("desktop-mac", "desktop-mac"), + ("desktop-mac-dashboard", "desktop-mac-dashboard"), + ("desktop-tower", "desktop-tower"), + ("desktop-tower-monitor", "desktop-tower-monitor"), + ("details", "details"), + ("dev-to", "dev-to"), + ("developer-board", "developer-board"), + ("deviantart", "deviantart"), + ("devices", "devices"), + ("dharmachakra", "dharmachakra"), + ("diabetes", "diabetes"), + ("dialpad", "dialpad"), + ("diameter", "diameter"), + ("diameter-outline", "diameter-outline"), + ("diameter-variant", "diameter-variant"), + ("diamond", "diamond"), + ("diamond-outline", "diamond-outline"), + ("diamond-stone", "diamond-stone"), + ("dice", "dice"), + ("dice-1", "dice-1"), + ("dice-1-outline", "dice-1-outline"), + ("dice-2", "dice-2"), + ("dice-2-outline", "dice-2-outline"), + ("dice-3", "dice-3"), + ("dice-3-outline", "dice-3-outline"), + ("dice-4", "dice-4"), + ("dice-4-outline", "dice-4-outline"), + ("dice-5", "dice-5"), + ("dice-5-outline", "dice-5-outline"), + ("dice-6", "dice-6"), + ("dice-6-outline", "dice-6-outline"), + ("dice-d10", "dice-d10"), + ("dice-d10-outline", "dice-d10-outline"), + ("dice-d12", "dice-d12"), + ("dice-d12-outline", "dice-d12-outline"), + ("dice-d20", "dice-d20"), + ("dice-d20-outline", "dice-d20-outline"), + ("dice-d4", "dice-d4"), + ("dice-d4-outline", "dice-d4-outline"), + ("dice-d6", "dice-d6"), + ("dice-d6-outline", "dice-d6-outline"), + ("dice-d8", "dice-d8"), + ("dice-d8-outline", "dice-d8-outline"), + ("dice-multiple", "dice-multiple"), + ("dice-multiple-outline", "dice-multiple-outline"), + ("digital-ocean", "digital-ocean"), + ("dip-switch", "dip-switch"), + ("directions", "directions"), + ("directions-fork", "directions-fork"), + ("disc", "disc"), + ("disc-alert", "disc-alert"), + ("disc-player", "disc-player"), + ("discord", "discord"), + ("dishwasher", "dishwasher"), + ("dishwasher-alert", "dishwasher-alert"), + ("dishwasher-off", "dishwasher-off"), + ("disk", "disk"), + ("disk-alert", "disk-alert"), + ("disk-player", "disk-player"), + ("disqus", "disqus"), + ("disqus-outline", "disqus-outline"), + ("distribute-horizontal-center", "distribute-horizontal-center"), + ("distribute-horizontal-left", "distribute-horizontal-left"), + ("distribute-horizontal-right", "distribute-horizontal-right"), + ("distribute-vertical-bottom", "distribute-vertical-bottom"), + ("distribute-vertical-center", "distribute-vertical-center"), + ("distribute-vertical-top", "distribute-vertical-top"), + ("diversify", "diversify"), + ("diving", "diving"), + ("diving-flippers", "diving-flippers"), + ("diving-helmet", "diving-helmet"), + ("diving-scuba", "diving-scuba"), + ("diving-scuba-flag", "diving-scuba-flag"), + ("diving-scuba-mask", "diving-scuba-mask"), + ("diving-scuba-tank", "diving-scuba-tank"), + ("diving-scuba-tank-multiple", "diving-scuba-tank-multiple"), + ("diving-snorkel", "diving-snorkel"), + ("division", "division"), + ("division-box", "division-box"), + ("dlna", "dlna"), + ("dna", "dna"), + ("dns", "dns"), + ("dns-outline", "dns-outline"), + ("do-not-disturb", "do-not-disturb"), + ("dock-bottom", "dock-bottom"), + ("dock-left", "dock-left"), + ("dock-right", "dock-right"), + ("dock-top", "dock-top"), + ("dock-window", "dock-window"), + ("docker", "docker"), + ("doctor", "doctor"), + ("document", "document"), + ("dog", "dog"), + ("dog-service", "dog-service"), + ("dog-side", "dog-side"), + ("dog-side-off", "dog-side-off"), + ("dolby", "dolby"), + ("dolly", "dolly"), + ("dolphin", "dolphin"), + ("domain", "domain"), + ("domain-off", "domain-off"), + ("domain-plus", "domain-plus"), + ("domain-remove", "domain-remove"), + ("dome-light", "dome-light"), + ("domino-mask", "domino-mask"), + ("donkey", "donkey"), + ("door", "door"), + ("door-closed", "door-closed"), + ("door-closed-lock", "door-closed-lock"), + ("door-open", "door-open"), + ("door-sliding", "door-sliding"), + ("door-sliding-lock", "door-sliding-lock"), + ("door-sliding-open", "door-sliding-open"), + ("doorbell", "doorbell"), + ("doorbell-video", "doorbell-video"), + ("dot-net", "dot-net"), + ("dots-circle", "dots-circle"), + ("dots-grid", "dots-grid"), + ("dots-hexagon", "dots-hexagon"), + ("dots-horizontal", "dots-horizontal"), + ("dots-horizontal-circle", "dots-horizontal-circle"), + ("dots-horizontal-circle-outline", "dots-horizontal-circle-outline"), + ("dots-square", "dots-square"), + ("dots-triangle", "dots-triangle"), + ("dots-vertical", "dots-vertical"), + ("dots-vertical-circle", "dots-vertical-circle"), + ("dots-vertical-circle-outline", "dots-vertical-circle-outline"), + ("douban", "douban"), + ("download", "download"), + ("download-box", "download-box"), + ("download-box-outline", "download-box-outline"), + ("download-circle", "download-circle"), + ("download-circle-outline", "download-circle-outline"), + ("download-lock", "download-lock"), + ("download-lock-outline", "download-lock-outline"), + ("download-multiple", "download-multiple"), + ("download-network", "download-network"), + ("download-network-outline", "download-network-outline"), + ("download-off", "download-off"), + ("download-off-outline", "download-off-outline"), + ("download-outline", "download-outline"), + ("drag", "drag"), + ("drag-horizontal", "drag-horizontal"), + ("drag-horizontal-variant", "drag-horizontal-variant"), + ("drag-variant", "drag-variant"), + ("drag-vertical", "drag-vertical"), + ("drag-vertical-variant", "drag-vertical-variant"), + ("drama-masks", "drama-masks"), + ("draw", "draw"), + ("draw-pen", "draw-pen"), + ("drawing", "drawing"), + ("drawing-box", "drawing-box"), + ("dresser", "dresser"), + ("dresser-outline", "dresser-outline"), + ("dribbble", "dribbble"), + ("dribbble-box", "dribbble-box"), + ("drone", "drone"), + ("dropbox", "dropbox"), + ("drupal", "drupal"), + ("duck", "duck"), + ("dumbbell", "dumbbell"), + ("dump-truck", "dump-truck"), + ("ear-hearing", "ear-hearing"), + ("ear-hearing-loop", "ear-hearing-loop"), + ("ear-hearing-off", "ear-hearing-off"), + ("earbuds", "earbuds"), + ("earbuds-off", "earbuds-off"), + ("earbuds-off-outline", "earbuds-off-outline"), + ("earbuds-outline", "earbuds-outline"), + ("earth", "earth"), + ("earth-arrow-right", "earth-arrow-right"), + ("earth-box", "earth-box"), + ("earth-box-minus", "earth-box-minus"), + ("earth-box-off", "earth-box-off"), + ("earth-box-plus", "earth-box-plus"), + ("earth-box-remove", "earth-box-remove"), + ("earth-minus", "earth-minus"), + ("earth-off", "earth-off"), + ("earth-plus", "earth-plus"), + ("earth-remove", "earth-remove"), + ("ebay", "ebay"), + ("egg", "egg"), + ("egg-easter", "egg-easter"), + ("egg-fried", "egg-fried"), + ("egg-off", "egg-off"), + ("egg-off-outline", "egg-off-outline"), + ("egg-outline", "egg-outline"), + ("eiffel-tower", "eiffel-tower"), + ("eight-track", "eight-track"), + ("eject", "eject"), + ("eject-circle", "eject-circle"), + ("eject-circle-outline", "eject-circle-outline"), + ("eject-outline", "eject-outline"), + ("electric-switch", "electric-switch"), + ("electric-switch-closed", "electric-switch-closed"), + ("electron-framework", "electron-framework"), + ("elephant", "elephant"), + ("elevation-decline", "elevation-decline"), + ("elevation-rise", "elevation-rise"), + ("elevator", "elevator"), + ("elevator-down", "elevator-down"), + ("elevator-passenger", "elevator-passenger"), + ("elevator-passenger-off", "elevator-passenger-off"), + ("elevator-passenger-off-outline", "elevator-passenger-off-outline"), + ("elevator-passenger-outline", "elevator-passenger-outline"), + ("elevator-up", "elevator-up"), + ("ellipse", "ellipse"), + ("ellipse-outline", "ellipse-outline"), + ("email", "email"), + ("email-alert", "email-alert"), + ("email-alert-outline", "email-alert-outline"), + ("email-arrow-left", "email-arrow-left"), + ("email-arrow-left-outline", "email-arrow-left-outline"), + ("email-arrow-right", "email-arrow-right"), + ("email-arrow-right-outline", "email-arrow-right-outline"), + ("email-box", "email-box"), + ("email-check", "email-check"), + ("email-check-outline", "email-check-outline"), + ("email-edit", "email-edit"), + ("email-edit-outline", "email-edit-outline"), + ("email-fast", "email-fast"), + ("email-fast-outline", "email-fast-outline"), + ("email-lock", "email-lock"), + ("email-lock-outline", "email-lock-outline"), + ("email-mark-as-unread", "email-mark-as-unread"), + ("email-minus", "email-minus"), + ("email-minus-outline", "email-minus-outline"), + ("email-multiple", "email-multiple"), + ("email-multiple-outline", "email-multiple-outline"), + ("email-newsletter", "email-newsletter"), + ("email-off", "email-off"), + ("email-off-outline", "email-off-outline"), + ("email-open", "email-open"), + ("email-open-multiple", "email-open-multiple"), + ("email-open-multiple-outline", "email-open-multiple-outline"), + ("email-open-outline", "email-open-outline"), + ("email-outline", "email-outline"), + ("email-plus", "email-plus"), + ("email-plus-outline", "email-plus-outline"), + ("email-remove", "email-remove"), + ("email-remove-outline", "email-remove-outline"), + ("email-seal", "email-seal"), + ("email-seal-outline", "email-seal-outline"), + ("email-search", "email-search"), + ("email-search-outline", "email-search-outline"), + ("email-sync", "email-sync"), + ("email-sync-outline", "email-sync-outline"), + ("email-variant", "email-variant"), + ("ember", "ember"), + ("emby", "emby"), + ("emoticon", "emoticon"), + ("emoticon-angry", "emoticon-angry"), + ("emoticon-angry-outline", "emoticon-angry-outline"), + ("emoticon-confused", "emoticon-confused"), + ("emoticon-confused-outline", "emoticon-confused-outline"), + ("emoticon-cool", "emoticon-cool"), + ("emoticon-cool-outline", "emoticon-cool-outline"), + ("emoticon-cry", "emoticon-cry"), + ("emoticon-cry-outline", "emoticon-cry-outline"), + ("emoticon-dead", "emoticon-dead"), + ("emoticon-dead-outline", "emoticon-dead-outline"), + ("emoticon-devil", "emoticon-devil"), + ("emoticon-devil-outline", "emoticon-devil-outline"), + ("emoticon-excited", "emoticon-excited"), + ("emoticon-excited-outline", "emoticon-excited-outline"), + ("emoticon-frown", "emoticon-frown"), + ("emoticon-frown-outline", "emoticon-frown-outline"), + ("emoticon-happy", "emoticon-happy"), + ("emoticon-happy-outline", "emoticon-happy-outline"), + ("emoticon-kiss", "emoticon-kiss"), + ("emoticon-kiss-outline", "emoticon-kiss-outline"), + ("emoticon-lol", "emoticon-lol"), + ("emoticon-lol-outline", "emoticon-lol-outline"), + ("emoticon-neutral", "emoticon-neutral"), + ("emoticon-neutral-outline", "emoticon-neutral-outline"), + ("emoticon-outline", "emoticon-outline"), + ("emoticon-poop", "emoticon-poop"), + ("emoticon-poop-outline", "emoticon-poop-outline"), + ("emoticon-sad", "emoticon-sad"), + ("emoticon-sad-outline", "emoticon-sad-outline"), + ("emoticon-sick", "emoticon-sick"), + ("emoticon-sick-outline", "emoticon-sick-outline"), + ("emoticon-tongue", "emoticon-tongue"), + ("emoticon-tongue-outline", "emoticon-tongue-outline"), + ("emoticon-wink", "emoticon-wink"), + ("emoticon-wink-outline", "emoticon-wink-outline"), + ("engine", "engine"), + ("engine-off", "engine-off"), + ("engine-off-outline", "engine-off-outline"), + ("engine-outline", "engine-outline"), + ("epsilon", "epsilon"), + ("equal", "equal"), + ("equal-box", "equal-box"), + ("equalizer", "equalizer"), + ("equalizer-outline", "equalizer-outline"), + ("eraser", "eraser"), + ("eraser-variant", "eraser-variant"), + ("escalator", "escalator"), + ("escalator-box", "escalator-box"), + ("escalator-down", "escalator-down"), + ("escalator-up", "escalator-up"), + ("eslint", "eslint"), + ("et", "et"), + ("ethereum", "ethereum"), + ("ethernet", "ethernet"), + ("ethernet-cable", "ethernet-cable"), + ("ethernet-cable-off", "ethernet-cable-off"), + ("etsy", "etsy"), + ("ev-plug-ccs1", "ev-plug-ccs1"), + ("ev-plug-ccs2", "ev-plug-ccs2"), + ("ev-plug-chademo", "ev-plug-chademo"), + ("ev-plug-tesla", "ev-plug-tesla"), + ("ev-plug-type1", "ev-plug-type1"), + ("ev-plug-type2", "ev-plug-type2"), + ("ev-station", "ev-station"), + ("eventbrite", "eventbrite"), + ("evernote", "evernote"), + ("excavator", "excavator"), + ("exclamation", "exclamation"), + ("exclamation-thick", "exclamation-thick"), + ("exit-run", "exit-run"), + ("exit-to-app", "exit-to-app"), + ("expand-all", "expand-all"), + ("expand-all-outline", "expand-all-outline"), + ("expansion-card", "expansion-card"), + ("expansion-card-variant", "expansion-card-variant"), + ("exponent", "exponent"), + ("exponent-box", "exponent-box"), + ("export", "export"), + ("export-variant", "export-variant"), + ("eye", "eye"), + ("eye-arrow-left", "eye-arrow-left"), + ("eye-arrow-left-outline", "eye-arrow-left-outline"), + ("eye-arrow-right", "eye-arrow-right"), + ("eye-arrow-right-outline", "eye-arrow-right-outline"), + ("eye-check", "eye-check"), + ("eye-check-outline", "eye-check-outline"), + ("eye-circle", "eye-circle"), + ("eye-circle-outline", "eye-circle-outline"), + ("eye-lock", "eye-lock"), + ("eye-lock-open", "eye-lock-open"), + ("eye-lock-open-outline", "eye-lock-open-outline"), + ("eye-lock-outline", "eye-lock-outline"), + ("eye-minus", "eye-minus"), + ("eye-minus-outline", "eye-minus-outline"), + ("eye-off", "eye-off"), + ("eye-off-outline", "eye-off-outline"), + ("eye-outline", "eye-outline"), + ("eye-plus", "eye-plus"), + ("eye-plus-outline", "eye-plus-outline"), + ("eye-refresh", "eye-refresh"), + ("eye-refresh-outline", "eye-refresh-outline"), + ("eye-remove", "eye-remove"), + ("eye-remove-outline", "eye-remove-outline"), + ("eye-settings", "eye-settings"), + ("eye-settings-outline", "eye-settings-outline"), + ("eyedropper", "eyedropper"), + ("eyedropper-minus", "eyedropper-minus"), + ("eyedropper-off", "eyedropper-off"), + ("eyedropper-plus", "eyedropper-plus"), + ("eyedropper-remove", "eyedropper-remove"), + ("eyedropper-variant", "eyedropper-variant"), + ("face-agent", "face-agent"), + ("face-man", "face-man"), + ("face-man-outline", "face-man-outline"), + ("face-man-profile", "face-man-profile"), + ("face-man-shimmer", "face-man-shimmer"), + ("face-man-shimmer-outline", "face-man-shimmer-outline"), + ("face-mask", "face-mask"), + ("face-mask-outline", "face-mask-outline"), + ("face-recognition", "face-recognition"), + ("face-woman", "face-woman"), + ("face-woman-outline", "face-woman-outline"), + ("face-woman-profile", "face-woman-profile"), + ("face-woman-shimmer", "face-woman-shimmer"), + ("face-woman-shimmer-outline", "face-woman-shimmer-outline"), + ("facebook", "facebook"), + ("facebook-box", "facebook-box"), + ("facebook-gaming", "facebook-gaming"), + ("facebook-messenger", "facebook-messenger"), + ("facebook-workplace", "facebook-workplace"), + ("factory", "factory"), + ("family-tree", "family-tree"), + ("fan", "fan"), + ("fan-alert", "fan-alert"), + ("fan-auto", "fan-auto"), + ("fan-chevron-down", "fan-chevron-down"), + ("fan-chevron-up", "fan-chevron-up"), + ("fan-clock", "fan-clock"), + ("fan-minus", "fan-minus"), + ("fan-off", "fan-off"), + ("fan-plus", "fan-plus"), + ("fan-remove", "fan-remove"), + ("fan-speed-1", "fan-speed-1"), + ("fan-speed-2", "fan-speed-2"), + ("fan-speed-3", "fan-speed-3"), + ("fast-forward", "fast-forward"), + ("fast-forward-10", "fast-forward-10"), + ("fast-forward-15", "fast-forward-15"), + ("fast-forward-30", "fast-forward-30"), + ("fast-forward-45", "fast-forward-45"), + ("fast-forward-5", "fast-forward-5"), + ("fast-forward-60", "fast-forward-60"), + ("fast-forward-outline", "fast-forward-outline"), + ("faucet", "faucet"), + ("faucet-variant", "faucet-variant"), + ("fax", "fax"), + ("feather", "feather"), + ("feature-search", "feature-search"), + ("feature-search-outline", "feature-search-outline"), + ("fedora", "fedora"), + ("fence", "fence"), + ("fence-electric", "fence-electric"), + ("fencing", "fencing"), + ("ferris-wheel", "ferris-wheel"), + ("ferry", "ferry"), + ("file", "file"), + ("file-account", "file-account"), + ("file-account-outline", "file-account-outline"), + ("file-alert", "file-alert"), + ("file-alert-outline", "file-alert-outline"), + ("file-arrow-left-right", "file-arrow-left-right"), + ("file-arrow-left-right-outline", "file-arrow-left-right-outline"), + ("file-arrow-up-down", "file-arrow-up-down"), + ("file-arrow-up-down-outline", "file-arrow-up-down-outline"), + ("file-cabinet", "file-cabinet"), + ("file-cad", "file-cad"), + ("file-cad-box", "file-cad-box"), + ("file-cancel", "file-cancel"), + ("file-cancel-outline", "file-cancel-outline"), + ("file-certificate", "file-certificate"), + ("file-certificate-outline", "file-certificate-outline"), + ("file-chart", "file-chart"), + ("file-chart-check", "file-chart-check"), + ("file-chart-check-outline", "file-chart-check-outline"), + ("file-chart-outline", "file-chart-outline"), + ("file-check", "file-check"), + ("file-check-outline", "file-check-outline"), + ("file-clock", "file-clock"), + ("file-clock-outline", "file-clock-outline"), + ("file-cloud", "file-cloud"), + ("file-cloud-outline", "file-cloud-outline"), + ("file-code", "file-code"), + ("file-code-outline", "file-code-outline"), + ("file-cog", "file-cog"), + ("file-cog-outline", "file-cog-outline"), + ("file-compare", "file-compare"), + ("file-delimited", "file-delimited"), + ("file-delimited-outline", "file-delimited-outline"), + ("file-document", "file-document"), + ("file-document-alert", "file-document-alert"), + ("file-document-alert-outline", "file-document-alert-outline"), + ("file-document-arrow-right", "file-document-arrow-right"), + ("file-document-arrow-right-outline", "file-document-arrow-right-outline"), + ("file-document-check", "file-document-check"), + ("file-document-check-outline", "file-document-check-outline"), + ("file-document-edit", "file-document-edit"), + ("file-document-edit-outline", "file-document-edit-outline"), + ("file-document-minus", "file-document-minus"), + ("file-document-minus-outline", "file-document-minus-outline"), + ("file-document-multiple", "file-document-multiple"), + ("file-document-multiple-outline", "file-document-multiple-outline"), + ("file-document-outline", "file-document-outline"), + ("file-document-plus", "file-document-plus"), + ("file-document-plus-outline", "file-document-plus-outline"), + ("file-document-remove", "file-document-remove"), + ("file-document-remove-outline", "file-document-remove-outline"), + ("file-download", "file-download"), + ("file-download-outline", "file-download-outline"), + ("file-edit", "file-edit"), + ("file-edit-outline", "file-edit-outline"), + ("file-excel", "file-excel"), + ("file-excel-box", "file-excel-box"), + ("file-excel-box-outline", "file-excel-box-outline"), + ("file-excel-outline", "file-excel-outline"), + ("file-export", "file-export"), + ("file-export-outline", "file-export-outline"), + ("file-eye", "file-eye"), + ("file-eye-outline", "file-eye-outline"), + ("file-find", "file-find"), + ("file-find-outline", "file-find-outline"), + ("file-gif-box", "file-gif-box"), + ("file-hidden", "file-hidden"), + ("file-image", "file-image"), + ("file-image-box", "file-image-box"), + ("file-image-marker", "file-image-marker"), + ("file-image-marker-outline", "file-image-marker-outline"), + ("file-image-minus", "file-image-minus"), + ("file-image-minus-outline", "file-image-minus-outline"), + ("file-image-outline", "file-image-outline"), + ("file-image-plus", "file-image-plus"), + ("file-image-plus-outline", "file-image-plus-outline"), + ("file-image-remove", "file-image-remove"), + ("file-image-remove-outline", "file-image-remove-outline"), + ("file-import", "file-import"), + ("file-import-outline", "file-import-outline"), + ("file-jpg-box", "file-jpg-box"), + ("file-key", "file-key"), + ("file-key-outline", "file-key-outline"), + ("file-link", "file-link"), + ("file-link-outline", "file-link-outline"), + ("file-lock", "file-lock"), + ("file-lock-open", "file-lock-open"), + ("file-lock-open-outline", "file-lock-open-outline"), + ("file-lock-outline", "file-lock-outline"), + ("file-marker", "file-marker"), + ("file-marker-outline", "file-marker-outline"), + ("file-minus", "file-minus"), + ("file-minus-outline", "file-minus-outline"), + ("file-move", "file-move"), + ("file-move-outline", "file-move-outline"), + ("file-multiple", "file-multiple"), + ("file-multiple-outline", "file-multiple-outline"), + ("file-music", "file-music"), + ("file-music-outline", "file-music-outline"), + ("file-outline", "file-outline"), + ("file-pdf", "file-pdf"), + ("file-pdf-box", "file-pdf-box"), + ("file-pdf-box-outline", "file-pdf-box-outline"), + ("file-pdf-outline", "file-pdf-outline"), + ("file-percent", "file-percent"), + ("file-percent-outline", "file-percent-outline"), + ("file-phone", "file-phone"), + ("file-phone-outline", "file-phone-outline"), + ("file-plus", "file-plus"), + ("file-plus-outline", "file-plus-outline"), + ("file-png-box", "file-png-box"), + ("file-powerpoint", "file-powerpoint"), + ("file-powerpoint-box", "file-powerpoint-box"), + ("file-powerpoint-box-outline", "file-powerpoint-box-outline"), + ("file-powerpoint-outline", "file-powerpoint-outline"), + ("file-presentation-box", "file-presentation-box"), + ("file-question", "file-question"), + ("file-question-outline", "file-question-outline"), + ("file-refresh", "file-refresh"), + ("file-refresh-outline", "file-refresh-outline"), + ("file-remove", "file-remove"), + ("file-remove-outline", "file-remove-outline"), + ("file-replace", "file-replace"), + ("file-replace-outline", "file-replace-outline"), + ("file-restore", "file-restore"), + ("file-restore-outline", "file-restore-outline"), + ("file-rotate-left", "file-rotate-left"), + ("file-rotate-left-outline", "file-rotate-left-outline"), + ("file-rotate-right", "file-rotate-right"), + ("file-rotate-right-outline", "file-rotate-right-outline"), + ("file-search", "file-search"), + ("file-search-outline", "file-search-outline"), + ("file-send", "file-send"), + ("file-send-outline", "file-send-outline"), + ("file-settings", "file-settings"), + ("file-settings-outline", "file-settings-outline"), + ("file-sign", "file-sign"), + ("file-star", "file-star"), + ("file-star-outline", "file-star-outline"), + ("file-swap", "file-swap"), + ("file-swap-outline", "file-swap-outline"), + ("file-sync", "file-sync"), + ("file-sync-outline", "file-sync-outline"), + ("file-table", "file-table"), + ("file-table-box", "file-table-box"), + ("file-table-box-multiple", "file-table-box-multiple"), + ("file-table-box-multiple-outline", "file-table-box-multiple-outline"), + ("file-table-box-outline", "file-table-box-outline"), + ("file-table-outline", "file-table-outline"), + ("file-tree", "file-tree"), + ("file-tree-outline", "file-tree-outline"), + ("file-undo", "file-undo"), + ("file-undo-outline", "file-undo-outline"), + ("file-upload", "file-upload"), + ("file-upload-outline", "file-upload-outline"), + ("file-video", "file-video"), + ("file-video-outline", "file-video-outline"), + ("file-word", "file-word"), + ("file-word-box", "file-word-box"), + ("file-word-box-outline", "file-word-box-outline"), + ("file-word-outline", "file-word-outline"), + ("file-xml", "file-xml"), + ("file-xml-box", "file-xml-box"), + ("fill", "fill"), + ("film", "film"), + ("filmstrip", "filmstrip"), + ("filmstrip-box", "filmstrip-box"), + ("filmstrip-box-multiple", "filmstrip-box-multiple"), + ("filmstrip-off", "filmstrip-off"), + ("filter", "filter"), + ("filter-check", "filter-check"), + ("filter-check-outline", "filter-check-outline"), + ("filter-cog", "filter-cog"), + ("filter-cog-outline", "filter-cog-outline"), + ("filter-menu", "filter-menu"), + ("filter-menu-outline", "filter-menu-outline"), + ("filter-minus", "filter-minus"), + ("filter-minus-outline", "filter-minus-outline"), + ("filter-multiple", "filter-multiple"), + ("filter-multiple-outline", "filter-multiple-outline"), + ("filter-off", "filter-off"), + ("filter-off-outline", "filter-off-outline"), + ("filter-outline", "filter-outline"), + ("filter-plus", "filter-plus"), + ("filter-plus-outline", "filter-plus-outline"), + ("filter-remove", "filter-remove"), + ("filter-remove-outline", "filter-remove-outline"), + ("filter-settings", "filter-settings"), + ("filter-settings-outline", "filter-settings-outline"), + ("filter-variant", "filter-variant"), + ("filter-variant-minus", "filter-variant-minus"), + ("filter-variant-plus", "filter-variant-plus"), + ("filter-variant-remove", "filter-variant-remove"), + ("finance", "finance"), + ("find-replace", "find-replace"), + ("fingerprint", "fingerprint"), + ("fingerprint-off", "fingerprint-off"), + ("fire", "fire"), + ("fire-alert", "fire-alert"), + ("fire-circle", "fire-circle"), + ("fire-extinguisher", "fire-extinguisher"), + ("fire-hydrant", "fire-hydrant"), + ("fire-hydrant-alert", "fire-hydrant-alert"), + ("fire-hydrant-off", "fire-hydrant-off"), + ("fire-off", "fire-off"), + ("fire-truck", "fire-truck"), + ("firebase", "firebase"), + ("firefox", "firefox"), + ("fireplace", "fireplace"), + ("fireplace-off", "fireplace-off"), + ("firewire", "firewire"), + ("firework", "firework"), + ("firework-off", "firework-off"), + ("fish", "fish"), + ("fish-off", "fish-off"), + ("fishbowl", "fishbowl"), + ("fishbowl-outline", "fishbowl-outline"), + ("fit-to-page", "fit-to-page"), + ("fit-to-page-outline", "fit-to-page-outline"), + ("fit-to-screen", "fit-to-screen"), + ("fit-to-screen-outline", "fit-to-screen-outline"), + ("flag", "flag"), + ("flag-checkered", "flag-checkered"), + ("flag-checkered-variant", "flag-checkered-variant"), + ("flag-minus", "flag-minus"), + ("flag-minus-outline", "flag-minus-outline"), + ("flag-off", "flag-off"), + ("flag-off-outline", "flag-off-outline"), + ("flag-outline", "flag-outline"), + ("flag-outline-variant", "flag-outline-variant"), + ("flag-plus", "flag-plus"), + ("flag-plus-outline", "flag-plus-outline"), + ("flag-remove", "flag-remove"), + ("flag-remove-outline", "flag-remove-outline"), + ("flag-triangle", "flag-triangle"), + ("flag-variant", "flag-variant"), + ("flag-variant-minus", "flag-variant-minus"), + ("flag-variant-minus-outline", "flag-variant-minus-outline"), + ("flag-variant-off", "flag-variant-off"), + ("flag-variant-off-outline", "flag-variant-off-outline"), + ("flag-variant-outline", "flag-variant-outline"), + ("flag-variant-plus", "flag-variant-plus"), + ("flag-variant-plus-outline", "flag-variant-plus-outline"), + ("flag-variant-remove", "flag-variant-remove"), + ("flag-variant-remove-outline", "flag-variant-remove-outline"), + ("flare", "flare"), + ("flash", "flash"), + ("flash-alert", "flash-alert"), + ("flash-alert-outline", "flash-alert-outline"), + ("flash-auto", "flash-auto"), + ("flash-off", "flash-off"), + ("flash-off-outline", "flash-off-outline"), + ("flash-outline", "flash-outline"), + ("flash-red-eye", "flash-red-eye"), + ("flash-triangle", "flash-triangle"), + ("flash-triangle-outline", "flash-triangle-outline"), + ("flashlight", "flashlight"), + ("flashlight-off", "flashlight-off"), + ("flask", "flask"), + ("flask-empty", "flask-empty"), + ("flask-empty-minus", "flask-empty-minus"), + ("flask-empty-minus-outline", "flask-empty-minus-outline"), + ("flask-empty-off", "flask-empty-off"), + ("flask-empty-off-outline", "flask-empty-off-outline"), + ("flask-empty-outline", "flask-empty-outline"), + ("flask-empty-plus", "flask-empty-plus"), + ("flask-empty-plus-outline", "flask-empty-plus-outline"), + ("flask-empty-remove", "flask-empty-remove"), + ("flask-empty-remove-outline", "flask-empty-remove-outline"), + ("flask-minus", "flask-minus"), + ("flask-minus-outline", "flask-minus-outline"), + ("flask-off", "flask-off"), + ("flask-off-outline", "flask-off-outline"), + ("flask-outline", "flask-outline"), + ("flask-plus", "flask-plus"), + ("flask-plus-outline", "flask-plus-outline"), + ("flask-remove", "flask-remove"), + ("flask-remove-outline", "flask-remove-outline"), + ("flask-round-bottom", "flask-round-bottom"), + ("flask-round-bottom-empty", "flask-round-bottom-empty"), + ("flask-round-bottom-empty-outline", "flask-round-bottom-empty-outline"), + ("flask-round-bottom-outline", "flask-round-bottom-outline"), + ("flattr", "flattr"), + ("fleur-de-lis", "fleur-de-lis"), + ("flickr", "flickr"), + ("flickr-after", "flickr-after"), + ("flickr-before", "flickr-before"), + ("flip-horizontal", "flip-horizontal"), + ("flip-to-back", "flip-to-back"), + ("flip-to-front", "flip-to-front"), + ("flip-vertical", "flip-vertical"), + ("floor-1", "floor-1"), + ("floor-2", "floor-2"), + ("floor-3", "floor-3"), + ("floor-a", "floor-a"), + ("floor-b", "floor-b"), + ("floor-g", "floor-g"), + ("floor-l", "floor-l"), + ("floor-lamp", "floor-lamp"), + ("floor-lamp-dual", "floor-lamp-dual"), + ("floor-lamp-dual-outline", "floor-lamp-dual-outline"), + ("floor-lamp-outline", "floor-lamp-outline"), + ("floor-lamp-torchiere", "floor-lamp-torchiere"), + ("floor-lamp-torchiere-outline", "floor-lamp-torchiere-outline"), + ("floor-lamp-torchiere-variant", "floor-lamp-torchiere-variant"), + ( + "floor-lamp-torchiere-variant-outline", + "floor-lamp-torchiere-variant-outline", + ), + ("floor-plan", "floor-plan"), + ("floppy", "floppy"), + ("floppy-variant", "floppy-variant"), + ("flower", "flower"), + ("flower-outline", "flower-outline"), + ("flower-pollen", "flower-pollen"), + ("flower-pollen-outline", "flower-pollen-outline"), + ("flower-poppy", "flower-poppy"), + ("flower-tulip", "flower-tulip"), + ("flower-tulip-outline", "flower-tulip-outline"), + ("focus-auto", "focus-auto"), + ("focus-field", "focus-field"), + ("focus-field-horizontal", "focus-field-horizontal"), + ("focus-field-vertical", "focus-field-vertical"), + ("folder", "folder"), + ("folder-account", "folder-account"), + ("folder-account-outline", "folder-account-outline"), + ("folder-alert", "folder-alert"), + ("folder-alert-outline", "folder-alert-outline"), + ("folder-arrow-down", "folder-arrow-down"), + ("folder-arrow-down-outline", "folder-arrow-down-outline"), + ("folder-arrow-left", "folder-arrow-left"), + ("folder-arrow-left-outline", "folder-arrow-left-outline"), + ("folder-arrow-left-right", "folder-arrow-left-right"), + ("folder-arrow-left-right-outline", "folder-arrow-left-right-outline"), + ("folder-arrow-right", "folder-arrow-right"), + ("folder-arrow-right-outline", "folder-arrow-right-outline"), + ("folder-arrow-up", "folder-arrow-up"), + ("folder-arrow-up-down", "folder-arrow-up-down"), + ("folder-arrow-up-down-outline", "folder-arrow-up-down-outline"), + ("folder-arrow-up-outline", "folder-arrow-up-outline"), + ("folder-cancel", "folder-cancel"), + ("folder-cancel-outline", "folder-cancel-outline"), + ("folder-check", "folder-check"), + ("folder-check-outline", "folder-check-outline"), + ("folder-clock", "folder-clock"), + ("folder-clock-outline", "folder-clock-outline"), + ("folder-cog", "folder-cog"), + ("folder-cog-outline", "folder-cog-outline"), + ("folder-download", "folder-download"), + ("folder-download-outline", "folder-download-outline"), + ("folder-edit", "folder-edit"), + ("folder-edit-outline", "folder-edit-outline"), + ("folder-eye", "folder-eye"), + ("folder-eye-outline", "folder-eye-outline"), + ("folder-file", "folder-file"), + ("folder-file-outline", "folder-file-outline"), + ("folder-google-drive", "folder-google-drive"), + ("folder-heart", "folder-heart"), + ("folder-heart-outline", "folder-heart-outline"), + ("folder-hidden", "folder-hidden"), + ("folder-home", "folder-home"), + ("folder-home-outline", "folder-home-outline"), + ("folder-image", "folder-image"), + ("folder-information", "folder-information"), + ("folder-information-outline", "folder-information-outline"), + ("folder-key", "folder-key"), + ("folder-key-network", "folder-key-network"), + ("folder-key-network-outline", "folder-key-network-outline"), + ("folder-key-outline", "folder-key-outline"), + ("folder-lock", "folder-lock"), + ("folder-lock-open", "folder-lock-open"), + ("folder-lock-open-outline", "folder-lock-open-outline"), + ("folder-lock-outline", "folder-lock-outline"), + ("folder-marker", "folder-marker"), + ("folder-marker-outline", "folder-marker-outline"), + ("folder-minus", "folder-minus"), + ("folder-minus-outline", "folder-minus-outline"), + ("folder-move", "folder-move"), + ("folder-move-outline", "folder-move-outline"), + ("folder-multiple", "folder-multiple"), + ("folder-multiple-image", "folder-multiple-image"), + ("folder-multiple-outline", "folder-multiple-outline"), + ("folder-multiple-plus", "folder-multiple-plus"), + ("folder-multiple-plus-outline", "folder-multiple-plus-outline"), + ("folder-music", "folder-music"), + ("folder-music-outline", "folder-music-outline"), + ("folder-network", "folder-network"), + ("folder-network-outline", "folder-network-outline"), + ("folder-off", "folder-off"), + ("folder-off-outline", "folder-off-outline"), + ("folder-open", "folder-open"), + ("folder-open-outline", "folder-open-outline"), + ("folder-outline", "folder-outline"), + ("folder-outline-lock", "folder-outline-lock"), + ("folder-play", "folder-play"), + ("folder-play-outline", "folder-play-outline"), + ("folder-plus", "folder-plus"), + ("folder-plus-outline", "folder-plus-outline"), + ("folder-pound", "folder-pound"), + ("folder-pound-outline", "folder-pound-outline"), + ("folder-question", "folder-question"), + ("folder-question-outline", "folder-question-outline"), + ("folder-refresh", "folder-refresh"), + ("folder-refresh-outline", "folder-refresh-outline"), + ("folder-remove", "folder-remove"), + ("folder-remove-outline", "folder-remove-outline"), + ("folder-search", "folder-search"), + ("folder-search-outline", "folder-search-outline"), + ("folder-settings", "folder-settings"), + ("folder-settings-outline", "folder-settings-outline"), + ("folder-star", "folder-star"), + ("folder-star-multiple", "folder-star-multiple"), + ("folder-star-multiple-outline", "folder-star-multiple-outline"), + ("folder-star-outline", "folder-star-outline"), + ("folder-swap", "folder-swap"), + ("folder-swap-outline", "folder-swap-outline"), + ("folder-sync", "folder-sync"), + ("folder-sync-outline", "folder-sync-outline"), + ("folder-table", "folder-table"), + ("folder-table-outline", "folder-table-outline"), + ("folder-text", "folder-text"), + ("folder-text-outline", "folder-text-outline"), + ("folder-upload", "folder-upload"), + ("folder-upload-outline", "folder-upload-outline"), + ("folder-wrench", "folder-wrench"), + ("folder-wrench-outline", "folder-wrench-outline"), + ("folder-zip", "folder-zip"), + ("folder-zip-outline", "folder-zip-outline"), + ("font-awesome", "font-awesome"), + ("food", "food"), + ("food-apple", "food-apple"), + ("food-apple-outline", "food-apple-outline"), + ("food-croissant", "food-croissant"), + ("food-drumstick", "food-drumstick"), + ("food-drumstick-off", "food-drumstick-off"), + ("food-drumstick-off-outline", "food-drumstick-off-outline"), + ("food-drumstick-outline", "food-drumstick-outline"), + ("food-fork-drink", "food-fork-drink"), + ("food-halal", "food-halal"), + ("food-hot-dog", "food-hot-dog"), + ("food-kosher", "food-kosher"), + ("food-off", "food-off"), + ("food-off-outline", "food-off-outline"), + ("food-outline", "food-outline"), + ("food-steak", "food-steak"), + ("food-steak-off", "food-steak-off"), + ("food-takeout-box", "food-takeout-box"), + ("food-takeout-box-outline", "food-takeout-box-outline"), + ("food-turkey", "food-turkey"), + ("food-variant", "food-variant"), + ("food-variant-off", "food-variant-off"), + ("foot-print", "foot-print"), + ("football", "football"), + ("football-australian", "football-australian"), + ("football-helmet", "football-helmet"), + ("footer", "footer"), + ("forest", "forest"), + ("forklift", "forklift"), + ("form-dropdown", "form-dropdown"), + ("form-select", "form-select"), + ("form-textarea", "form-textarea"), + ("form-textbox", "form-textbox"), + ("form-textbox-lock", "form-textbox-lock"), + ("form-textbox-password", "form-textbox-password"), + ("format-align-bottom", "format-align-bottom"), + ("format-align-center", "format-align-center"), + ("format-align-justify", "format-align-justify"), + ("format-align-left", "format-align-left"), + ("format-align-middle", "format-align-middle"), + ("format-align-right", "format-align-right"), + ("format-align-top", "format-align-top"), + ("format-annotation-minus", "format-annotation-minus"), + ("format-annotation-plus", "format-annotation-plus"), + ("format-bold", "format-bold"), + ("format-clear", "format-clear"), + ("format-color", "format-color"), + ("format-color-fill", "format-color-fill"), + ("format-color-highlight", "format-color-highlight"), + ("format-color-marker-cancel", "format-color-marker-cancel"), + ("format-color-text", "format-color-text"), + ("format-columns", "format-columns"), + ("format-float-center", "format-float-center"), + ("format-float-left", "format-float-left"), + ("format-float-none", "format-float-none"), + ("format-float-right", "format-float-right"), + ("format-font", "format-font"), + ("format-font-size-decrease", "format-font-size-decrease"), + ("format-font-size-increase", "format-font-size-increase"), + ("format-header-1", "format-header-1"), + ("format-header-2", "format-header-2"), + ("format-header-3", "format-header-3"), + ("format-header-4", "format-header-4"), + ("format-header-5", "format-header-5"), + ("format-header-6", "format-header-6"), + ("format-header-decrease", "format-header-decrease"), + ("format-header-down", "format-header-down"), + ("format-header-equal", "format-header-equal"), + ("format-header-increase", "format-header-increase"), + ("format-header-pound", "format-header-pound"), + ("format-header-up", "format-header-up"), + ("format-horizontal-align-center", "format-horizontal-align-center"), + ("format-horizontal-align-left", "format-horizontal-align-left"), + ("format-horizontal-align-right", "format-horizontal-align-right"), + ("format-indent-decrease", "format-indent-decrease"), + ("format-indent-increase", "format-indent-increase"), + ("format-italic", "format-italic"), + ("format-letter-case", "format-letter-case"), + ("format-letter-case-lower", "format-letter-case-lower"), + ("format-letter-case-upper", "format-letter-case-upper"), + ("format-letter-ends-with", "format-letter-ends-with"), + ("format-letter-matches", "format-letter-matches"), + ("format-letter-spacing", "format-letter-spacing"), + ("format-letter-spacing-variant", "format-letter-spacing-variant"), + ("format-letter-starts-with", "format-letter-starts-with"), + ("format-line-height", "format-line-height"), + ("format-line-spacing", "format-line-spacing"), + ("format-line-style", "format-line-style"), + ("format-line-weight", "format-line-weight"), + ("format-list-bulleted", "format-list-bulleted"), + ("format-list-bulleted-square", "format-list-bulleted-square"), + ("format-list-bulleted-triangle", "format-list-bulleted-triangle"), + ("format-list-bulleted-type", "format-list-bulleted-type"), + ("format-list-checkbox", "format-list-checkbox"), + ("format-list-checks", "format-list-checks"), + ("format-list-group", "format-list-group"), + ("format-list-group-plus", "format-list-group-plus"), + ("format-list-numbered", "format-list-numbered"), + ("format-list-numbered-rtl", "format-list-numbered-rtl"), + ("format-list-text", "format-list-text"), + ("format-list-triangle", "format-list-triangle"), + ("format-overline", "format-overline"), + ("format-page-break", "format-page-break"), + ("format-page-split", "format-page-split"), + ("format-paint", "format-paint"), + ("format-paragraph", "format-paragraph"), + ("format-paragraph-spacing", "format-paragraph-spacing"), + ("format-pilcrow", "format-pilcrow"), + ("format-pilcrow-arrow-left", "format-pilcrow-arrow-left"), + ("format-pilcrow-arrow-right", "format-pilcrow-arrow-right"), + ("format-quote-close", "format-quote-close"), + ("format-quote-close-outline", "format-quote-close-outline"), + ("format-quote-open", "format-quote-open"), + ("format-quote-open-outline", "format-quote-open-outline"), + ("format-rotate-90", "format-rotate-90"), + ("format-section", "format-section"), + ("format-size", "format-size"), + ("format-strikethrough", "format-strikethrough"), + ("format-strikethrough-variant", "format-strikethrough-variant"), + ("format-subscript", "format-subscript"), + ("format-superscript", "format-superscript"), + ("format-text", "format-text"), + ("format-text-rotation-angle-down", "format-text-rotation-angle-down"), + ("format-text-rotation-angle-up", "format-text-rotation-angle-up"), + ("format-text-rotation-down", "format-text-rotation-down"), + ("format-text-rotation-down-vertical", "format-text-rotation-down-vertical"), + ("format-text-rotation-none", "format-text-rotation-none"), + ("format-text-rotation-up", "format-text-rotation-up"), + ("format-text-rotation-vertical", "format-text-rotation-vertical"), + ("format-text-variant", "format-text-variant"), + ("format-text-variant-outline", "format-text-variant-outline"), + ("format-text-wrapping-clip", "format-text-wrapping-clip"), + ("format-text-wrapping-overflow", "format-text-wrapping-overflow"), + ("format-text-wrapping-wrap", "format-text-wrapping-wrap"), + ("format-textbox", "format-textbox"), + ("format-title", "format-title"), + ("format-underline", "format-underline"), + ("format-underline-wavy", "format-underline-wavy"), + ("format-vertical-align-bottom", "format-vertical-align-bottom"), + ("format-vertical-align-center", "format-vertical-align-center"), + ("format-vertical-align-top", "format-vertical-align-top"), + ("format-wrap-inline", "format-wrap-inline"), + ("format-wrap-square", "format-wrap-square"), + ("format-wrap-tight", "format-wrap-tight"), + ("format-wrap-top-bottom", "format-wrap-top-bottom"), + ("forum", "forum"), + ("forum-minus", "forum-minus"), + ("forum-minus-outline", "forum-minus-outline"), + ("forum-outline", "forum-outline"), + ("forum-plus", "forum-plus"), + ("forum-plus-outline", "forum-plus-outline"), + ("forum-remove", "forum-remove"), + ("forum-remove-outline", "forum-remove-outline"), + ("forward", "forward"), + ("forwardburger", "forwardburger"), + ("fountain", "fountain"), + ("fountain-pen", "fountain-pen"), + ("fountain-pen-tip", "fountain-pen-tip"), + ("foursquare", "foursquare"), + ("fraction-one-half", "fraction-one-half"), + ("freebsd", "freebsd"), + ("french-fries", "french-fries"), + ("frequently-asked-questions", "frequently-asked-questions"), + ("fridge", "fridge"), + ("fridge-alert", "fridge-alert"), + ("fridge-alert-outline", "fridge-alert-outline"), + ("fridge-bottom", "fridge-bottom"), + ("fridge-industrial", "fridge-industrial"), + ("fridge-industrial-alert", "fridge-industrial-alert"), + ("fridge-industrial-alert-outline", "fridge-industrial-alert-outline"), + ("fridge-industrial-off", "fridge-industrial-off"), + ("fridge-industrial-off-outline", "fridge-industrial-off-outline"), + ("fridge-industrial-outline", "fridge-industrial-outline"), + ("fridge-off", "fridge-off"), + ("fridge-off-outline", "fridge-off-outline"), + ("fridge-outline", "fridge-outline"), + ("fridge-top", "fridge-top"), + ("fridge-variant", "fridge-variant"), + ("fridge-variant-alert", "fridge-variant-alert"), + ("fridge-variant-alert-outline", "fridge-variant-alert-outline"), + ("fridge-variant-off", "fridge-variant-off"), + ("fridge-variant-off-outline", "fridge-variant-off-outline"), + ("fridge-variant-outline", "fridge-variant-outline"), + ("fruit-cherries", "fruit-cherries"), + ("fruit-cherries-off", "fruit-cherries-off"), + ("fruit-citrus", "fruit-citrus"), + ("fruit-citrus-off", "fruit-citrus-off"), + ("fruit-grapes", "fruit-grapes"), + ("fruit-grapes-outline", "fruit-grapes-outline"), + ("fruit-pear", "fruit-pear"), + ("fruit-pineapple", "fruit-pineapple"), + ("fruit-watermelon", "fruit-watermelon"), + ("fuel", "fuel"), + ("fuel-cell", "fuel-cell"), + ("fullscreen", "fullscreen"), + ("fullscreen-exit", "fullscreen-exit"), + ("function", "function"), + ("function-variant", "function-variant"), + ("furigana-horizontal", "furigana-horizontal"), + ("furigana-vertical", "furigana-vertical"), + ("fuse", "fuse"), + ("fuse-alert", "fuse-alert"), + ("fuse-blade", "fuse-blade"), + ("fuse-off", "fuse-off"), + ("gamepad", "gamepad"), + ("gamepad-circle", "gamepad-circle"), + ("gamepad-circle-down", "gamepad-circle-down"), + ("gamepad-circle-left", "gamepad-circle-left"), + ("gamepad-circle-outline", "gamepad-circle-outline"), + ("gamepad-circle-right", "gamepad-circle-right"), + ("gamepad-circle-up", "gamepad-circle-up"), + ("gamepad-down", "gamepad-down"), + ("gamepad-left", "gamepad-left"), + ("gamepad-outline", "gamepad-outline"), + ("gamepad-right", "gamepad-right"), + ("gamepad-round", "gamepad-round"), + ("gamepad-round-down", "gamepad-round-down"), + ("gamepad-round-left", "gamepad-round-left"), + ("gamepad-round-outline", "gamepad-round-outline"), + ("gamepad-round-right", "gamepad-round-right"), + ("gamepad-round-up", "gamepad-round-up"), + ("gamepad-square", "gamepad-square"), + ("gamepad-square-outline", "gamepad-square-outline"), + ("gamepad-up", "gamepad-up"), + ("gamepad-variant", "gamepad-variant"), + ("gamepad-variant-outline", "gamepad-variant-outline"), + ("gamma", "gamma"), + ("gantry-crane", "gantry-crane"), + ("garage", "garage"), + ("garage-alert", "garage-alert"), + ("garage-alert-variant", "garage-alert-variant"), + ("garage-lock", "garage-lock"), + ("garage-open", "garage-open"), + ("garage-open-variant", "garage-open-variant"), + ("garage-variant", "garage-variant"), + ("garage-variant-lock", "garage-variant-lock"), + ("gas-burner", "gas-burner"), + ("gas-cylinder", "gas-cylinder"), + ("gas-station", "gas-station"), + ("gas-station-off", "gas-station-off"), + ("gas-station-off-outline", "gas-station-off-outline"), + ("gas-station-outline", "gas-station-outline"), + ("gate", "gate"), + ("gate-alert", "gate-alert"), + ("gate-and", "gate-and"), + ("gate-arrow-left", "gate-arrow-left"), + ("gate-arrow-right", "gate-arrow-right"), + ("gate-buffer", "gate-buffer"), + ("gate-nand", "gate-nand"), + ("gate-nor", "gate-nor"), + ("gate-not", "gate-not"), + ("gate-open", "gate-open"), + ("gate-or", "gate-or"), + ("gate-xnor", "gate-xnor"), + ("gate-xor", "gate-xor"), + ("gatsby", "gatsby"), + ("gauge", "gauge"), + ("gauge-empty", "gauge-empty"), + ("gauge-full", "gauge-full"), + ("gauge-low", "gauge-low"), + ("gavel", "gavel"), + ("gender-female", "gender-female"), + ("gender-male", "gender-male"), + ("gender-male-female", "gender-male-female"), + ("gender-male-female-variant", "gender-male-female-variant"), + ("gender-non-binary", "gender-non-binary"), + ("gender-transgender", "gender-transgender"), + ("gentoo", "gentoo"), + ("gesture", "gesture"), + ("gesture-double-tap", "gesture-double-tap"), + ("gesture-pinch", "gesture-pinch"), + ("gesture-spread", "gesture-spread"), + ("gesture-swipe", "gesture-swipe"), + ("gesture-swipe-down", "gesture-swipe-down"), + ("gesture-swipe-horizontal", "gesture-swipe-horizontal"), + ("gesture-swipe-left", "gesture-swipe-left"), + ("gesture-swipe-right", "gesture-swipe-right"), + ("gesture-swipe-up", "gesture-swipe-up"), + ("gesture-swipe-vertical", "gesture-swipe-vertical"), + ("gesture-tap", "gesture-tap"), + ("gesture-tap-box", "gesture-tap-box"), + ("gesture-tap-button", "gesture-tap-button"), + ("gesture-tap-hold", "gesture-tap-hold"), + ("gesture-two-double-tap", "gesture-two-double-tap"), + ("gesture-two-tap", "gesture-two-tap"), + ("ghost", "ghost"), + ("ghost-off", "ghost-off"), + ("ghost-off-outline", "ghost-off-outline"), + ("ghost-outline", "ghost-outline"), + ("gif", "gif"), + ("gift", "gift"), + ("gift-off", "gift-off"), + ("gift-off-outline", "gift-off-outline"), + ("gift-open", "gift-open"), + ("gift-open-outline", "gift-open-outline"), + ("gift-outline", "gift-outline"), + ("git", "git"), + ("github", "github"), + ("github-box", "github-box"), + ("github-face", "github-face"), + ("gitlab", "gitlab"), + ("glass-cocktail", "glass-cocktail"), + ("glass-cocktail-off", "glass-cocktail-off"), + ("glass-flute", "glass-flute"), + ("glass-fragile", "glass-fragile"), + ("glass-mug", "glass-mug"), + ("glass-mug-off", "glass-mug-off"), + ("glass-mug-variant", "glass-mug-variant"), + ("glass-mug-variant-off", "glass-mug-variant-off"), + ("glass-pint-outline", "glass-pint-outline"), + ("glass-stange", "glass-stange"), + ("glass-tulip", "glass-tulip"), + ("glass-wine", "glass-wine"), + ("glassdoor", "glassdoor"), + ("glasses", "glasses"), + ("globe-light", "globe-light"), + ("globe-light-outline", "globe-light-outline"), + ("globe-model", "globe-model"), + ("gmail", "gmail"), + ("gnome", "gnome"), + ("go-kart", "go-kart"), + ("go-kart-track", "go-kart-track"), + ("gog", "gog"), + ("gold", "gold"), + ("golf", "golf"), + ("golf-cart", "golf-cart"), + ("golf-tee", "golf-tee"), + ("gondola", "gondola"), + ("goodreads", "goodreads"), + ("google", "google"), + ("google-ads", "google-ads"), + ("google-allo", "google-allo"), + ("google-analytics", "google-analytics"), + ("google-assistant", "google-assistant"), + ("google-cardboard", "google-cardboard"), + ("google-chrome", "google-chrome"), + ("google-circles", "google-circles"), + ("google-circles-communities", "google-circles-communities"), + ("google-circles-extended", "google-circles-extended"), + ("google-circles-group", "google-circles-group"), + ("google-classroom", "google-classroom"), + ("google-cloud", "google-cloud"), + ("google-downasaur", "google-downasaur"), + ("google-drive", "google-drive"), + ("google-earth", "google-earth"), + ("google-fit", "google-fit"), + ("google-glass", "google-glass"), + ("google-hangouts", "google-hangouts"), + ("google-home", "google-home"), + ("google-keep", "google-keep"), + ("google-lens", "google-lens"), + ("google-maps", "google-maps"), + ("google-my-business", "google-my-business"), + ("google-nearby", "google-nearby"), + ("google-pages", "google-pages"), + ("google-photos", "google-photos"), + ("google-physical-web", "google-physical-web"), + ("google-play", "google-play"), + ("google-plus", "google-plus"), + ("google-plus-box", "google-plus-box"), + ("google-podcast", "google-podcast"), + ("google-spreadsheet", "google-spreadsheet"), + ("google-street-view", "google-street-view"), + ("google-translate", "google-translate"), + ("google-wallet", "google-wallet"), + ("gradient-horizontal", "gradient-horizontal"), + ("gradient-vertical", "gradient-vertical"), + ("grain", "grain"), + ("graph", "graph"), + ("graph-outline", "graph-outline"), + ("graphql", "graphql"), + ("grass", "grass"), + ("grave-stone", "grave-stone"), + ("grease-pencil", "grease-pencil"), + ("greater-than", "greater-than"), + ("greater-than-or-equal", "greater-than-or-equal"), + ("greenhouse", "greenhouse"), + ("grid", "grid"), + ("grid-large", "grid-large"), + ("grid-off", "grid-off"), + ("grill", "grill"), + ("grill-outline", "grill-outline"), + ("group", "group"), + ("guitar-acoustic", "guitar-acoustic"), + ("guitar-electric", "guitar-electric"), + ("guitar-pick", "guitar-pick"), + ("guitar-pick-outline", "guitar-pick-outline"), + ("guy-fawkes-mask", "guy-fawkes-mask"), + ("gymnastics", "gymnastics"), + ("hail", "hail"), + ("hair-dryer", "hair-dryer"), + ("hair-dryer-outline", "hair-dryer-outline"), + ("halloween", "halloween"), + ("hamburger", "hamburger"), + ("hamburger-check", "hamburger-check"), + ("hamburger-minus", "hamburger-minus"), + ("hamburger-off", "hamburger-off"), + ("hamburger-plus", "hamburger-plus"), + ("hamburger-remove", "hamburger-remove"), + ("hammer", "hammer"), + ("hammer-screwdriver", "hammer-screwdriver"), + ("hammer-sickle", "hammer-sickle"), + ("hammer-wrench", "hammer-wrench"), + ("hand-back-left", "hand-back-left"), + ("hand-back-left-off", "hand-back-left-off"), + ("hand-back-left-off-outline", "hand-back-left-off-outline"), + ("hand-back-left-outline", "hand-back-left-outline"), + ("hand-back-right", "hand-back-right"), + ("hand-back-right-off", "hand-back-right-off"), + ("hand-back-right-off-outline", "hand-back-right-off-outline"), + ("hand-back-right-outline", "hand-back-right-outline"), + ("hand-clap", "hand-clap"), + ("hand-clap-off", "hand-clap-off"), + ("hand-coin", "hand-coin"), + ("hand-coin-outline", "hand-coin-outline"), + ("hand-cycle", "hand-cycle"), + ("hand-extended", "hand-extended"), + ("hand-extended-outline", "hand-extended-outline"), + ("hand-front-left", "hand-front-left"), + ("hand-front-left-outline", "hand-front-left-outline"), + ("hand-front-right", "hand-front-right"), + ("hand-front-right-outline", "hand-front-right-outline"), + ("hand-heart", "hand-heart"), + ("hand-heart-outline", "hand-heart-outline"), + ("hand-left", "hand-left"), + ("hand-okay", "hand-okay"), + ("hand-peace", "hand-peace"), + ("hand-peace-variant", "hand-peace-variant"), + ("hand-pointing-down", "hand-pointing-down"), + ("hand-pointing-left", "hand-pointing-left"), + ("hand-pointing-right", "hand-pointing-right"), + ("hand-pointing-up", "hand-pointing-up"), + ("hand-right", "hand-right"), + ("hand-saw", "hand-saw"), + ("hand-wash", "hand-wash"), + ("hand-wash-outline", "hand-wash-outline"), + ("hand-water", "hand-water"), + ("hand-wave", "hand-wave"), + ("hand-wave-outline", "hand-wave-outline"), + ("handball", "handball"), + ("handcuffs", "handcuffs"), + ("hands-pray", "hands-pray"), + ("handshake", "handshake"), + ("handshake-outline", "handshake-outline"), + ("hanger", "hanger"), + ("hangouts", "hangouts"), + ("hard-hat", "hard-hat"), + ("harddisk", "harddisk"), + ("harddisk-plus", "harddisk-plus"), + ("harddisk-remove", "harddisk-remove"), + ("hat-fedora", "hat-fedora"), + ("hazard-lights", "hazard-lights"), + ("hdmi-port", "hdmi-port"), + ("hdr", "hdr"), + ("hdr-off", "hdr-off"), + ("head", "head"), + ("head-alert", "head-alert"), + ("head-alert-outline", "head-alert-outline"), + ("head-check", "head-check"), + ("head-check-outline", "head-check-outline"), + ("head-cog", "head-cog"), + ("head-cog-outline", "head-cog-outline"), + ("head-dots-horizontal", "head-dots-horizontal"), + ("head-dots-horizontal-outline", "head-dots-horizontal-outline"), + ("head-flash", "head-flash"), + ("head-flash-outline", "head-flash-outline"), + ("head-heart", "head-heart"), + ("head-heart-outline", "head-heart-outline"), + ("head-lightbulb", "head-lightbulb"), + ("head-lightbulb-outline", "head-lightbulb-outline"), + ("head-minus", "head-minus"), + ("head-minus-outline", "head-minus-outline"), + ("head-outline", "head-outline"), + ("head-plus", "head-plus"), + ("head-plus-outline", "head-plus-outline"), + ("head-question", "head-question"), + ("head-question-outline", "head-question-outline"), + ("head-remove", "head-remove"), + ("head-remove-outline", "head-remove-outline"), + ("head-snowflake", "head-snowflake"), + ("head-snowflake-outline", "head-snowflake-outline"), + ("head-sync", "head-sync"), + ("head-sync-outline", "head-sync-outline"), + ("headphones", "headphones"), + ("headphones-bluetooth", "headphones-bluetooth"), + ("headphones-box", "headphones-box"), + ("headphones-off", "headphones-off"), + ("headphones-settings", "headphones-settings"), + ("headset", "headset"), + ("headset-dock", "headset-dock"), + ("headset-off", "headset-off"), + ("heart", "heart"), + ("heart-box", "heart-box"), + ("heart-box-outline", "heart-box-outline"), + ("heart-broken", "heart-broken"), + ("heart-broken-outline", "heart-broken-outline"), + ("heart-circle", "heart-circle"), + ("heart-circle-outline", "heart-circle-outline"), + ("heart-cog", "heart-cog"), + ("heart-cog-outline", "heart-cog-outline"), + ("heart-flash", "heart-flash"), + ("heart-half", "heart-half"), + ("heart-half-full", "heart-half-full"), + ("heart-half-outline", "heart-half-outline"), + ("heart-minus", "heart-minus"), + ("heart-minus-outline", "heart-minus-outline"), + ("heart-multiple", "heart-multiple"), + ("heart-multiple-outline", "heart-multiple-outline"), + ("heart-off", "heart-off"), + ("heart-off-outline", "heart-off-outline"), + ("heart-outline", "heart-outline"), + ("heart-plus", "heart-plus"), + ("heart-plus-outline", "heart-plus-outline"), + ("heart-pulse", "heart-pulse"), + ("heart-remove", "heart-remove"), + ("heart-remove-outline", "heart-remove-outline"), + ("heart-settings", "heart-settings"), + ("heart-settings-outline", "heart-settings-outline"), + ("heat-pump", "heat-pump"), + ("heat-pump-outline", "heat-pump-outline"), + ("heat-wave", "heat-wave"), + ("heating-coil", "heating-coil"), + ("helicopter", "helicopter"), + ("help", "help"), + ("help-box", "help-box"), + ("help-box-multiple", "help-box-multiple"), + ("help-box-multiple-outline", "help-box-multiple-outline"), + ("help-box-outline", "help-box-outline"), + ("help-circle", "help-circle"), + ("help-circle-outline", "help-circle-outline"), + ("help-network", "help-network"), + ("help-network-outline", "help-network-outline"), + ("help-rhombus", "help-rhombus"), + ("help-rhombus-outline", "help-rhombus-outline"), + ("hexadecimal", "hexadecimal"), + ("hexagon", "hexagon"), + ("hexagon-multiple", "hexagon-multiple"), + ("hexagon-multiple-outline", "hexagon-multiple-outline"), + ("hexagon-outline", "hexagon-outline"), + ("hexagon-slice-1", "hexagon-slice-1"), + ("hexagon-slice-2", "hexagon-slice-2"), + ("hexagon-slice-3", "hexagon-slice-3"), + ("hexagon-slice-4", "hexagon-slice-4"), + ("hexagon-slice-5", "hexagon-slice-5"), + ("hexagon-slice-6", "hexagon-slice-6"), + ("hexagram", "hexagram"), + ("hexagram-outline", "hexagram-outline"), + ("high-definition", "high-definition"), + ("high-definition-box", "high-definition-box"), + ("highway", "highway"), + ("hiking", "hiking"), + ("history", "history"), + ("hockey-puck", "hockey-puck"), + ("hockey-sticks", "hockey-sticks"), + ("hololens", "hololens"), + ("home", "home"), + ("home-account", "home-account"), + ("home-alert", "home-alert"), + ("home-alert-outline", "home-alert-outline"), + ("home-analytics", "home-analytics"), + ("home-assistant", "home-assistant"), + ("home-automation", "home-automation"), + ("home-battery", "home-battery"), + ("home-battery-outline", "home-battery-outline"), + ("home-circle", "home-circle"), + ("home-circle-outline", "home-circle-outline"), + ("home-city", "home-city"), + ("home-city-outline", "home-city-outline"), + ("home-clock", "home-clock"), + ("home-clock-outline", "home-clock-outline"), + ("home-currency-usd", "home-currency-usd"), + ("home-edit", "home-edit"), + ("home-edit-outline", "home-edit-outline"), + ("home-export-outline", "home-export-outline"), + ("home-flood", "home-flood"), + ("home-floor-0", "home-floor-0"), + ("home-floor-1", "home-floor-1"), + ("home-floor-2", "home-floor-2"), + ("home-floor-3", "home-floor-3"), + ("home-floor-a", "home-floor-a"), + ("home-floor-b", "home-floor-b"), + ("home-floor-g", "home-floor-g"), + ("home-floor-l", "home-floor-l"), + ("home-floor-negative-1", "home-floor-negative-1"), + ("home-group", "home-group"), + ("home-group-minus", "home-group-minus"), + ("home-group-plus", "home-group-plus"), + ("home-group-remove", "home-group-remove"), + ("home-heart", "home-heart"), + ("home-import-outline", "home-import-outline"), + ("home-lightbulb", "home-lightbulb"), + ("home-lightbulb-outline", "home-lightbulb-outline"), + ("home-lightning-bolt", "home-lightning-bolt"), + ("home-lightning-bolt-outline", "home-lightning-bolt-outline"), + ("home-lock", "home-lock"), + ("home-lock-open", "home-lock-open"), + ("home-map-marker", "home-map-marker"), + ("home-minus", "home-minus"), + ("home-minus-outline", "home-minus-outline"), + ("home-modern", "home-modern"), + ("home-off", "home-off"), + ("home-off-outline", "home-off-outline"), + ("home-outline", "home-outline"), + ("home-plus", "home-plus"), + ("home-plus-outline", "home-plus-outline"), + ("home-remove", "home-remove"), + ("home-remove-outline", "home-remove-outline"), + ("home-roof", "home-roof"), + ("home-search", "home-search"), + ("home-search-outline", "home-search-outline"), + ("home-silo", "home-silo"), + ("home-silo-outline", "home-silo-outline"), + ("home-switch", "home-switch"), + ("home-switch-outline", "home-switch-outline"), + ("home-thermometer", "home-thermometer"), + ("home-thermometer-outline", "home-thermometer-outline"), + ("home-variant", "home-variant"), + ("home-variant-outline", "home-variant-outline"), + ("hook", "hook"), + ("hook-off", "hook-off"), + ("hoop-house", "hoop-house"), + ("hops", "hops"), + ("horizontal-rotate-clockwise", "horizontal-rotate-clockwise"), + ("horizontal-rotate-counterclockwise", "horizontal-rotate-counterclockwise"), + ("horse", "horse"), + ("horse-human", "horse-human"), + ("horse-variant", "horse-variant"), + ("horse-variant-fast", "horse-variant-fast"), + ("horseshoe", "horseshoe"), + ("hospital", "hospital"), + ("hospital-box", "hospital-box"), + ("hospital-box-outline", "hospital-box-outline"), + ("hospital-building", "hospital-building"), + ("hospital-marker", "hospital-marker"), + ("hot-tub", "hot-tub"), + ("hours-24", "hours-24"), + ("houzz", "houzz"), + ("houzz-box", "houzz-box"), + ("hubspot", "hubspot"), + ("hulu", "hulu"), + ("human", "human"), + ("human-baby-changing-table", "human-baby-changing-table"), + ("human-cane", "human-cane"), + ("human-capacity-decrease", "human-capacity-decrease"), + ("human-capacity-increase", "human-capacity-increase"), + ("human-child", "human-child"), + ("human-dolly", "human-dolly"), + ("human-edit", "human-edit"), + ("human-female", "human-female"), + ("human-female-boy", "human-female-boy"), + ("human-female-dance", "human-female-dance"), + ("human-female-female", "human-female-female"), + ("human-female-girl", "human-female-girl"), + ("human-greeting", "human-greeting"), + ("human-greeting-proximity", "human-greeting-proximity"), + ("human-greeting-variant", "human-greeting-variant"), + ("human-handsdown", "human-handsdown"), + ("human-handsup", "human-handsup"), + ("human-male", "human-male"), + ("human-male-board", "human-male-board"), + ("human-male-board-poll", "human-male-board-poll"), + ("human-male-boy", "human-male-boy"), + ("human-male-child", "human-male-child"), + ("human-male-female", "human-male-female"), + ("human-male-female-child", "human-male-female-child"), + ("human-male-girl", "human-male-girl"), + ("human-male-height", "human-male-height"), + ("human-male-height-variant", "human-male-height-variant"), + ("human-male-male", "human-male-male"), + ("human-non-binary", "human-non-binary"), + ("human-pregnant", "human-pregnant"), + ("human-queue", "human-queue"), + ("human-scooter", "human-scooter"), + ("human-walker", "human-walker"), + ("human-wheelchair", "human-wheelchair"), + ("human-white-cane", "human-white-cane"), + ("humble-bundle", "humble-bundle"), + ("hurricane", "hurricane"), + ("hvac", "hvac"), + ("hvac-off", "hvac-off"), + ("hydraulic-oil-level", "hydraulic-oil-level"), + ("hydraulic-oil-temperature", "hydraulic-oil-temperature"), + ("hydro-power", "hydro-power"), + ("hydrogen-station", "hydrogen-station"), + ("ice-cream", "ice-cream"), + ("ice-cream-off", "ice-cream-off"), + ("ice-pop", "ice-pop"), + ("id-card", "id-card"), + ("identifier", "identifier"), + ("ideogram-cjk", "ideogram-cjk"), + ("ideogram-cjk-variant", "ideogram-cjk-variant"), + ("image", "image"), + ("image-album", "image-album"), + ("image-area", "image-area"), + ("image-area-close", "image-area-close"), + ("image-auto-adjust", "image-auto-adjust"), + ("image-broken", "image-broken"), + ("image-broken-variant", "image-broken-variant"), + ("image-check", "image-check"), + ("image-check-outline", "image-check-outline"), + ("image-edit", "image-edit"), + ("image-edit-outline", "image-edit-outline"), + ("image-filter-black-white", "image-filter-black-white"), + ("image-filter-center-focus", "image-filter-center-focus"), + ("image-filter-center-focus-strong", "image-filter-center-focus-strong"), + ( + "image-filter-center-focus-strong-outline", + "image-filter-center-focus-strong-outline", + ), + ("image-filter-center-focus-weak", "image-filter-center-focus-weak"), + ("image-filter-drama", "image-filter-drama"), + ("image-filter-drama-outline", "image-filter-drama-outline"), + ("image-filter-frames", "image-filter-frames"), + ("image-filter-hdr", "image-filter-hdr"), + ("image-filter-none", "image-filter-none"), + ("image-filter-tilt-shift", "image-filter-tilt-shift"), + ("image-filter-vintage", "image-filter-vintage"), + ("image-frame", "image-frame"), + ("image-lock", "image-lock"), + ("image-lock-outline", "image-lock-outline"), + ("image-marker", "image-marker"), + ("image-marker-outline", "image-marker-outline"), + ("image-minus", "image-minus"), + ("image-minus-outline", "image-minus-outline"), + ("image-move", "image-move"), + ("image-multiple", "image-multiple"), + ("image-multiple-outline", "image-multiple-outline"), + ("image-off", "image-off"), + ("image-off-outline", "image-off-outline"), + ("image-outline", "image-outline"), + ("image-plus", "image-plus"), + ("image-plus-outline", "image-plus-outline"), + ("image-refresh", "image-refresh"), + ("image-refresh-outline", "image-refresh-outline"), + ("image-remove", "image-remove"), + ("image-remove-outline", "image-remove-outline"), + ("image-search", "image-search"), + ("image-search-outline", "image-search-outline"), + ("image-size-select-actual", "image-size-select-actual"), + ("image-size-select-large", "image-size-select-large"), + ("image-size-select-small", "image-size-select-small"), + ("image-sync", "image-sync"), + ("image-sync-outline", "image-sync-outline"), + ("image-text", "image-text"), + ("import", "import"), + ("inbox", "inbox"), + ("inbox-arrow-down", "inbox-arrow-down"), + ("inbox-arrow-down-outline", "inbox-arrow-down-outline"), + ("inbox-arrow-up", "inbox-arrow-up"), + ("inbox-arrow-up-outline", "inbox-arrow-up-outline"), + ("inbox-full", "inbox-full"), + ("inbox-full-outline", "inbox-full-outline"), + ("inbox-multiple", "inbox-multiple"), + ("inbox-multiple-outline", "inbox-multiple-outline"), + ("inbox-outline", "inbox-outline"), + ("inbox-remove", "inbox-remove"), + ("inbox-remove-outline", "inbox-remove-outline"), + ("incognito", "incognito"), + ("incognito-circle", "incognito-circle"), + ("incognito-circle-off", "incognito-circle-off"), + ("incognito-off", "incognito-off"), + ("indent", "indent"), + ("induction", "induction"), + ("infinity", "infinity"), + ("information", "information"), + ("information-off", "information-off"), + ("information-off-outline", "information-off-outline"), + ("information-outline", "information-outline"), + ("information-variant", "information-variant"), + ("instagram", "instagram"), + ("instapaper", "instapaper"), + ("instrument-triangle", "instrument-triangle"), + ("integrated-circuit-chip", "integrated-circuit-chip"), + ("invert-colors", "invert-colors"), + ("invert-colors-off", "invert-colors-off"), + ("iobroker", "iobroker"), + ("ip", "ip"), + ("ip-network", "ip-network"), + ("ip-network-outline", "ip-network-outline"), + ("ip-outline", "ip-outline"), + ("ipod", "ipod"), + ("iron", "iron"), + ("iron-board", "iron-board"), + ("iron-outline", "iron-outline"), + ("island", "island"), + ("itunes", "itunes"), + ("iv-bag", "iv-bag"), + ("jabber", "jabber"), + ("jeepney", "jeepney"), + ("jellyfish", "jellyfish"), + ("jellyfish-outline", "jellyfish-outline"), + ("jira", "jira"), + ("jquery", "jquery"), + ("jsfiddle", "jsfiddle"), + ("jump-rope", "jump-rope"), + ("kabaddi", "kabaddi"), + ("kangaroo", "kangaroo"), + ("karate", "karate"), + ("kayaking", "kayaking"), + ("keg", "keg"), + ("kettle", "kettle"), + ("kettle-alert", "kettle-alert"), + ("kettle-alert-outline", "kettle-alert-outline"), + ("kettle-off", "kettle-off"), + ("kettle-off-outline", "kettle-off-outline"), + ("kettle-outline", "kettle-outline"), + ("kettle-pour-over", "kettle-pour-over"), + ("kettle-steam", "kettle-steam"), + ("kettle-steam-outline", "kettle-steam-outline"), + ("kettlebell", "kettlebell"), + ("key", "key"), + ("key-alert", "key-alert"), + ("key-alert-outline", "key-alert-outline"), + ("key-arrow-right", "key-arrow-right"), + ("key-chain", "key-chain"), + ("key-chain-variant", "key-chain-variant"), + ("key-change", "key-change"), + ("key-link", "key-link"), + ("key-minus", "key-minus"), + ("key-outline", "key-outline"), + ("key-plus", "key-plus"), + ("key-remove", "key-remove"), + ("key-star", "key-star"), + ("key-variant", "key-variant"), + ("key-wireless", "key-wireless"), + ("keyboard", "keyboard"), + ("keyboard-backspace", "keyboard-backspace"), + ("keyboard-caps", "keyboard-caps"), + ("keyboard-close", "keyboard-close"), + ("keyboard-close-outline", "keyboard-close-outline"), + ("keyboard-esc", "keyboard-esc"), + ("keyboard-f1", "keyboard-f1"), + ("keyboard-f10", "keyboard-f10"), + ("keyboard-f11", "keyboard-f11"), + ("keyboard-f12", "keyboard-f12"), + ("keyboard-f2", "keyboard-f2"), + ("keyboard-f3", "keyboard-f3"), + ("keyboard-f4", "keyboard-f4"), + ("keyboard-f5", "keyboard-f5"), + ("keyboard-f6", "keyboard-f6"), + ("keyboard-f7", "keyboard-f7"), + ("keyboard-f8", "keyboard-f8"), + ("keyboard-f9", "keyboard-f9"), + ("keyboard-off", "keyboard-off"), + ("keyboard-off-outline", "keyboard-off-outline"), + ("keyboard-outline", "keyboard-outline"), + ("keyboard-return", "keyboard-return"), + ("keyboard-settings", "keyboard-settings"), + ("keyboard-settings-outline", "keyboard-settings-outline"), + ("keyboard-space", "keyboard-space"), + ("keyboard-tab", "keyboard-tab"), + ("keyboard-tab-reverse", "keyboard-tab-reverse"), + ("keyboard-variant", "keyboard-variant"), + ("khanda", "khanda"), + ("kickstarter", "kickstarter"), + ("kite", "kite"), + ("kite-outline", "kite-outline"), + ("kitesurfing", "kitesurfing"), + ("klingon", "klingon"), + ("knife", "knife"), + ("knife-military", "knife-military"), + ("knob", "knob"), + ("koala", "koala"), + ("kodi", "kodi"), + ("kubernetes", "kubernetes"), + ("label", "label"), + ("label-multiple", "label-multiple"), + ("label-multiple-outline", "label-multiple-outline"), + ("label-off", "label-off"), + ("label-off-outline", "label-off-outline"), + ("label-outline", "label-outline"), + ("label-percent", "label-percent"), + ("label-percent-outline", "label-percent-outline"), + ("label-variant", "label-variant"), + ("label-variant-outline", "label-variant-outline"), + ("ladder", "ladder"), + ("ladybug", "ladybug"), + ("lambda", "lambda"), + ("lamp", "lamp"), + ("lamp-outline", "lamp-outline"), + ("lamps", "lamps"), + ("lamps-outline", "lamps-outline"), + ("lan", "lan"), + ("lan-check", "lan-check"), + ("lan-connect", "lan-connect"), + ("lan-disconnect", "lan-disconnect"), + ("lan-pending", "lan-pending"), + ("land-fields", "land-fields"), + ("land-plots", "land-plots"), + ("land-plots-circle", "land-plots-circle"), + ("land-plots-circle-variant", "land-plots-circle-variant"), + ("land-rows-horizontal", "land-rows-horizontal"), + ("land-rows-vertical", "land-rows-vertical"), + ("landslide", "landslide"), + ("landslide-outline", "landslide-outline"), + ("language-c", "language-c"), + ("language-cpp", "language-cpp"), + ("language-csharp", "language-csharp"), + ("language-css3", "language-css3"), + ("language-fortran", "language-fortran"), + ("language-go", "language-go"), + ("language-haskell", "language-haskell"), + ("language-html5", "language-html5"), + ("language-java", "language-java"), + ("language-javascript", "language-javascript"), + ("language-jsx", "language-jsx"), + ("language-kotlin", "language-kotlin"), + ("language-lua", "language-lua"), + ("language-markdown", "language-markdown"), + ("language-markdown-outline", "language-markdown-outline"), + ("language-php", "language-php"), + ("language-python", "language-python"), + ("language-python-text", "language-python-text"), + ("language-r", "language-r"), + ("language-ruby", "language-ruby"), + ("language-ruby-on-rails", "language-ruby-on-rails"), + ("language-rust", "language-rust"), + ("language-swift", "language-swift"), + ("language-typescript", "language-typescript"), + ("language-xaml", "language-xaml"), + ("laptop", "laptop"), + ("laptop-account", "laptop-account"), + ("laptop-chromebook", "laptop-chromebook"), + ("laptop-mac", "laptop-mac"), + ("laptop-off", "laptop-off"), + ("laptop-windows", "laptop-windows"), + ("laravel", "laravel"), + ("laser-pointer", "laser-pointer"), + ("lasso", "lasso"), + ("lastfm", "lastfm"), + ("lastpass", "lastpass"), + ("latitude", "latitude"), + ("launch", "launch"), + ("lava-lamp", "lava-lamp"), + ("layers", "layers"), + ("layers-edit", "layers-edit"), + ("layers-minus", "layers-minus"), + ("layers-off", "layers-off"), + ("layers-off-outline", "layers-off-outline"), + ("layers-outline", "layers-outline"), + ("layers-plus", "layers-plus"), + ("layers-remove", "layers-remove"), + ("layers-search", "layers-search"), + ("layers-search-outline", "layers-search-outline"), + ("layers-triple", "layers-triple"), + ("layers-triple-outline", "layers-triple-outline"), + ("lead-pencil", "lead-pencil"), + ("leaf", "leaf"), + ("leaf-circle", "leaf-circle"), + ("leaf-circle-outline", "leaf-circle-outline"), + ("leaf-maple", "leaf-maple"), + ("leaf-maple-off", "leaf-maple-off"), + ("leaf-off", "leaf-off"), + ("leak", "leak"), + ("leak-off", "leak-off"), + ("lectern", "lectern"), + ("led-off", "led-off"), + ("led-on", "led-on"), + ("led-outline", "led-outline"), + ("led-strip", "led-strip"), + ("led-strip-variant", "led-strip-variant"), + ("led-strip-variant-off", "led-strip-variant-off"), + ("led-variant-off", "led-variant-off"), + ("led-variant-on", "led-variant-on"), + ("led-variant-outline", "led-variant-outline"), + ("leek", "leek"), + ("less-than", "less-than"), + ("less-than-or-equal", "less-than-or-equal"), + ("library", "library"), + ("library-books", "library-books"), + ("library-outline", "library-outline"), + ("library-shelves", "library-shelves"), + ("license", "license"), + ("lifebuoy", "lifebuoy"), + ("light-flood-down", "light-flood-down"), + ("light-flood-up", "light-flood-up"), + ("light-recessed", "light-recessed"), + ("light-switch", "light-switch"), + ("light-switch-off", "light-switch-off"), + ("lightbulb", "lightbulb"), + ("lightbulb-alert", "lightbulb-alert"), + ("lightbulb-alert-outline", "lightbulb-alert-outline"), + ("lightbulb-auto", "lightbulb-auto"), + ("lightbulb-auto-outline", "lightbulb-auto-outline"), + ("lightbulb-cfl", "lightbulb-cfl"), + ("lightbulb-cfl-off", "lightbulb-cfl-off"), + ("lightbulb-cfl-spiral", "lightbulb-cfl-spiral"), + ("lightbulb-cfl-spiral-off", "lightbulb-cfl-spiral-off"), + ("lightbulb-fluorescent-tube", "lightbulb-fluorescent-tube"), + ("lightbulb-fluorescent-tube-outline", "lightbulb-fluorescent-tube-outline"), + ("lightbulb-group", "lightbulb-group"), + ("lightbulb-group-off", "lightbulb-group-off"), + ("lightbulb-group-off-outline", "lightbulb-group-off-outline"), + ("lightbulb-group-outline", "lightbulb-group-outline"), + ("lightbulb-multiple", "lightbulb-multiple"), + ("lightbulb-multiple-off", "lightbulb-multiple-off"), + ("lightbulb-multiple-off-outline", "lightbulb-multiple-off-outline"), + ("lightbulb-multiple-outline", "lightbulb-multiple-outline"), + ("lightbulb-night", "lightbulb-night"), + ("lightbulb-night-outline", "lightbulb-night-outline"), + ("lightbulb-off", "lightbulb-off"), + ("lightbulb-off-outline", "lightbulb-off-outline"), + ("lightbulb-on", "lightbulb-on"), + ("lightbulb-on-10", "lightbulb-on-10"), + ("lightbulb-on-20", "lightbulb-on-20"), + ("lightbulb-on-30", "lightbulb-on-30"), + ("lightbulb-on-40", "lightbulb-on-40"), + ("lightbulb-on-50", "lightbulb-on-50"), + ("lightbulb-on-60", "lightbulb-on-60"), + ("lightbulb-on-70", "lightbulb-on-70"), + ("lightbulb-on-80", "lightbulb-on-80"), + ("lightbulb-on-90", "lightbulb-on-90"), + ("lightbulb-on-outline", "lightbulb-on-outline"), + ("lightbulb-outline", "lightbulb-outline"), + ("lightbulb-question", "lightbulb-question"), + ("lightbulb-question-outline", "lightbulb-question-outline"), + ("lightbulb-spot", "lightbulb-spot"), + ("lightbulb-spot-off", "lightbulb-spot-off"), + ("lightbulb-variant", "lightbulb-variant"), + ("lightbulb-variant-outline", "lightbulb-variant-outline"), + ("lighthouse", "lighthouse"), + ("lighthouse-on", "lighthouse-on"), + ("lightning-bolt", "lightning-bolt"), + ("lightning-bolt-circle", "lightning-bolt-circle"), + ("lightning-bolt-outline", "lightning-bolt-outline"), + ("line-scan", "line-scan"), + ("lingerie", "lingerie"), + ("link", "link"), + ("link-box", "link-box"), + ("link-box-outline", "link-box-outline"), + ("link-box-variant", "link-box-variant"), + ("link-box-variant-outline", "link-box-variant-outline"), + ("link-lock", "link-lock"), + ("link-off", "link-off"), + ("link-plus", "link-plus"), + ("link-variant", "link-variant"), + ("link-variant-minus", "link-variant-minus"), + ("link-variant-off", "link-variant-off"), + ("link-variant-plus", "link-variant-plus"), + ("link-variant-remove", "link-variant-remove"), + ("linkedin", "linkedin"), + ("linode", "linode"), + ("linux", "linux"), + ("linux-mint", "linux-mint"), + ("lipstick", "lipstick"), + ("liquid-spot", "liquid-spot"), + ("liquor", "liquor"), + ("list-box", "list-box"), + ("list-box-outline", "list-box-outline"), + ("list-status", "list-status"), + ("litecoin", "litecoin"), + ("loading", "loading"), + ("location-enter", "location-enter"), + ("location-exit", "location-exit"), + ("lock", "lock"), + ("lock-alert", "lock-alert"), + ("lock-alert-outline", "lock-alert-outline"), + ("lock-check", "lock-check"), + ("lock-check-outline", "lock-check-outline"), + ("lock-clock", "lock-clock"), + ("lock-minus", "lock-minus"), + ("lock-minus-outline", "lock-minus-outline"), + ("lock-off", "lock-off"), + ("lock-off-outline", "lock-off-outline"), + ("lock-open", "lock-open"), + ("lock-open-alert", "lock-open-alert"), + ("lock-open-alert-outline", "lock-open-alert-outline"), + ("lock-open-check", "lock-open-check"), + ("lock-open-check-outline", "lock-open-check-outline"), + ("lock-open-minus", "lock-open-minus"), + ("lock-open-minus-outline", "lock-open-minus-outline"), + ("lock-open-outline", "lock-open-outline"), + ("lock-open-plus", "lock-open-plus"), + ("lock-open-plus-outline", "lock-open-plus-outline"), + ("lock-open-remove", "lock-open-remove"), + ("lock-open-remove-outline", "lock-open-remove-outline"), + ("lock-open-variant", "lock-open-variant"), + ("lock-open-variant-outline", "lock-open-variant-outline"), + ("lock-outline", "lock-outline"), + ("lock-pattern", "lock-pattern"), + ("lock-percent", "lock-percent"), + ("lock-percent-open", "lock-percent-open"), + ("lock-percent-open-outline", "lock-percent-open-outline"), + ("lock-percent-open-variant", "lock-percent-open-variant"), + ("lock-percent-open-variant-outline", "lock-percent-open-variant-outline"), + ("lock-percent-outline", "lock-percent-outline"), + ("lock-plus", "lock-plus"), + ("lock-plus-outline", "lock-plus-outline"), + ("lock-question", "lock-question"), + ("lock-remove", "lock-remove"), + ("lock-remove-outline", "lock-remove-outline"), + ("lock-reset", "lock-reset"), + ("lock-smart", "lock-smart"), + ("locker", "locker"), + ("locker-multiple", "locker-multiple"), + ("login", "login"), + ("login-variant", "login-variant"), + ("logout", "logout"), + ("logout-variant", "logout-variant"), + ("longitude", "longitude"), + ("looks", "looks"), + ("lotion", "lotion"), + ("lotion-outline", "lotion-outline"), + ("lotion-plus", "lotion-plus"), + ("lotion-plus-outline", "lotion-plus-outline"), + ("loupe", "loupe"), + ("lumx", "lumx"), + ("lungs", "lungs"), + ("lyft", "lyft"), + ("mace", "mace"), + ("magazine-pistol", "magazine-pistol"), + ("magazine-rifle", "magazine-rifle"), + ("magic-staff", "magic-staff"), + ("magnet", "magnet"), + ("magnet-on", "magnet-on"), + ("magnify", "magnify"), + ("magnify-close", "magnify-close"), + ("magnify-expand", "magnify-expand"), + ("magnify-minus", "magnify-minus"), + ("magnify-minus-cursor", "magnify-minus-cursor"), + ("magnify-minus-outline", "magnify-minus-outline"), + ("magnify-plus", "magnify-plus"), + ("magnify-plus-cursor", "magnify-plus-cursor"), + ("magnify-plus-outline", "magnify-plus-outline"), + ("magnify-remove-cursor", "magnify-remove-cursor"), + ("magnify-remove-outline", "magnify-remove-outline"), + ("magnify-scan", "magnify-scan"), + ("mail", "mail"), + ("mail-ru", "mail-ru"), + ("mailbox", "mailbox"), + ("mailbox-open", "mailbox-open"), + ("mailbox-open-outline", "mailbox-open-outline"), + ("mailbox-open-up", "mailbox-open-up"), + ("mailbox-open-up-outline", "mailbox-open-up-outline"), + ("mailbox-outline", "mailbox-outline"), + ("mailbox-up", "mailbox-up"), + ("mailbox-up-outline", "mailbox-up-outline"), + ("manjaro", "manjaro"), + ("map", "map"), + ("map-check", "map-check"), + ("map-check-outline", "map-check-outline"), + ("map-clock", "map-clock"), + ("map-clock-outline", "map-clock-outline"), + ("map-legend", "map-legend"), + ("map-marker", "map-marker"), + ("map-marker-account", "map-marker-account"), + ("map-marker-account-outline", "map-marker-account-outline"), + ("map-marker-alert", "map-marker-alert"), + ("map-marker-alert-outline", "map-marker-alert-outline"), + ("map-marker-check", "map-marker-check"), + ("map-marker-check-outline", "map-marker-check-outline"), + ("map-marker-circle", "map-marker-circle"), + ("map-marker-distance", "map-marker-distance"), + ("map-marker-down", "map-marker-down"), + ("map-marker-left", "map-marker-left"), + ("map-marker-left-outline", "map-marker-left-outline"), + ("map-marker-minus", "map-marker-minus"), + ("map-marker-minus-outline", "map-marker-minus-outline"), + ("map-marker-multiple", "map-marker-multiple"), + ("map-marker-multiple-outline", "map-marker-multiple-outline"), + ("map-marker-off", "map-marker-off"), + ("map-marker-off-outline", "map-marker-off-outline"), + ("map-marker-outline", "map-marker-outline"), + ("map-marker-path", "map-marker-path"), + ("map-marker-plus", "map-marker-plus"), + ("map-marker-plus-outline", "map-marker-plus-outline"), + ("map-marker-question", "map-marker-question"), + ("map-marker-question-outline", "map-marker-question-outline"), + ("map-marker-radius", "map-marker-radius"), + ("map-marker-radius-outline", "map-marker-radius-outline"), + ("map-marker-remove", "map-marker-remove"), + ("map-marker-remove-outline", "map-marker-remove-outline"), + ("map-marker-remove-variant", "map-marker-remove-variant"), + ("map-marker-right", "map-marker-right"), + ("map-marker-right-outline", "map-marker-right-outline"), + ("map-marker-star", "map-marker-star"), + ("map-marker-star-outline", "map-marker-star-outline"), + ("map-marker-up", "map-marker-up"), + ("map-minus", "map-minus"), + ("map-outline", "map-outline"), + ("map-plus", "map-plus"), + ("map-search", "map-search"), + ("map-search-outline", "map-search-outline"), + ("mapbox", "mapbox"), + ("margin", "margin"), + ("marker", "marker"), + ("marker-cancel", "marker-cancel"), + ("marker-check", "marker-check"), + ("mastodon", "mastodon"), + ("mastodon-variant", "mastodon-variant"), + ("material-design", "material-design"), + ("material-ui", "material-ui"), + ("math-compass", "math-compass"), + ("math-cos", "math-cos"), + ("math-integral", "math-integral"), + ("math-integral-box", "math-integral-box"), + ("math-log", "math-log"), + ("math-norm", "math-norm"), + ("math-norm-box", "math-norm-box"), + ("math-sin", "math-sin"), + ("math-tan", "math-tan"), + ("matrix", "matrix"), + ("maxcdn", "maxcdn"), + ("medal", "medal"), + ("medal-outline", "medal-outline"), + ("medical-bag", "medical-bag"), + ("medical-cotton-swab", "medical-cotton-swab"), + ("medication", "medication"), + ("medication-outline", "medication-outline"), + ("meditation", "meditation"), + ("medium", "medium"), + ("meetup", "meetup"), + ("memory", "memory"), + ("menorah", "menorah"), + ("menorah-fire", "menorah-fire"), + ("menu", "menu"), + ("menu-close", "menu-close"), + ("menu-down", "menu-down"), + ("menu-down-outline", "menu-down-outline"), + ("menu-left", "menu-left"), + ("menu-left-outline", "menu-left-outline"), + ("menu-open", "menu-open"), + ("menu-right", "menu-right"), + ("menu-right-outline", "menu-right-outline"), + ("menu-swap", "menu-swap"), + ("menu-swap-outline", "menu-swap-outline"), + ("menu-up", "menu-up"), + ("menu-up-outline", "menu-up-outline"), + ("merge", "merge"), + ("message", "message"), + ("message-alert", "message-alert"), + ("message-alert-outline", "message-alert-outline"), + ("message-arrow-left", "message-arrow-left"), + ("message-arrow-left-outline", "message-arrow-left-outline"), + ("message-arrow-right", "message-arrow-right"), + ("message-arrow-right-outline", "message-arrow-right-outline"), + ("message-badge", "message-badge"), + ("message-badge-outline", "message-badge-outline"), + ("message-bookmark", "message-bookmark"), + ("message-bookmark-outline", "message-bookmark-outline"), + ("message-bulleted", "message-bulleted"), + ("message-bulleted-off", "message-bulleted-off"), + ("message-check", "message-check"), + ("message-check-outline", "message-check-outline"), + ("message-cog", "message-cog"), + ("message-cog-outline", "message-cog-outline"), + ("message-draw", "message-draw"), + ("message-fast", "message-fast"), + ("message-fast-outline", "message-fast-outline"), + ("message-flash", "message-flash"), + ("message-flash-outline", "message-flash-outline"), + ("message-image", "message-image"), + ("message-image-outline", "message-image-outline"), + ("message-lock", "message-lock"), + ("message-lock-outline", "message-lock-outline"), + ("message-minus", "message-minus"), + ("message-minus-outline", "message-minus-outline"), + ("message-off", "message-off"), + ("message-off-outline", "message-off-outline"), + ("message-outline", "message-outline"), + ("message-plus", "message-plus"), + ("message-plus-outline", "message-plus-outline"), + ("message-processing", "message-processing"), + ("message-processing-outline", "message-processing-outline"), + ("message-question", "message-question"), + ("message-question-outline", "message-question-outline"), + ("message-reply", "message-reply"), + ("message-reply-outline", "message-reply-outline"), + ("message-reply-text", "message-reply-text"), + ("message-reply-text-outline", "message-reply-text-outline"), + ("message-settings", "message-settings"), + ("message-settings-outline", "message-settings-outline"), + ("message-star", "message-star"), + ("message-star-outline", "message-star-outline"), + ("message-text", "message-text"), + ("message-text-clock", "message-text-clock"), + ("message-text-clock-outline", "message-text-clock-outline"), + ("message-text-fast", "message-text-fast"), + ("message-text-fast-outline", "message-text-fast-outline"), + ("message-text-lock", "message-text-lock"), + ("message-text-lock-outline", "message-text-lock-outline"), + ("message-text-outline", "message-text-outline"), + ("message-video", "message-video"), + ("meteor", "meteor"), + ("meter-electric", "meter-electric"), + ("meter-electric-outline", "meter-electric-outline"), + ("meter-gas", "meter-gas"), + ("meter-gas-outline", "meter-gas-outline"), + ("metronome", "metronome"), + ("metronome-tick", "metronome-tick"), + ("micro-sd", "micro-sd"), + ("microphone", "microphone"), + ("microphone-message", "microphone-message"), + ("microphone-message-off", "microphone-message-off"), + ("microphone-minus", "microphone-minus"), + ("microphone-off", "microphone-off"), + ("microphone-outline", "microphone-outline"), + ("microphone-plus", "microphone-plus"), + ("microphone-question", "microphone-question"), + ("microphone-question-outline", "microphone-question-outline"), + ("microphone-settings", "microphone-settings"), + ("microphone-variant", "microphone-variant"), + ("microphone-variant-off", "microphone-variant-off"), + ("microscope", "microscope"), + ("microsoft", "microsoft"), + ("microsoft-access", "microsoft-access"), + ("microsoft-azure", "microsoft-azure"), + ("microsoft-azure-devops", "microsoft-azure-devops"), + ("microsoft-bing", "microsoft-bing"), + ("microsoft-dynamics-365", "microsoft-dynamics-365"), + ("microsoft-edge", "microsoft-edge"), + ("microsoft-edge-legacy", "microsoft-edge-legacy"), + ("microsoft-excel", "microsoft-excel"), + ("microsoft-internet-explorer", "microsoft-internet-explorer"), + ("microsoft-office", "microsoft-office"), + ("microsoft-onedrive", "microsoft-onedrive"), + ("microsoft-onenote", "microsoft-onenote"), + ("microsoft-outlook", "microsoft-outlook"), + ("microsoft-powerpoint", "microsoft-powerpoint"), + ("microsoft-sharepoint", "microsoft-sharepoint"), + ("microsoft-teams", "microsoft-teams"), + ("microsoft-visual-studio", "microsoft-visual-studio"), + ("microsoft-visual-studio-code", "microsoft-visual-studio-code"), + ("microsoft-windows", "microsoft-windows"), + ("microsoft-windows-classic", "microsoft-windows-classic"), + ("microsoft-word", "microsoft-word"), + ("microsoft-xbox", "microsoft-xbox"), + ("microsoft-xbox-controller", "microsoft-xbox-controller"), + ( + "microsoft-xbox-controller-battery-alert", + "microsoft-xbox-controller-battery-alert", + ), + ( + "microsoft-xbox-controller-battery-charging", + "microsoft-xbox-controller-battery-charging", + ), + ( + "microsoft-xbox-controller-battery-empty", + "microsoft-xbox-controller-battery-empty", + ), + ( + "microsoft-xbox-controller-battery-full", + "microsoft-xbox-controller-battery-full", + ), + ( + "microsoft-xbox-controller-battery-low", + "microsoft-xbox-controller-battery-low", + ), + ( + "microsoft-xbox-controller-battery-medium", + "microsoft-xbox-controller-battery-medium", + ), + ( + "microsoft-xbox-controller-battery-unknown", + "microsoft-xbox-controller-battery-unknown", + ), + ("microsoft-xbox-controller-menu", "microsoft-xbox-controller-menu"), + ("microsoft-xbox-controller-off", "microsoft-xbox-controller-off"), + ("microsoft-xbox-controller-view", "microsoft-xbox-controller-view"), + ("microsoft-yammer", "microsoft-yammer"), + ("microwave", "microwave"), + ("microwave-off", "microwave-off"), + ("middleware", "middleware"), + ("middleware-outline", "middleware-outline"), + ("midi", "midi"), + ("midi-input", "midi-input"), + ("midi-port", "midi-port"), + ("mine", "mine"), + ("minecraft", "minecraft"), + ("mini-sd", "mini-sd"), + ("minidisc", "minidisc"), + ("minus", "minus"), + ("minus-box", "minus-box"), + ("minus-box-multiple", "minus-box-multiple"), + ("minus-box-multiple-outline", "minus-box-multiple-outline"), + ("minus-box-outline", "minus-box-outline"), + ("minus-circle", "minus-circle"), + ("minus-circle-multiple", "minus-circle-multiple"), + ("minus-circle-multiple-outline", "minus-circle-multiple-outline"), + ("minus-circle-off", "minus-circle-off"), + ("minus-circle-off-outline", "minus-circle-off-outline"), + ("minus-circle-outline", "minus-circle-outline"), + ("minus-network", "minus-network"), + ("minus-network-outline", "minus-network-outline"), + ("minus-thick", "minus-thick"), + ("mirror", "mirror"), + ("mirror-rectangle", "mirror-rectangle"), + ("mirror-variant", "mirror-variant"), + ("mixcloud", "mixcloud"), + ("mixed-martial-arts", "mixed-martial-arts"), + ("mixed-reality", "mixed-reality"), + ("mixer", "mixer"), + ("molecule", "molecule"), + ("molecule-co", "molecule-co"), + ("molecule-co2", "molecule-co2"), + ("monitor", "monitor"), + ("monitor-account", "monitor-account"), + ("monitor-arrow-down", "monitor-arrow-down"), + ("monitor-arrow-down-variant", "monitor-arrow-down-variant"), + ("monitor-cellphone", "monitor-cellphone"), + ("monitor-cellphone-star", "monitor-cellphone-star"), + ("monitor-dashboard", "monitor-dashboard"), + ("monitor-edit", "monitor-edit"), + ("monitor-eye", "monitor-eye"), + ("monitor-lock", "monitor-lock"), + ("monitor-multiple", "monitor-multiple"), + ("monitor-off", "monitor-off"), + ("monitor-screenshot", "monitor-screenshot"), + ("monitor-share", "monitor-share"), + ("monitor-shimmer", "monitor-shimmer"), + ("monitor-small", "monitor-small"), + ("monitor-speaker", "monitor-speaker"), + ("monitor-speaker-off", "monitor-speaker-off"), + ("monitor-star", "monitor-star"), + ("moon-first-quarter", "moon-first-quarter"), + ("moon-full", "moon-full"), + ("moon-last-quarter", "moon-last-quarter"), + ("moon-new", "moon-new"), + ("moon-waning-crescent", "moon-waning-crescent"), + ("moon-waning-gibbous", "moon-waning-gibbous"), + ("moon-waxing-crescent", "moon-waxing-crescent"), + ("moon-waxing-gibbous", "moon-waxing-gibbous"), + ("moped", "moped"), + ("moped-electric", "moped-electric"), + ("moped-electric-outline", "moped-electric-outline"), + ("moped-outline", "moped-outline"), + ("more", "more"), + ("mortar-pestle", "mortar-pestle"), + ("mortar-pestle-plus", "mortar-pestle-plus"), + ("mosque", "mosque"), + ("mosque-outline", "mosque-outline"), + ("mother-heart", "mother-heart"), + ("mother-nurse", "mother-nurse"), + ("motion", "motion"), + ("motion-outline", "motion-outline"), + ("motion-pause", "motion-pause"), + ("motion-pause-outline", "motion-pause-outline"), + ("motion-play", "motion-play"), + ("motion-play-outline", "motion-play-outline"), + ("motion-sensor", "motion-sensor"), + ("motion-sensor-off", "motion-sensor-off"), + ("motorbike", "motorbike"), + ("motorbike-electric", "motorbike-electric"), + ("motorbike-off", "motorbike-off"), + ("mouse", "mouse"), + ("mouse-bluetooth", "mouse-bluetooth"), + ("mouse-move-down", "mouse-move-down"), + ("mouse-move-up", "mouse-move-up"), + ("mouse-move-vertical", "mouse-move-vertical"), + ("mouse-off", "mouse-off"), + ("mouse-variant", "mouse-variant"), + ("mouse-variant-off", "mouse-variant-off"), + ("move-resize", "move-resize"), + ("move-resize-variant", "move-resize-variant"), + ("movie", "movie"), + ("movie-check", "movie-check"), + ("movie-check-outline", "movie-check-outline"), + ("movie-cog", "movie-cog"), + ("movie-cog-outline", "movie-cog-outline"), + ("movie-edit", "movie-edit"), + ("movie-edit-outline", "movie-edit-outline"), + ("movie-filter", "movie-filter"), + ("movie-filter-outline", "movie-filter-outline"), + ("movie-minus", "movie-minus"), + ("movie-minus-outline", "movie-minus-outline"), + ("movie-off", "movie-off"), + ("movie-off-outline", "movie-off-outline"), + ("movie-open", "movie-open"), + ("movie-open-check", "movie-open-check"), + ("movie-open-check-outline", "movie-open-check-outline"), + ("movie-open-cog", "movie-open-cog"), + ("movie-open-cog-outline", "movie-open-cog-outline"), + ("movie-open-edit", "movie-open-edit"), + ("movie-open-edit-outline", "movie-open-edit-outline"), + ("movie-open-minus", "movie-open-minus"), + ("movie-open-minus-outline", "movie-open-minus-outline"), + ("movie-open-off", "movie-open-off"), + ("movie-open-off-outline", "movie-open-off-outline"), + ("movie-open-outline", "movie-open-outline"), + ("movie-open-play", "movie-open-play"), + ("movie-open-play-outline", "movie-open-play-outline"), + ("movie-open-plus", "movie-open-plus"), + ("movie-open-plus-outline", "movie-open-plus-outline"), + ("movie-open-remove", "movie-open-remove"), + ("movie-open-remove-outline", "movie-open-remove-outline"), + ("movie-open-settings", "movie-open-settings"), + ("movie-open-settings-outline", "movie-open-settings-outline"), + ("movie-open-star", "movie-open-star"), + ("movie-open-star-outline", "movie-open-star-outline"), + ("movie-outline", "movie-outline"), + ("movie-play", "movie-play"), + ("movie-play-outline", "movie-play-outline"), + ("movie-plus", "movie-plus"), + ("movie-plus-outline", "movie-plus-outline"), + ("movie-remove", "movie-remove"), + ("movie-remove-outline", "movie-remove-outline"), + ("movie-roll", "movie-roll"), + ("movie-search", "movie-search"), + ("movie-search-outline", "movie-search-outline"), + ("movie-settings", "movie-settings"), + ("movie-settings-outline", "movie-settings-outline"), + ("movie-star", "movie-star"), + ("movie-star-outline", "movie-star-outline"), + ("mower", "mower"), + ("mower-bag", "mower-bag"), + ("mower-bag-on", "mower-bag-on"), + ("mower-on", "mower-on"), + ("muffin", "muffin"), + ("multicast", "multicast"), + ("multimedia", "multimedia"), + ("multiplication", "multiplication"), + ("multiplication-box", "multiplication-box"), + ("mushroom", "mushroom"), + ("mushroom-off", "mushroom-off"), + ("mushroom-off-outline", "mushroom-off-outline"), + ("mushroom-outline", "mushroom-outline"), + ("music", "music"), + ("music-accidental-double-flat", "music-accidental-double-flat"), + ("music-accidental-double-sharp", "music-accidental-double-sharp"), + ("music-accidental-flat", "music-accidental-flat"), + ("music-accidental-natural", "music-accidental-natural"), + ("music-accidental-sharp", "music-accidental-sharp"), + ("music-box", "music-box"), + ("music-box-multiple", "music-box-multiple"), + ("music-box-multiple-outline", "music-box-multiple-outline"), + ("music-box-outline", "music-box-outline"), + ("music-circle", "music-circle"), + ("music-circle-outline", "music-circle-outline"), + ("music-clef-alto", "music-clef-alto"), + ("music-clef-bass", "music-clef-bass"), + ("music-clef-treble", "music-clef-treble"), + ("music-note", "music-note"), + ("music-note-bluetooth", "music-note-bluetooth"), + ("music-note-bluetooth-off", "music-note-bluetooth-off"), + ("music-note-eighth", "music-note-eighth"), + ("music-note-eighth-dotted", "music-note-eighth-dotted"), + ("music-note-half", "music-note-half"), + ("music-note-half-dotted", "music-note-half-dotted"), + ("music-note-minus", "music-note-minus"), + ("music-note-off", "music-note-off"), + ("music-note-off-outline", "music-note-off-outline"), + ("music-note-outline", "music-note-outline"), + ("music-note-plus", "music-note-plus"), + ("music-note-quarter", "music-note-quarter"), + ("music-note-quarter-dotted", "music-note-quarter-dotted"), + ("music-note-sixteenth", "music-note-sixteenth"), + ("music-note-sixteenth-dotted", "music-note-sixteenth-dotted"), + ("music-note-whole", "music-note-whole"), + ("music-note-whole-dotted", "music-note-whole-dotted"), + ("music-off", "music-off"), + ("music-rest-eighth", "music-rest-eighth"), + ("music-rest-half", "music-rest-half"), + ("music-rest-quarter", "music-rest-quarter"), + ("music-rest-sixteenth", "music-rest-sixteenth"), + ("music-rest-whole", "music-rest-whole"), + ("mustache", "mustache"), + ("nail", "nail"), + ("nas", "nas"), + ("nativescript", "nativescript"), + ("nature", "nature"), + ("nature-people", "nature-people"), + ("navigation", "navigation"), + ("navigation-outline", "navigation-outline"), + ("navigation-variant", "navigation-variant"), + ("navigation-variant-outline", "navigation-variant-outline"), + ("near-me", "near-me"), + ("necklace", "necklace"), + ("needle", "needle"), + ("needle-off", "needle-off"), + ("nest-thermostat", "nest-thermostat"), + ("netflix", "netflix"), + ("network", "network"), + ("network-off", "network-off"), + ("network-off-outline", "network-off-outline"), + ("network-outline", "network-outline"), + ("network-pos", "network-pos"), + ("network-strength-1", "network-strength-1"), + ("network-strength-1-alert", "network-strength-1-alert"), + ("network-strength-2", "network-strength-2"), + ("network-strength-2-alert", "network-strength-2-alert"), + ("network-strength-3", "network-strength-3"), + ("network-strength-3-alert", "network-strength-3-alert"), + ("network-strength-4", "network-strength-4"), + ("network-strength-4-alert", "network-strength-4-alert"), + ("network-strength-4-cog", "network-strength-4-cog"), + ("network-strength-alert", "network-strength-alert"), + ("network-strength-alert-outline", "network-strength-alert-outline"), + ("network-strength-off", "network-strength-off"), + ("network-strength-off-outline", "network-strength-off-outline"), + ("network-strength-outline", "network-strength-outline"), + ("new-box", "new-box"), + ("newspaper", "newspaper"), + ("newspaper-check", "newspaper-check"), + ("newspaper-minus", "newspaper-minus"), + ("newspaper-plus", "newspaper-plus"), + ("newspaper-remove", "newspaper-remove"), + ("newspaper-variant", "newspaper-variant"), + ("newspaper-variant-multiple", "newspaper-variant-multiple"), + ("newspaper-variant-multiple-outline", "newspaper-variant-multiple-outline"), + ("newspaper-variant-outline", "newspaper-variant-outline"), + ("nfc", "nfc"), + ("nfc-off", "nfc-off"), + ("nfc-search-variant", "nfc-search-variant"), + ("nfc-tap", "nfc-tap"), + ("nfc-variant", "nfc-variant"), + ("nfc-variant-off", "nfc-variant-off"), + ("ninja", "ninja"), + ("nintendo-game-boy", "nintendo-game-boy"), + ("nintendo-switch", "nintendo-switch"), + ("nintendo-wii", "nintendo-wii"), + ("nintendo-wiiu", "nintendo-wiiu"), + ("nix", "nix"), + ("nodejs", "nodejs"), + ("noodles", "noodles"), + ("not-equal", "not-equal"), + ("not-equal-variant", "not-equal-variant"), + ("note", "note"), + ("note-alert", "note-alert"), + ("note-alert-outline", "note-alert-outline"), + ("note-check", "note-check"), + ("note-check-outline", "note-check-outline"), + ("note-edit", "note-edit"), + ("note-edit-outline", "note-edit-outline"), + ("note-minus", "note-minus"), + ("note-minus-outline", "note-minus-outline"), + ("note-multiple", "note-multiple"), + ("note-multiple-outline", "note-multiple-outline"), + ("note-off", "note-off"), + ("note-off-outline", "note-off-outline"), + ("note-outline", "note-outline"), + ("note-plus", "note-plus"), + ("note-plus-outline", "note-plus-outline"), + ("note-remove", "note-remove"), + ("note-remove-outline", "note-remove-outline"), + ("note-search", "note-search"), + ("note-search-outline", "note-search-outline"), + ("note-text", "note-text"), + ("note-text-outline", "note-text-outline"), + ("notebook", "notebook"), + ("notebook-check", "notebook-check"), + ("notebook-check-outline", "notebook-check-outline"), + ("notebook-edit", "notebook-edit"), + ("notebook-edit-outline", "notebook-edit-outline"), + ("notebook-heart", "notebook-heart"), + ("notebook-heart-outline", "notebook-heart-outline"), + ("notebook-minus", "notebook-minus"), + ("notebook-minus-outline", "notebook-minus-outline"), + ("notebook-multiple", "notebook-multiple"), + ("notebook-outline", "notebook-outline"), + ("notebook-plus", "notebook-plus"), + ("notebook-plus-outline", "notebook-plus-outline"), + ("notebook-remove", "notebook-remove"), + ("notebook-remove-outline", "notebook-remove-outline"), + ("notification-clear-all", "notification-clear-all"), + ("npm", "npm"), + ("npm-variant", "npm-variant"), + ("npm-variant-outline", "npm-variant-outline"), + ("nuke", "nuke"), + ("null", "null"), + ("numeric", "numeric"), + ("numeric-0", "numeric-0"), + ("numeric-0-box", "numeric-0-box"), + ("numeric-0-box-multiple", "numeric-0-box-multiple"), + ("numeric-0-box-multiple-outline", "numeric-0-box-multiple-outline"), + ("numeric-0-box-outline", "numeric-0-box-outline"), + ("numeric-0-circle", "numeric-0-circle"), + ("numeric-0-circle-outline", "numeric-0-circle-outline"), + ("numeric-1", "numeric-1"), + ("numeric-1-box", "numeric-1-box"), + ("numeric-1-box-multiple", "numeric-1-box-multiple"), + ("numeric-1-box-multiple-outline", "numeric-1-box-multiple-outline"), + ("numeric-1-box-outline", "numeric-1-box-outline"), + ("numeric-1-circle", "numeric-1-circle"), + ("numeric-1-circle-outline", "numeric-1-circle-outline"), + ("numeric-10", "numeric-10"), + ("numeric-10-box", "numeric-10-box"), + ("numeric-10-box-multiple", "numeric-10-box-multiple"), + ("numeric-10-box-multiple-outline", "numeric-10-box-multiple-outline"), + ("numeric-10-box-outline", "numeric-10-box-outline"), + ("numeric-10-circle", "numeric-10-circle"), + ("numeric-10-circle-outline", "numeric-10-circle-outline"), + ("numeric-2", "numeric-2"), + ("numeric-2-box", "numeric-2-box"), + ("numeric-2-box-multiple", "numeric-2-box-multiple"), + ("numeric-2-box-multiple-outline", "numeric-2-box-multiple-outline"), + ("numeric-2-box-outline", "numeric-2-box-outline"), + ("numeric-2-circle", "numeric-2-circle"), + ("numeric-2-circle-outline", "numeric-2-circle-outline"), + ("numeric-3", "numeric-3"), + ("numeric-3-box", "numeric-3-box"), + ("numeric-3-box-multiple", "numeric-3-box-multiple"), + ("numeric-3-box-multiple-outline", "numeric-3-box-multiple-outline"), + ("numeric-3-box-outline", "numeric-3-box-outline"), + ("numeric-3-circle", "numeric-3-circle"), + ("numeric-3-circle-outline", "numeric-3-circle-outline"), + ("numeric-4", "numeric-4"), + ("numeric-4-box", "numeric-4-box"), + ("numeric-4-box-multiple", "numeric-4-box-multiple"), + ("numeric-4-box-multiple-outline", "numeric-4-box-multiple-outline"), + ("numeric-4-box-outline", "numeric-4-box-outline"), + ("numeric-4-circle", "numeric-4-circle"), + ("numeric-4-circle-outline", "numeric-4-circle-outline"), + ("numeric-5", "numeric-5"), + ("numeric-5-box", "numeric-5-box"), + ("numeric-5-box-multiple", "numeric-5-box-multiple"), + ("numeric-5-box-multiple-outline", "numeric-5-box-multiple-outline"), + ("numeric-5-box-outline", "numeric-5-box-outline"), + ("numeric-5-circle", "numeric-5-circle"), + ("numeric-5-circle-outline", "numeric-5-circle-outline"), + ("numeric-6", "numeric-6"), + ("numeric-6-box", "numeric-6-box"), + ("numeric-6-box-multiple", "numeric-6-box-multiple"), + ("numeric-6-box-multiple-outline", "numeric-6-box-multiple-outline"), + ("numeric-6-box-outline", "numeric-6-box-outline"), + ("numeric-6-circle", "numeric-6-circle"), + ("numeric-6-circle-outline", "numeric-6-circle-outline"), + ("numeric-7", "numeric-7"), + ("numeric-7-box", "numeric-7-box"), + ("numeric-7-box-multiple", "numeric-7-box-multiple"), + ("numeric-7-box-multiple-outline", "numeric-7-box-multiple-outline"), + ("numeric-7-box-outline", "numeric-7-box-outline"), + ("numeric-7-circle", "numeric-7-circle"), + ("numeric-7-circle-outline", "numeric-7-circle-outline"), + ("numeric-8", "numeric-8"), + ("numeric-8-box", "numeric-8-box"), + ("numeric-8-box-multiple", "numeric-8-box-multiple"), + ("numeric-8-box-multiple-outline", "numeric-8-box-multiple-outline"), + ("numeric-8-box-outline", "numeric-8-box-outline"), + ("numeric-8-circle", "numeric-8-circle"), + ("numeric-8-circle-outline", "numeric-8-circle-outline"), + ("numeric-9", "numeric-9"), + ("numeric-9-box", "numeric-9-box"), + ("numeric-9-box-multiple", "numeric-9-box-multiple"), + ("numeric-9-box-multiple-outline", "numeric-9-box-multiple-outline"), + ("numeric-9-box-outline", "numeric-9-box-outline"), + ("numeric-9-circle", "numeric-9-circle"), + ("numeric-9-circle-outline", "numeric-9-circle-outline"), + ("numeric-9-plus", "numeric-9-plus"), + ("numeric-9-plus-box", "numeric-9-plus-box"), + ("numeric-9-plus-box-multiple", "numeric-9-plus-box-multiple"), + ("numeric-9-plus-box-multiple-outline", "numeric-9-plus-box-multiple-outline"), + ("numeric-9-plus-box-outline", "numeric-9-plus-box-outline"), + ("numeric-9-plus-circle", "numeric-9-plus-circle"), + ("numeric-9-plus-circle-outline", "numeric-9-plus-circle-outline"), + ("numeric-negative-1", "numeric-negative-1"), + ("numeric-off", "numeric-off"), + ("numeric-positive-1", "numeric-positive-1"), + ("nut", "nut"), + ("nutrition", "nutrition"), + ("nuxt", "nuxt"), + ("oar", "oar"), + ("ocarina", "ocarina"), + ("oci", "oci"), + ("ocr", "ocr"), + ("octagon", "octagon"), + ("octagon-outline", "octagon-outline"), + ("octagram", "octagram"), + ("octagram-outline", "octagram-outline"), + ("octahedron", "octahedron"), + ("octahedron-off", "octahedron-off"), + ("odnoklassniki", "odnoklassniki"), + ("offer", "offer"), + ("office-building", "office-building"), + ("office-building-cog", "office-building-cog"), + ("office-building-cog-outline", "office-building-cog-outline"), + ("office-building-marker", "office-building-marker"), + ("office-building-marker-outline", "office-building-marker-outline"), + ("office-building-minus", "office-building-minus"), + ("office-building-minus-outline", "office-building-minus-outline"), + ("office-building-outline", "office-building-outline"), + ("office-building-plus", "office-building-plus"), + ("office-building-plus-outline", "office-building-plus-outline"), + ("office-building-remove", "office-building-remove"), + ("office-building-remove-outline", "office-building-remove-outline"), + ("oil", "oil"), + ("oil-lamp", "oil-lamp"), + ("oil-level", "oil-level"), + ("oil-temperature", "oil-temperature"), + ("om", "om"), + ("omega", "omega"), + ("one-up", "one-up"), + ("onedrive", "onedrive"), + ("onenote", "onenote"), + ("onepassword", "onepassword"), + ("opacity", "opacity"), + ("open-in-app", "open-in-app"), + ("open-in-new", "open-in-new"), + ("open-source-initiative", "open-source-initiative"), + ("openid", "openid"), + ("opera", "opera"), + ("orbit", "orbit"), + ("orbit-variant", "orbit-variant"), + ("order-alphabetical-ascending", "order-alphabetical-ascending"), + ("order-alphabetical-descending", "order-alphabetical-descending"), + ("order-bool-ascending", "order-bool-ascending"), + ("order-bool-ascending-variant", "order-bool-ascending-variant"), + ("order-bool-descending", "order-bool-descending"), + ("order-bool-descending-variant", "order-bool-descending-variant"), + ("order-numeric-ascending", "order-numeric-ascending"), + ("order-numeric-descending", "order-numeric-descending"), + ("origin", "origin"), + ("ornament", "ornament"), + ("ornament-variant", "ornament-variant"), + ("outbox", "outbox"), + ("outdent", "outdent"), + ("outdoor-lamp", "outdoor-lamp"), + ("outlook", "outlook"), + ("overscan", "overscan"), + ("owl", "owl"), + ("pac-man", "pac-man"), + ("package", "package"), + ("package-check", "package-check"), + ("package-down", "package-down"), + ("package-up", "package-up"), + ("package-variant", "package-variant"), + ("package-variant-closed", "package-variant-closed"), + ("package-variant-closed-check", "package-variant-closed-check"), + ("package-variant-closed-minus", "package-variant-closed-minus"), + ("package-variant-closed-plus", "package-variant-closed-plus"), + ("package-variant-closed-remove", "package-variant-closed-remove"), + ("package-variant-minus", "package-variant-minus"), + ("package-variant-plus", "package-variant-plus"), + ("package-variant-remove", "package-variant-remove"), + ("page-first", "page-first"), + ("page-last", "page-last"), + ("page-layout-body", "page-layout-body"), + ("page-layout-footer", "page-layout-footer"), + ("page-layout-header", "page-layout-header"), + ("page-layout-header-footer", "page-layout-header-footer"), + ("page-layout-sidebar-left", "page-layout-sidebar-left"), + ("page-layout-sidebar-right", "page-layout-sidebar-right"), + ("page-next", "page-next"), + ("page-next-outline", "page-next-outline"), + ("page-previous", "page-previous"), + ("page-previous-outline", "page-previous-outline"), + ("pail", "pail"), + ("pail-minus", "pail-minus"), + ("pail-minus-outline", "pail-minus-outline"), + ("pail-off", "pail-off"), + ("pail-off-outline", "pail-off-outline"), + ("pail-outline", "pail-outline"), + ("pail-plus", "pail-plus"), + ("pail-plus-outline", "pail-plus-outline"), + ("pail-remove", "pail-remove"), + ("pail-remove-outline", "pail-remove-outline"), + ("palette", "palette"), + ("palette-advanced", "palette-advanced"), + ("palette-outline", "palette-outline"), + ("palette-swatch", "palette-swatch"), + ("palette-swatch-outline", "palette-swatch-outline"), + ("palette-swatch-variant", "palette-swatch-variant"), + ("palm-tree", "palm-tree"), + ("pan", "pan"), + ("pan-bottom-left", "pan-bottom-left"), + ("pan-bottom-right", "pan-bottom-right"), + ("pan-down", "pan-down"), + ("pan-horizontal", "pan-horizontal"), + ("pan-left", "pan-left"), + ("pan-right", "pan-right"), + ("pan-top-left", "pan-top-left"), + ("pan-top-right", "pan-top-right"), + ("pan-up", "pan-up"), + ("pan-vertical", "pan-vertical"), + ("panda", "panda"), + ("pandora", "pandora"), + ("panorama", "panorama"), + ("panorama-fisheye", "panorama-fisheye"), + ("panorama-horizontal", "panorama-horizontal"), + ("panorama-horizontal-outline", "panorama-horizontal-outline"), + ("panorama-outline", "panorama-outline"), + ("panorama-sphere", "panorama-sphere"), + ("panorama-sphere-outline", "panorama-sphere-outline"), + ("panorama-variant", "panorama-variant"), + ("panorama-variant-outline", "panorama-variant-outline"), + ("panorama-vertical", "panorama-vertical"), + ("panorama-vertical-outline", "panorama-vertical-outline"), + ("panorama-wide-angle", "panorama-wide-angle"), + ("panorama-wide-angle-outline", "panorama-wide-angle-outline"), + ("paper-cut-vertical", "paper-cut-vertical"), + ("paper-roll", "paper-roll"), + ("paper-roll-outline", "paper-roll-outline"), + ("paperclip", "paperclip"), + ("paperclip-check", "paperclip-check"), + ("paperclip-lock", "paperclip-lock"), + ("paperclip-minus", "paperclip-minus"), + ("paperclip-off", "paperclip-off"), + ("paperclip-plus", "paperclip-plus"), + ("paperclip-remove", "paperclip-remove"), + ("parachute", "parachute"), + ("parachute-outline", "parachute-outline"), + ("paragliding", "paragliding"), + ("parking", "parking"), + ("party-popper", "party-popper"), + ("passport", "passport"), + ("passport-biometric", "passport-biometric"), + ("pasta", "pasta"), + ("patio-heater", "patio-heater"), + ("patreon", "patreon"), + ("pause", "pause"), + ("pause-box", "pause-box"), + ("pause-box-outline", "pause-box-outline"), + ("pause-circle", "pause-circle"), + ("pause-circle-outline", "pause-circle-outline"), + ("pause-octagon", "pause-octagon"), + ("pause-octagon-outline", "pause-octagon-outline"), + ("paw", "paw"), + ("paw-off", "paw-off"), + ("paw-off-outline", "paw-off-outline"), + ("paw-outline", "paw-outline"), + ("paypal", "paypal"), + ("peace", "peace"), + ("peanut", "peanut"), + ("peanut-off", "peanut-off"), + ("peanut-off-outline", "peanut-off-outline"), + ("peanut-outline", "peanut-outline"), + ("pen", "pen"), + ("pen-lock", "pen-lock"), + ("pen-minus", "pen-minus"), + ("pen-off", "pen-off"), + ("pen-plus", "pen-plus"), + ("pen-remove", "pen-remove"), + ("pencil", "pencil"), + ("pencil-box", "pencil-box"), + ("pencil-box-multiple", "pencil-box-multiple"), + ("pencil-box-multiple-outline", "pencil-box-multiple-outline"), + ("pencil-box-outline", "pencil-box-outline"), + ("pencil-circle", "pencil-circle"), + ("pencil-circle-outline", "pencil-circle-outline"), + ("pencil-lock", "pencil-lock"), + ("pencil-lock-outline", "pencil-lock-outline"), + ("pencil-minus", "pencil-minus"), + ("pencil-minus-outline", "pencil-minus-outline"), + ("pencil-off", "pencil-off"), + ("pencil-off-outline", "pencil-off-outline"), + ("pencil-outline", "pencil-outline"), + ("pencil-plus", "pencil-plus"), + ("pencil-plus-outline", "pencil-plus-outline"), + ("pencil-remove", "pencil-remove"), + ("pencil-remove-outline", "pencil-remove-outline"), + ("pencil-ruler", "pencil-ruler"), + ("pencil-ruler-outline", "pencil-ruler-outline"), + ("penguin", "penguin"), + ("pentagon", "pentagon"), + ("pentagon-outline", "pentagon-outline"), + ("pentagram", "pentagram"), + ("percent", "percent"), + ("percent-box", "percent-box"), + ("percent-box-outline", "percent-box-outline"), + ("percent-circle", "percent-circle"), + ("percent-circle-outline", "percent-circle-outline"), + ("percent-outline", "percent-outline"), + ("periodic-table", "periodic-table"), + ("periscope", "periscope"), + ("perspective-less", "perspective-less"), + ("perspective-more", "perspective-more"), + ("ph", "ph"), + ("phone", "phone"), + ("phone-alert", "phone-alert"), + ("phone-alert-outline", "phone-alert-outline"), + ("phone-bluetooth", "phone-bluetooth"), + ("phone-bluetooth-outline", "phone-bluetooth-outline"), + ("phone-cancel", "phone-cancel"), + ("phone-cancel-outline", "phone-cancel-outline"), + ("phone-check", "phone-check"), + ("phone-check-outline", "phone-check-outline"), + ("phone-classic", "phone-classic"), + ("phone-classic-off", "phone-classic-off"), + ("phone-clock", "phone-clock"), + ("phone-dial", "phone-dial"), + ("phone-dial-outline", "phone-dial-outline"), + ("phone-forward", "phone-forward"), + ("phone-forward-outline", "phone-forward-outline"), + ("phone-hangup", "phone-hangup"), + ("phone-hangup-outline", "phone-hangup-outline"), + ("phone-in-talk", "phone-in-talk"), + ("phone-in-talk-outline", "phone-in-talk-outline"), + ("phone-incoming", "phone-incoming"), + ("phone-incoming-outgoing", "phone-incoming-outgoing"), + ("phone-incoming-outgoing-outline", "phone-incoming-outgoing-outline"), + ("phone-incoming-outline", "phone-incoming-outline"), + ("phone-lock", "phone-lock"), + ("phone-lock-outline", "phone-lock-outline"), + ("phone-log", "phone-log"), + ("phone-log-outline", "phone-log-outline"), + ("phone-message", "phone-message"), + ("phone-message-outline", "phone-message-outline"), + ("phone-minus", "phone-minus"), + ("phone-minus-outline", "phone-minus-outline"), + ("phone-missed", "phone-missed"), + ("phone-missed-outline", "phone-missed-outline"), + ("phone-off", "phone-off"), + ("phone-off-outline", "phone-off-outline"), + ("phone-outgoing", "phone-outgoing"), + ("phone-outgoing-outline", "phone-outgoing-outline"), + ("phone-outline", "phone-outline"), + ("phone-paused", "phone-paused"), + ("phone-paused-outline", "phone-paused-outline"), + ("phone-plus", "phone-plus"), + ("phone-plus-outline", "phone-plus-outline"), + ("phone-refresh", "phone-refresh"), + ("phone-refresh-outline", "phone-refresh-outline"), + ("phone-remove", "phone-remove"), + ("phone-remove-outline", "phone-remove-outline"), + ("phone-return", "phone-return"), + ("phone-return-outline", "phone-return-outline"), + ("phone-ring", "phone-ring"), + ("phone-ring-outline", "phone-ring-outline"), + ("phone-rotate-landscape", "phone-rotate-landscape"), + ("phone-rotate-portrait", "phone-rotate-portrait"), + ("phone-settings", "phone-settings"), + ("phone-settings-outline", "phone-settings-outline"), + ("phone-sync", "phone-sync"), + ("phone-sync-outline", "phone-sync-outline"), + ("phone-voip", "phone-voip"), + ("pi", "pi"), + ("pi-box", "pi-box"), + ("pi-hole", "pi-hole"), + ("piano", "piano"), + ("piano-off", "piano-off"), + ("pickaxe", "pickaxe"), + ("picture-in-picture-bottom-right", "picture-in-picture-bottom-right"), + ( + "picture-in-picture-bottom-right-outline", + "picture-in-picture-bottom-right-outline", + ), + ("picture-in-picture-top-right", "picture-in-picture-top-right"), + ( + "picture-in-picture-top-right-outline", + "picture-in-picture-top-right-outline", + ), + ("pier", "pier"), + ("pier-crane", "pier-crane"), + ("pig", "pig"), + ("pig-variant", "pig-variant"), + ("pig-variant-outline", "pig-variant-outline"), + ("piggy-bank", "piggy-bank"), + ("piggy-bank-outline", "piggy-bank-outline"), + ("pill", "pill"), + ("pill-multiple", "pill-multiple"), + ("pill-off", "pill-off"), + ("pillar", "pillar"), + ("pin", "pin"), + ("pin-off", "pin-off"), + ("pin-off-outline", "pin-off-outline"), + ("pin-outline", "pin-outline"), + ("pine-tree", "pine-tree"), + ("pine-tree-box", "pine-tree-box"), + ("pine-tree-fire", "pine-tree-fire"), + ("pinterest", "pinterest"), + ("pinterest-box", "pinterest-box"), + ("pinwheel", "pinwheel"), + ("pinwheel-outline", "pinwheel-outline"), + ("pipe", "pipe"), + ("pipe-disconnected", "pipe-disconnected"), + ("pipe-leak", "pipe-leak"), + ("pipe-valve", "pipe-valve"), + ("pipe-wrench", "pipe-wrench"), + ("pirate", "pirate"), + ("pistol", "pistol"), + ("piston", "piston"), + ("pitchfork", "pitchfork"), + ("pizza", "pizza"), + ("plane-car", "plane-car"), + ("plane-train", "plane-train"), + ("play", "play"), + ("play-box", "play-box"), + ("play-box-lock", "play-box-lock"), + ("play-box-lock-open", "play-box-lock-open"), + ("play-box-lock-open-outline", "play-box-lock-open-outline"), + ("play-box-lock-outline", "play-box-lock-outline"), + ("play-box-multiple", "play-box-multiple"), + ("play-box-multiple-outline", "play-box-multiple-outline"), + ("play-box-outline", "play-box-outline"), + ("play-circle", "play-circle"), + ("play-circle-outline", "play-circle-outline"), + ("play-network", "play-network"), + ("play-network-outline", "play-network-outline"), + ("play-outline", "play-outline"), + ("play-pause", "play-pause"), + ("play-protected-content", "play-protected-content"), + ("play-speed", "play-speed"), + ("playlist-check", "playlist-check"), + ("playlist-edit", "playlist-edit"), + ("playlist-minus", "playlist-minus"), + ("playlist-music", "playlist-music"), + ("playlist-music-outline", "playlist-music-outline"), + ("playlist-play", "playlist-play"), + ("playlist-plus", "playlist-plus"), + ("playlist-remove", "playlist-remove"), + ("playlist-star", "playlist-star"), + ("plex", "plex"), + ("pliers", "pliers"), + ("plus", "plus"), + ("plus-box", "plus-box"), + ("plus-box-multiple", "plus-box-multiple"), + ("plus-box-multiple-outline", "plus-box-multiple-outline"), + ("plus-box-outline", "plus-box-outline"), + ("plus-circle", "plus-circle"), + ("plus-circle-multiple", "plus-circle-multiple"), + ("plus-circle-multiple-outline", "plus-circle-multiple-outline"), + ("plus-circle-outline", "plus-circle-outline"), + ("plus-lock", "plus-lock"), + ("plus-lock-open", "plus-lock-open"), + ("plus-minus", "plus-minus"), + ("plus-minus-box", "plus-minus-box"), + ("plus-minus-variant", "plus-minus-variant"), + ("plus-network", "plus-network"), + ("plus-network-outline", "plus-network-outline"), + ("plus-outline", "plus-outline"), + ("plus-thick", "plus-thick"), + ("pocket", "pocket"), + ("podcast", "podcast"), + ("podium", "podium"), + ("podium-bronze", "podium-bronze"), + ("podium-gold", "podium-gold"), + ("podium-silver", "podium-silver"), + ("point-of-sale", "point-of-sale"), + ("pokeball", "pokeball"), + ("pokemon-go", "pokemon-go"), + ("poker-chip", "poker-chip"), + ("polaroid", "polaroid"), + ("police-badge", "police-badge"), + ("police-badge-outline", "police-badge-outline"), + ("police-station", "police-station"), + ("poll", "poll"), + ("polo", "polo"), + ("polymer", "polymer"), + ("pool", "pool"), + ("pool-thermometer", "pool-thermometer"), + ("popcorn", "popcorn"), + ("post", "post"), + ("post-lamp", "post-lamp"), + ("post-outline", "post-outline"), + ("postage-stamp", "postage-stamp"), + ("pot", "pot"), + ("pot-mix", "pot-mix"), + ("pot-mix-outline", "pot-mix-outline"), + ("pot-outline", "pot-outline"), + ("pot-steam", "pot-steam"), + ("pot-steam-outline", "pot-steam-outline"), + ("pound", "pound"), + ("pound-box", "pound-box"), + ("pound-box-outline", "pound-box-outline"), + ("power", "power"), + ("power-cycle", "power-cycle"), + ("power-off", "power-off"), + ("power-on", "power-on"), + ("power-plug", "power-plug"), + ("power-plug-off", "power-plug-off"), + ("power-plug-off-outline", "power-plug-off-outline"), + ("power-plug-outline", "power-plug-outline"), + ("power-settings", "power-settings"), + ("power-sleep", "power-sleep"), + ("power-socket", "power-socket"), + ("power-socket-au", "power-socket-au"), + ("power-socket-ch", "power-socket-ch"), + ("power-socket-de", "power-socket-de"), + ("power-socket-eu", "power-socket-eu"), + ("power-socket-fr", "power-socket-fr"), + ("power-socket-it", "power-socket-it"), + ("power-socket-jp", "power-socket-jp"), + ("power-socket-uk", "power-socket-uk"), + ("power-socket-us", "power-socket-us"), + ("power-standby", "power-standby"), + ("powershell", "powershell"), + ("prescription", "prescription"), + ("presentation", "presentation"), + ("presentation-play", "presentation-play"), + ("pretzel", "pretzel"), + ("prezi", "prezi"), + ("printer", "printer"), + ("printer-3d", "printer-3d"), + ("printer-3d-nozzle", "printer-3d-nozzle"), + ("printer-3d-nozzle-alert", "printer-3d-nozzle-alert"), + ("printer-3d-nozzle-alert-outline", "printer-3d-nozzle-alert-outline"), + ("printer-3d-nozzle-heat", "printer-3d-nozzle-heat"), + ("printer-3d-nozzle-heat-outline", "printer-3d-nozzle-heat-outline"), + ("printer-3d-nozzle-off", "printer-3d-nozzle-off"), + ("printer-3d-nozzle-off-outline", "printer-3d-nozzle-off-outline"), + ("printer-3d-nozzle-outline", "printer-3d-nozzle-outline"), + ("printer-3d-off", "printer-3d-off"), + ("printer-alert", "printer-alert"), + ("printer-check", "printer-check"), + ("printer-eye", "printer-eye"), + ("printer-off", "printer-off"), + ("printer-off-outline", "printer-off-outline"), + ("printer-outline", "printer-outline"), + ("printer-pos", "printer-pos"), + ("printer-pos-alert", "printer-pos-alert"), + ("printer-pos-alert-outline", "printer-pos-alert-outline"), + ("printer-pos-cancel", "printer-pos-cancel"), + ("printer-pos-cancel-outline", "printer-pos-cancel-outline"), + ("printer-pos-check", "printer-pos-check"), + ("printer-pos-check-outline", "printer-pos-check-outline"), + ("printer-pos-cog", "printer-pos-cog"), + ("printer-pos-cog-outline", "printer-pos-cog-outline"), + ("printer-pos-edit", "printer-pos-edit"), + ("printer-pos-edit-outline", "printer-pos-edit-outline"), + ("printer-pos-minus", "printer-pos-minus"), + ("printer-pos-minus-outline", "printer-pos-minus-outline"), + ("printer-pos-network", "printer-pos-network"), + ("printer-pos-network-outline", "printer-pos-network-outline"), + ("printer-pos-off", "printer-pos-off"), + ("printer-pos-off-outline", "printer-pos-off-outline"), + ("printer-pos-outline", "printer-pos-outline"), + ("printer-pos-pause", "printer-pos-pause"), + ("printer-pos-pause-outline", "printer-pos-pause-outline"), + ("printer-pos-play", "printer-pos-play"), + ("printer-pos-play-outline", "printer-pos-play-outline"), + ("printer-pos-plus", "printer-pos-plus"), + ("printer-pos-plus-outline", "printer-pos-plus-outline"), + ("printer-pos-refresh", "printer-pos-refresh"), + ("printer-pos-refresh-outline", "printer-pos-refresh-outline"), + ("printer-pos-remove", "printer-pos-remove"), + ("printer-pos-remove-outline", "printer-pos-remove-outline"), + ("printer-pos-star", "printer-pos-star"), + ("printer-pos-star-outline", "printer-pos-star-outline"), + ("printer-pos-stop", "printer-pos-stop"), + ("printer-pos-stop-outline", "printer-pos-stop-outline"), + ("printer-pos-sync", "printer-pos-sync"), + ("printer-pos-sync-outline", "printer-pos-sync-outline"), + ("printer-pos-wrench", "printer-pos-wrench"), + ("printer-pos-wrench-outline", "printer-pos-wrench-outline"), + ("printer-search", "printer-search"), + ("printer-settings", "printer-settings"), + ("printer-wireless", "printer-wireless"), + ("priority-high", "priority-high"), + ("priority-low", "priority-low"), + ("professional-hexagon", "professional-hexagon"), + ("progress-alert", "progress-alert"), + ("progress-check", "progress-check"), + ("progress-clock", "progress-clock"), + ("progress-close", "progress-close"), + ("progress-download", "progress-download"), + ("progress-helper", "progress-helper"), + ("progress-pencil", "progress-pencil"), + ("progress-question", "progress-question"), + ("progress-star", "progress-star"), + ("progress-upload", "progress-upload"), + ("progress-wrench", "progress-wrench"), + ("projector", "projector"), + ("projector-off", "projector-off"), + ("projector-screen", "projector-screen"), + ("projector-screen-off", "projector-screen-off"), + ("projector-screen-off-outline", "projector-screen-off-outline"), + ("projector-screen-outline", "projector-screen-outline"), + ("projector-screen-variant", "projector-screen-variant"), + ("projector-screen-variant-off", "projector-screen-variant-off"), + ( + "projector-screen-variant-off-outline", + "projector-screen-variant-off-outline", + ), + ("projector-screen-variant-outline", "projector-screen-variant-outline"), + ("propane-tank", "propane-tank"), + ("propane-tank-outline", "propane-tank-outline"), + ("protocol", "protocol"), + ("publish", "publish"), + ("publish-off", "publish-off"), + ("pulse", "pulse"), + ("pump", "pump"), + ("pump-off", "pump-off"), + ("pumpkin", "pumpkin"), + ("purse", "purse"), + ("purse-outline", "purse-outline"), + ("puzzle", "puzzle"), + ("puzzle-check", "puzzle-check"), + ("puzzle-check-outline", "puzzle-check-outline"), + ("puzzle-edit", "puzzle-edit"), + ("puzzle-edit-outline", "puzzle-edit-outline"), + ("puzzle-heart", "puzzle-heart"), + ("puzzle-heart-outline", "puzzle-heart-outline"), + ("puzzle-minus", "puzzle-minus"), + ("puzzle-minus-outline", "puzzle-minus-outline"), + ("puzzle-outline", "puzzle-outline"), + ("puzzle-plus", "puzzle-plus"), + ("puzzle-plus-outline", "puzzle-plus-outline"), + ("puzzle-remove", "puzzle-remove"), + ("puzzle-remove-outline", "puzzle-remove-outline"), + ("puzzle-star", "puzzle-star"), + ("puzzle-star-outline", "puzzle-star-outline"), + ("pyramid", "pyramid"), + ("pyramid-off", "pyramid-off"), + ("qi", "qi"), + ("qqchat", "qqchat"), + ("qrcode", "qrcode"), + ("qrcode-edit", "qrcode-edit"), + ("qrcode-minus", "qrcode-minus"), + ("qrcode-plus", "qrcode-plus"), + ("qrcode-remove", "qrcode-remove"), + ("qrcode-scan", "qrcode-scan"), + ("quadcopter", "quadcopter"), + ("quality-high", "quality-high"), + ("quality-low", "quality-low"), + ("quality-medium", "quality-medium"), + ("quick-reply", "quick-reply"), + ("quicktime", "quicktime"), + ("quora", "quora"), + ("rabbit", "rabbit"), + ("rabbit-variant", "rabbit-variant"), + ("rabbit-variant-outline", "rabbit-variant-outline"), + ("racing-helmet", "racing-helmet"), + ("racquetball", "racquetball"), + ("radar", "radar"), + ("radiator", "radiator"), + ("radiator-disabled", "radiator-disabled"), + ("radiator-off", "radiator-off"), + ("radio", "radio"), + ("radio-am", "radio-am"), + ("radio-fm", "radio-fm"), + ("radio-handheld", "radio-handheld"), + ("radio-off", "radio-off"), + ("radio-tower", "radio-tower"), + ("radioactive", "radioactive"), + ("radioactive-circle", "radioactive-circle"), + ("radioactive-circle-outline", "radioactive-circle-outline"), + ("radioactive-off", "radioactive-off"), + ("radiobox-blank", "radiobox-blank"), + ("radiobox-marked", "radiobox-marked"), + ("radiology-box", "radiology-box"), + ("radiology-box-outline", "radiology-box-outline"), + ("radius", "radius"), + ("radius-outline", "radius-outline"), + ("railroad-light", "railroad-light"), + ("rake", "rake"), + ("raspberry-pi", "raspberry-pi"), + ("raw", "raw"), + ("raw-off", "raw-off"), + ("ray-end", "ray-end"), + ("ray-end-arrow", "ray-end-arrow"), + ("ray-start", "ray-start"), + ("ray-start-arrow", "ray-start-arrow"), + ("ray-start-end", "ray-start-end"), + ("ray-start-vertex-end", "ray-start-vertex-end"), + ("ray-vertex", "ray-vertex"), + ("razor-double-edge", "razor-double-edge"), + ("razor-single-edge", "razor-single-edge"), + ("rdio", "rdio"), + ("react", "react"), + ("read", "read"), + ("receipt", "receipt"), + ("receipt-outline", "receipt-outline"), + ("receipt-text", "receipt-text"), + ("receipt-text-check", "receipt-text-check"), + ("receipt-text-check-outline", "receipt-text-check-outline"), + ("receipt-text-minus", "receipt-text-minus"), + ("receipt-text-minus-outline", "receipt-text-minus-outline"), + ("receipt-text-outline", "receipt-text-outline"), + ("receipt-text-plus", "receipt-text-plus"), + ("receipt-text-plus-outline", "receipt-text-plus-outline"), + ("receipt-text-remove", "receipt-text-remove"), + ("receipt-text-remove-outline", "receipt-text-remove-outline"), + ("record", "record"), + ("record-circle", "record-circle"), + ("record-circle-outline", "record-circle-outline"), + ("record-player", "record-player"), + ("record-rec", "record-rec"), + ("rectangle", "rectangle"), + ("rectangle-outline", "rectangle-outline"), + ("recycle", "recycle"), + ("recycle-variant", "recycle-variant"), + ("reddit", "reddit"), + ("redhat", "redhat"), + ("redo", "redo"), + ("redo-variant", "redo-variant"), + ("reflect-horizontal", "reflect-horizontal"), + ("reflect-vertical", "reflect-vertical"), + ("refresh", "refresh"), + ("refresh-auto", "refresh-auto"), + ("refresh-circle", "refresh-circle"), + ("regex", "regex"), + ("registered-trademark", "registered-trademark"), + ("reiterate", "reiterate"), + ("relation-many-to-many", "relation-many-to-many"), + ("relation-many-to-one", "relation-many-to-one"), + ("relation-many-to-one-or-many", "relation-many-to-one-or-many"), + ("relation-many-to-only-one", "relation-many-to-only-one"), + ("relation-many-to-zero-or-many", "relation-many-to-zero-or-many"), + ("relation-many-to-zero-or-one", "relation-many-to-zero-or-one"), + ("relation-one-or-many-to-many", "relation-one-or-many-to-many"), + ("relation-one-or-many-to-one", "relation-one-or-many-to-one"), + ("relation-one-or-many-to-one-or-many", "relation-one-or-many-to-one-or-many"), + ("relation-one-or-many-to-only-one", "relation-one-or-many-to-only-one"), + ( + "relation-one-or-many-to-zero-or-many", + "relation-one-or-many-to-zero-or-many", + ), + ("relation-one-or-many-to-zero-or-one", "relation-one-or-many-to-zero-or-one"), + ("relation-one-to-many", "relation-one-to-many"), + ("relation-one-to-one", "relation-one-to-one"), + ("relation-one-to-one-or-many", "relation-one-to-one-or-many"), + ("relation-one-to-only-one", "relation-one-to-only-one"), + ("relation-one-to-zero-or-many", "relation-one-to-zero-or-many"), + ("relation-one-to-zero-or-one", "relation-one-to-zero-or-one"), + ("relation-only-one-to-many", "relation-only-one-to-many"), + ("relation-only-one-to-one", "relation-only-one-to-one"), + ("relation-only-one-to-one-or-many", "relation-only-one-to-one-or-many"), + ("relation-only-one-to-only-one", "relation-only-one-to-only-one"), + ("relation-only-one-to-zero-or-many", "relation-only-one-to-zero-or-many"), + ("relation-only-one-to-zero-or-one", "relation-only-one-to-zero-or-one"), + ("relation-zero-or-many-to-many", "relation-zero-or-many-to-many"), + ("relation-zero-or-many-to-one", "relation-zero-or-many-to-one"), + ( + "relation-zero-or-many-to-one-or-many", + "relation-zero-or-many-to-one-or-many", + ), + ("relation-zero-or-many-to-only-one", "relation-zero-or-many-to-only-one"), + ( + "relation-zero-or-many-to-zero-or-many", + "relation-zero-or-many-to-zero-or-many", + ), + ( + "relation-zero-or-many-to-zero-or-one", + "relation-zero-or-many-to-zero-or-one", + ), + ("relation-zero-or-one-to-many", "relation-zero-or-one-to-many"), + ("relation-zero-or-one-to-one", "relation-zero-or-one-to-one"), + ("relation-zero-or-one-to-one-or-many", "relation-zero-or-one-to-one-or-many"), + ("relation-zero-or-one-to-only-one", "relation-zero-or-one-to-only-one"), + ( + "relation-zero-or-one-to-zero-or-many", + "relation-zero-or-one-to-zero-or-many", + ), + ("relation-zero-or-one-to-zero-or-one", "relation-zero-or-one-to-zero-or-one"), + ("relative-scale", "relative-scale"), + ("reload", "reload"), + ("reload-alert", "reload-alert"), + ("reminder", "reminder"), + ("remote", "remote"), + ("remote-desktop", "remote-desktop"), + ("remote-off", "remote-off"), + ("remote-tv", "remote-tv"), + ("remote-tv-off", "remote-tv-off"), + ("rename", "rename"), + ("rename-box", "rename-box"), + ("rename-box-outline", "rename-box-outline"), + ("rename-outline", "rename-outline"), + ("reorder-horizontal", "reorder-horizontal"), + ("reorder-vertical", "reorder-vertical"), + ("repeat", "repeat"), + ("repeat-off", "repeat-off"), + ("repeat-once", "repeat-once"), + ("repeat-variant", "repeat-variant"), + ("replay", "replay"), + ("reply", "reply"), + ("reply-all", "reply-all"), + ("reply-all-outline", "reply-all-outline"), + ("reply-circle", "reply-circle"), + ("reply-outline", "reply-outline"), + ("reproduction", "reproduction"), + ("resistor", "resistor"), + ("resistor-nodes", "resistor-nodes"), + ("resize", "resize"), + ("resize-bottom-right", "resize-bottom-right"), + ("responsive", "responsive"), + ("restart", "restart"), + ("restart-alert", "restart-alert"), + ("restart-off", "restart-off"), + ("restore", "restore"), + ("restore-alert", "restore-alert"), + ("rewind", "rewind"), + ("rewind-10", "rewind-10"), + ("rewind-15", "rewind-15"), + ("rewind-30", "rewind-30"), + ("rewind-45", "rewind-45"), + ("rewind-5", "rewind-5"), + ("rewind-60", "rewind-60"), + ("rewind-outline", "rewind-outline"), + ("rhombus", "rhombus"), + ("rhombus-medium", "rhombus-medium"), + ("rhombus-medium-outline", "rhombus-medium-outline"), + ("rhombus-outline", "rhombus-outline"), + ("rhombus-split", "rhombus-split"), + ("rhombus-split-outline", "rhombus-split-outline"), + ("ribbon", "ribbon"), + ("rice", "rice"), + ("rickshaw", "rickshaw"), + ("rickshaw-electric", "rickshaw-electric"), + ("ring", "ring"), + ("rivet", "rivet"), + ("road", "road"), + ("road-variant", "road-variant"), + ("robber", "robber"), + ("robot", "robot"), + ("robot-angry", "robot-angry"), + ("robot-angry-outline", "robot-angry-outline"), + ("robot-confused", "robot-confused"), + ("robot-confused-outline", "robot-confused-outline"), + ("robot-dead", "robot-dead"), + ("robot-dead-outline", "robot-dead-outline"), + ("robot-excited", "robot-excited"), + ("robot-excited-outline", "robot-excited-outline"), + ("robot-happy", "robot-happy"), + ("robot-happy-outline", "robot-happy-outline"), + ("robot-industrial", "robot-industrial"), + ("robot-industrial-outline", "robot-industrial-outline"), + ("robot-love", "robot-love"), + ("robot-love-outline", "robot-love-outline"), + ("robot-mower", "robot-mower"), + ("robot-mower-outline", "robot-mower-outline"), + ("robot-off", "robot-off"), + ("robot-off-outline", "robot-off-outline"), + ("robot-outline", "robot-outline"), + ("robot-vacuum", "robot-vacuum"), + ("robot-vacuum-alert", "robot-vacuum-alert"), + ("robot-vacuum-off", "robot-vacuum-off"), + ("robot-vacuum-variant", "robot-vacuum-variant"), + ("robot-vacuum-variant-alert", "robot-vacuum-variant-alert"), + ("robot-vacuum-variant-off", "robot-vacuum-variant-off"), + ("rocket", "rocket"), + ("rocket-launch", "rocket-launch"), + ("rocket-launch-outline", "rocket-launch-outline"), + ("rocket-outline", "rocket-outline"), + ("rodent", "rodent"), + ("roller-shade", "roller-shade"), + ("roller-shade-closed", "roller-shade-closed"), + ("roller-skate", "roller-skate"), + ("roller-skate-off", "roller-skate-off"), + ("rollerblade", "rollerblade"), + ("rollerblade-off", "rollerblade-off"), + ("rollupjs", "rollupjs"), + ("rolodex", "rolodex"), + ("rolodex-outline", "rolodex-outline"), + ("roman-numeral-1", "roman-numeral-1"), + ("roman-numeral-10", "roman-numeral-10"), + ("roman-numeral-2", "roman-numeral-2"), + ("roman-numeral-3", "roman-numeral-3"), + ("roman-numeral-4", "roman-numeral-4"), + ("roman-numeral-5", "roman-numeral-5"), + ("roman-numeral-6", "roman-numeral-6"), + ("roman-numeral-7", "roman-numeral-7"), + ("roman-numeral-8", "roman-numeral-8"), + ("roman-numeral-9", "roman-numeral-9"), + ("room-service", "room-service"), + ("room-service-outline", "room-service-outline"), + ("rotate-360", "rotate-360"), + ("rotate-3d", "rotate-3d"), + ("rotate-3d-variant", "rotate-3d-variant"), + ("rotate-left", "rotate-left"), + ("rotate-left-variant", "rotate-left-variant"), + ("rotate-orbit", "rotate-orbit"), + ("rotate-right", "rotate-right"), + ("rotate-right-variant", "rotate-right-variant"), + ("rounded-corner", "rounded-corner"), + ("router", "router"), + ("router-network", "router-network"), + ("router-wireless", "router-wireless"), + ("router-wireless-off", "router-wireless-off"), + ("router-wireless-settings", "router-wireless-settings"), + ("routes", "routes"), + ("routes-clock", "routes-clock"), + ("rowing", "rowing"), + ("rss", "rss"), + ("rss-box", "rss-box"), + ("rss-off", "rss-off"), + ("rug", "rug"), + ("rugby", "rugby"), + ("ruler", "ruler"), + ("ruler-square", "ruler-square"), + ("ruler-square-compass", "ruler-square-compass"), + ("run", "run"), + ("run-fast", "run-fast"), + ("rv-truck", "rv-truck"), + ("sack", "sack"), + ("sack-percent", "sack-percent"), + ("safe", "safe"), + ("safe-square", "safe-square"), + ("safe-square-outline", "safe-square-outline"), + ("safety-goggles", "safety-goggles"), + ("safety-googles", "safety-googles"), + ("sail-boat", "sail-boat"), + ("sail-boat-sink", "sail-boat-sink"), + ("sale", "sale"), + ("sale-outline", "sale-outline"), + ("salesforce", "salesforce"), + ("sass", "sass"), + ("satellite", "satellite"), + ("satellite-uplink", "satellite-uplink"), + ("satellite-variant", "satellite-variant"), + ("sausage", "sausage"), + ("sausage-off", "sausage-off"), + ("saw-blade", "saw-blade"), + ("sawtooth-wave", "sawtooth-wave"), + ("saxophone", "saxophone"), + ("scale", "scale"), + ("scale-balance", "scale-balance"), + ("scale-bathroom", "scale-bathroom"), + ("scale-off", "scale-off"), + ("scale-unbalanced", "scale-unbalanced"), + ("scan-helper", "scan-helper"), + ("scanner", "scanner"), + ("scanner-off", "scanner-off"), + ("scatter-plot", "scatter-plot"), + ("scatter-plot-outline", "scatter-plot-outline"), + ("scent", "scent"), + ("scent-off", "scent-off"), + ("school", "school"), + ("school-outline", "school-outline"), + ("scissors-cutting", "scissors-cutting"), + ("scooter", "scooter"), + ("scooter-electric", "scooter-electric"), + ("scoreboard", "scoreboard"), + ("scoreboard-outline", "scoreboard-outline"), + ("screen-rotation", "screen-rotation"), + ("screen-rotation-lock", "screen-rotation-lock"), + ("screw-flat-top", "screw-flat-top"), + ("screw-lag", "screw-lag"), + ("screw-machine-flat-top", "screw-machine-flat-top"), + ("screw-machine-round-top", "screw-machine-round-top"), + ("screw-round-top", "screw-round-top"), + ("screwdriver", "screwdriver"), + ("script", "script"), + ("script-outline", "script-outline"), + ("script-text", "script-text"), + ("script-text-key", "script-text-key"), + ("script-text-key-outline", "script-text-key-outline"), + ("script-text-outline", "script-text-outline"), + ("script-text-play", "script-text-play"), + ("script-text-play-outline", "script-text-play-outline"), + ("sd", "sd"), + ("seal", "seal"), + ("seal-variant", "seal-variant"), + ("search-web", "search-web"), + ("seat", "seat"), + ("seat-flat", "seat-flat"), + ("seat-flat-angled", "seat-flat-angled"), + ("seat-individual-suite", "seat-individual-suite"), + ("seat-legroom-extra", "seat-legroom-extra"), + ("seat-legroom-normal", "seat-legroom-normal"), + ("seat-legroom-reduced", "seat-legroom-reduced"), + ("seat-outline", "seat-outline"), + ("seat-passenger", "seat-passenger"), + ("seat-recline-extra", "seat-recline-extra"), + ("seat-recline-normal", "seat-recline-normal"), + ("seatbelt", "seatbelt"), + ("security", "security"), + ("security-close", "security-close"), + ("security-network", "security-network"), + ("seed", "seed"), + ("seed-off", "seed-off"), + ("seed-off-outline", "seed-off-outline"), + ("seed-outline", "seed-outline"), + ("seed-plus", "seed-plus"), + ("seed-plus-outline", "seed-plus-outline"), + ("seesaw", "seesaw"), + ("segment", "segment"), + ("select", "select"), + ("select-all", "select-all"), + ("select-arrow-down", "select-arrow-down"), + ("select-arrow-up", "select-arrow-up"), + ("select-color", "select-color"), + ("select-compare", "select-compare"), + ("select-drag", "select-drag"), + ("select-group", "select-group"), + ("select-inverse", "select-inverse"), + ("select-marker", "select-marker"), + ("select-multiple", "select-multiple"), + ("select-multiple-marker", "select-multiple-marker"), + ("select-off", "select-off"), + ("select-place", "select-place"), + ("select-remove", "select-remove"), + ("select-search", "select-search"), + ("selection", "selection"), + ("selection-drag", "selection-drag"), + ("selection-ellipse", "selection-ellipse"), + ("selection-ellipse-arrow-inside", "selection-ellipse-arrow-inside"), + ("selection-ellipse-remove", "selection-ellipse-remove"), + ("selection-lasso", "selection-lasso"), + ("selection-marker", "selection-marker"), + ("selection-multiple", "selection-multiple"), + ("selection-multiple-marker", "selection-multiple-marker"), + ("selection-off", "selection-off"), + ("selection-remove", "selection-remove"), + ("selection-search", "selection-search"), + ("semantic-web", "semantic-web"), + ("send", "send"), + ("send-check", "send-check"), + ("send-check-outline", "send-check-outline"), + ("send-circle", "send-circle"), + ("send-circle-outline", "send-circle-outline"), + ("send-clock", "send-clock"), + ("send-clock-outline", "send-clock-outline"), + ("send-lock", "send-lock"), + ("send-lock-outline", "send-lock-outline"), + ("send-outline", "send-outline"), + ("serial-port", "serial-port"), + ("server", "server"), + ("server-minus", "server-minus"), + ("server-network", "server-network"), + ("server-network-off", "server-network-off"), + ("server-off", "server-off"), + ("server-plus", "server-plus"), + ("server-remove", "server-remove"), + ("server-security", "server-security"), + ("set-all", "set-all"), + ("set-center", "set-center"), + ("set-center-right", "set-center-right"), + ("set-left", "set-left"), + ("set-left-center", "set-left-center"), + ("set-left-right", "set-left-right"), + ("set-merge", "set-merge"), + ("set-none", "set-none"), + ("set-right", "set-right"), + ("set-split", "set-split"), + ("set-square", "set-square"), + ("set-top-box", "set-top-box"), + ("settings-helper", "settings-helper"), + ("shaker", "shaker"), + ("shaker-outline", "shaker-outline"), + ("shape", "shape"), + ("shape-circle-plus", "shape-circle-plus"), + ("shape-outline", "shape-outline"), + ("shape-oval-plus", "shape-oval-plus"), + ("shape-plus", "shape-plus"), + ("shape-polygon-plus", "shape-polygon-plus"), + ("shape-rectangle-plus", "shape-rectangle-plus"), + ("shape-square-plus", "shape-square-plus"), + ("shape-square-rounded-plus", "shape-square-rounded-plus"), + ("share", "share"), + ("share-all", "share-all"), + ("share-all-outline", "share-all-outline"), + ("share-circle", "share-circle"), + ("share-off", "share-off"), + ("share-off-outline", "share-off-outline"), + ("share-outline", "share-outline"), + ("share-variant", "share-variant"), + ("share-variant-outline", "share-variant-outline"), + ("shark", "shark"), + ("shark-fin", "shark-fin"), + ("shark-fin-outline", "shark-fin-outline"), + ("shark-off", "shark-off"), + ("sheep", "sheep"), + ("shield", "shield"), + ("shield-account", "shield-account"), + ("shield-account-outline", "shield-account-outline"), + ("shield-account-variant", "shield-account-variant"), + ("shield-account-variant-outline", "shield-account-variant-outline"), + ("shield-airplane", "shield-airplane"), + ("shield-airplane-outline", "shield-airplane-outline"), + ("shield-alert", "shield-alert"), + ("shield-alert-outline", "shield-alert-outline"), + ("shield-bug", "shield-bug"), + ("shield-bug-outline", "shield-bug-outline"), + ("shield-car", "shield-car"), + ("shield-check", "shield-check"), + ("shield-check-outline", "shield-check-outline"), + ("shield-cross", "shield-cross"), + ("shield-cross-outline", "shield-cross-outline"), + ("shield-crown", "shield-crown"), + ("shield-crown-outline", "shield-crown-outline"), + ("shield-edit", "shield-edit"), + ("shield-edit-outline", "shield-edit-outline"), + ("shield-half", "shield-half"), + ("shield-half-full", "shield-half-full"), + ("shield-home", "shield-home"), + ("shield-home-outline", "shield-home-outline"), + ("shield-key", "shield-key"), + ("shield-key-outline", "shield-key-outline"), + ("shield-link-variant", "shield-link-variant"), + ("shield-link-variant-outline", "shield-link-variant-outline"), + ("shield-lock", "shield-lock"), + ("shield-lock-open", "shield-lock-open"), + ("shield-lock-open-outline", "shield-lock-open-outline"), + ("shield-lock-outline", "shield-lock-outline"), + ("shield-moon", "shield-moon"), + ("shield-moon-outline", "shield-moon-outline"), + ("shield-off", "shield-off"), + ("shield-off-outline", "shield-off-outline"), + ("shield-outline", "shield-outline"), + ("shield-plus", "shield-plus"), + ("shield-plus-outline", "shield-plus-outline"), + ("shield-refresh", "shield-refresh"), + ("shield-refresh-outline", "shield-refresh-outline"), + ("shield-remove", "shield-remove"), + ("shield-remove-outline", "shield-remove-outline"), + ("shield-search", "shield-search"), + ("shield-star", "shield-star"), + ("shield-star-outline", "shield-star-outline"), + ("shield-sun", "shield-sun"), + ("shield-sun-outline", "shield-sun-outline"), + ("shield-sword", "shield-sword"), + ("shield-sword-outline", "shield-sword-outline"), + ("shield-sync", "shield-sync"), + ("shield-sync-outline", "shield-sync-outline"), + ("shimmer", "shimmer"), + ("ship-wheel", "ship-wheel"), + ("shipping-pallet", "shipping-pallet"), + ("shoe-ballet", "shoe-ballet"), + ("shoe-cleat", "shoe-cleat"), + ("shoe-formal", "shoe-formal"), + ("shoe-heel", "shoe-heel"), + ("shoe-print", "shoe-print"), + ("shoe-sneaker", "shoe-sneaker"), + ("shopify", "shopify"), + ("shopping", "shopping"), + ("shopping-music", "shopping-music"), + ("shopping-outline", "shopping-outline"), + ("shopping-search", "shopping-search"), + ("shopping-search-outline", "shopping-search-outline"), + ("shore", "shore"), + ("shovel", "shovel"), + ("shovel-off", "shovel-off"), + ("shower", "shower"), + ("shower-head", "shower-head"), + ("shredder", "shredder"), + ("shuffle", "shuffle"), + ("shuffle-disabled", "shuffle-disabled"), + ("shuffle-variant", "shuffle-variant"), + ("shuriken", "shuriken"), + ("sickle", "sickle"), + ("sigma", "sigma"), + ("sigma-lower", "sigma-lower"), + ("sign-caution", "sign-caution"), + ("sign-direction", "sign-direction"), + ("sign-direction-minus", "sign-direction-minus"), + ("sign-direction-plus", "sign-direction-plus"), + ("sign-direction-remove", "sign-direction-remove"), + ("sign-language", "sign-language"), + ("sign-language-outline", "sign-language-outline"), + ("sign-pole", "sign-pole"), + ("sign-real-estate", "sign-real-estate"), + ("sign-text", "sign-text"), + ("sign-yield", "sign-yield"), + ("signal", "signal"), + ("signal-2g", "signal-2g"), + ("signal-3g", "signal-3g"), + ("signal-4g", "signal-4g"), + ("signal-5g", "signal-5g"), + ("signal-cellular-1", "signal-cellular-1"), + ("signal-cellular-2", "signal-cellular-2"), + ("signal-cellular-3", "signal-cellular-3"), + ("signal-cellular-outline", "signal-cellular-outline"), + ("signal-distance-variant", "signal-distance-variant"), + ("signal-hspa", "signal-hspa"), + ("signal-hspa-plus", "signal-hspa-plus"), + ("signal-off", "signal-off"), + ("signal-variant", "signal-variant"), + ("signature", "signature"), + ("signature-freehand", "signature-freehand"), + ("signature-image", "signature-image"), + ("signature-text", "signature-text"), + ("silo", "silo"), + ("silo-outline", "silo-outline"), + ("silverware", "silverware"), + ("silverware-clean", "silverware-clean"), + ("silverware-fork", "silverware-fork"), + ("silverware-fork-knife", "silverware-fork-knife"), + ("silverware-spoon", "silverware-spoon"), + ("silverware-variant", "silverware-variant"), + ("sim", "sim"), + ("sim-alert", "sim-alert"), + ("sim-alert-outline", "sim-alert-outline"), + ("sim-off", "sim-off"), + ("sim-off-outline", "sim-off-outline"), + ("sim-outline", "sim-outline"), + ("simple-icons", "simple-icons"), + ("sina-weibo", "sina-weibo"), + ("sine-wave", "sine-wave"), + ("sitemap", "sitemap"), + ("sitemap-outline", "sitemap-outline"), + ("size-l", "size-l"), + ("size-m", "size-m"), + ("size-s", "size-s"), + ("size-xl", "size-xl"), + ("size-xs", "size-xs"), + ("size-xxl", "size-xxl"), + ("size-xxs", "size-xxs"), + ("size-xxxl", "size-xxxl"), + ("skate", "skate"), + ("skate-off", "skate-off"), + ("skateboard", "skateboard"), + ("skateboarding", "skateboarding"), + ("skew-less", "skew-less"), + ("skew-more", "skew-more"), + ("ski", "ski"), + ("ski-cross-country", "ski-cross-country"), + ("ski-water", "ski-water"), + ("skip-backward", "skip-backward"), + ("skip-backward-outline", "skip-backward-outline"), + ("skip-forward", "skip-forward"), + ("skip-forward-outline", "skip-forward-outline"), + ("skip-next", "skip-next"), + ("skip-next-circle", "skip-next-circle"), + ("skip-next-circle-outline", "skip-next-circle-outline"), + ("skip-next-outline", "skip-next-outline"), + ("skip-previous", "skip-previous"), + ("skip-previous-circle", "skip-previous-circle"), + ("skip-previous-circle-outline", "skip-previous-circle-outline"), + ("skip-previous-outline", "skip-previous-outline"), + ("skull", "skull"), + ("skull-crossbones", "skull-crossbones"), + ("skull-crossbones-outline", "skull-crossbones-outline"), + ("skull-outline", "skull-outline"), + ("skull-scan", "skull-scan"), + ("skull-scan-outline", "skull-scan-outline"), + ("skype", "skype"), + ("skype-business", "skype-business"), + ("slack", "slack"), + ("slackware", "slackware"), + ("slash-forward", "slash-forward"), + ("slash-forward-box", "slash-forward-box"), + ("sledding", "sledding"), + ("sleep", "sleep"), + ("sleep-off", "sleep-off"), + ("slide", "slide"), + ("slope-downhill", "slope-downhill"), + ("slope-uphill", "slope-uphill"), + ("slot-machine", "slot-machine"), + ("slot-machine-outline", "slot-machine-outline"), + ("smart-card", "smart-card"), + ("smart-card-off", "smart-card-off"), + ("smart-card-off-outline", "smart-card-off-outline"), + ("smart-card-outline", "smart-card-outline"), + ("smart-card-reader", "smart-card-reader"), + ("smart-card-reader-outline", "smart-card-reader-outline"), + ("smog", "smog"), + ("smoke", "smoke"), + ("smoke-detector", "smoke-detector"), + ("smoke-detector-alert", "smoke-detector-alert"), + ("smoke-detector-alert-outline", "smoke-detector-alert-outline"), + ("smoke-detector-off", "smoke-detector-off"), + ("smoke-detector-off-outline", "smoke-detector-off-outline"), + ("smoke-detector-outline", "smoke-detector-outline"), + ("smoke-detector-variant", "smoke-detector-variant"), + ("smoke-detector-variant-alert", "smoke-detector-variant-alert"), + ("smoke-detector-variant-off", "smoke-detector-variant-off"), + ("smoking", "smoking"), + ("smoking-off", "smoking-off"), + ("smoking-pipe", "smoking-pipe"), + ("smoking-pipe-off", "smoking-pipe-off"), + ("snail", "snail"), + ("snake", "snake"), + ("snapchat", "snapchat"), + ("snowboard", "snowboard"), + ("snowflake", "snowflake"), + ("snowflake-alert", "snowflake-alert"), + ("snowflake-check", "snowflake-check"), + ("snowflake-melt", "snowflake-melt"), + ("snowflake-off", "snowflake-off"), + ("snowflake-thermometer", "snowflake-thermometer"), + ("snowflake-variant", "snowflake-variant"), + ("snowman", "snowman"), + ("snowmobile", "snowmobile"), + ("snowshoeing", "snowshoeing"), + ("soccer", "soccer"), + ("soccer-field", "soccer-field"), + ("social-distance-2-meters", "social-distance-2-meters"), + ("social-distance-6-feet", "social-distance-6-feet"), + ("sofa", "sofa"), + ("sofa-outline", "sofa-outline"), + ("sofa-single", "sofa-single"), + ("sofa-single-outline", "sofa-single-outline"), + ("solar-panel", "solar-panel"), + ("solar-panel-large", "solar-panel-large"), + ("solar-power", "solar-power"), + ("solar-power-variant", "solar-power-variant"), + ("solar-power-variant-outline", "solar-power-variant-outline"), + ("soldering-iron", "soldering-iron"), + ("solid", "solid"), + ("sony-playstation", "sony-playstation"), + ("sort", "sort"), + ("sort-alphabetical-ascending", "sort-alphabetical-ascending"), + ("sort-alphabetical-ascending-variant", "sort-alphabetical-ascending-variant"), + ("sort-alphabetical-descending", "sort-alphabetical-descending"), + ( + "sort-alphabetical-descending-variant", + "sort-alphabetical-descending-variant", + ), + ("sort-alphabetical-variant", "sort-alphabetical-variant"), + ("sort-ascending", "sort-ascending"), + ("sort-bool-ascending", "sort-bool-ascending"), + ("sort-bool-ascending-variant", "sort-bool-ascending-variant"), + ("sort-bool-descending", "sort-bool-descending"), + ("sort-bool-descending-variant", "sort-bool-descending-variant"), + ("sort-calendar-ascending", "sort-calendar-ascending"), + ("sort-calendar-descending", "sort-calendar-descending"), + ("sort-clock-ascending", "sort-clock-ascending"), + ("sort-clock-ascending-outline", "sort-clock-ascending-outline"), + ("sort-clock-descending", "sort-clock-descending"), + ("sort-clock-descending-outline", "sort-clock-descending-outline"), + ("sort-descending", "sort-descending"), + ("sort-numeric-ascending", "sort-numeric-ascending"), + ("sort-numeric-ascending-variant", "sort-numeric-ascending-variant"), + ("sort-numeric-descending", "sort-numeric-descending"), + ("sort-numeric-descending-variant", "sort-numeric-descending-variant"), + ("sort-numeric-variant", "sort-numeric-variant"), + ("sort-reverse-variant", "sort-reverse-variant"), + ("sort-variant", "sort-variant"), + ("sort-variant-lock", "sort-variant-lock"), + ("sort-variant-lock-open", "sort-variant-lock-open"), + ("sort-variant-off", "sort-variant-off"), + ("sort-variant-remove", "sort-variant-remove"), + ("soundbar", "soundbar"), + ("soundcloud", "soundcloud"), + ("source-branch", "source-branch"), + ("source-branch-check", "source-branch-check"), + ("source-branch-minus", "source-branch-minus"), + ("source-branch-plus", "source-branch-plus"), + ("source-branch-refresh", "source-branch-refresh"), + ("source-branch-remove", "source-branch-remove"), + ("source-branch-sync", "source-branch-sync"), + ("source-commit", "source-commit"), + ("source-commit-end", "source-commit-end"), + ("source-commit-end-local", "source-commit-end-local"), + ("source-commit-local", "source-commit-local"), + ("source-commit-next-local", "source-commit-next-local"), + ("source-commit-start", "source-commit-start"), + ("source-commit-start-next-local", "source-commit-start-next-local"), + ("source-fork", "source-fork"), + ("source-merge", "source-merge"), + ("source-pull", "source-pull"), + ("source-repository", "source-repository"), + ("source-repository-multiple", "source-repository-multiple"), + ("soy-sauce", "soy-sauce"), + ("soy-sauce-off", "soy-sauce-off"), + ("spa", "spa"), + ("spa-outline", "spa-outline"), + ("space-invaders", "space-invaders"), + ("space-station", "space-station"), + ("spade", "spade"), + ("speaker", "speaker"), + ("speaker-bluetooth", "speaker-bluetooth"), + ("speaker-message", "speaker-message"), + ("speaker-multiple", "speaker-multiple"), + ("speaker-off", "speaker-off"), + ("speaker-pause", "speaker-pause"), + ("speaker-play", "speaker-play"), + ("speaker-stop", "speaker-stop"), + ("speaker-wireless", "speaker-wireless"), + ("spear", "spear"), + ("speedometer", "speedometer"), + ("speedometer-medium", "speedometer-medium"), + ("speedometer-slow", "speedometer-slow"), + ("spellcheck", "spellcheck"), + ("sphere", "sphere"), + ("sphere-off", "sphere-off"), + ("spider", "spider"), + ("spider-thread", "spider-thread"), + ("spider-web", "spider-web"), + ("spirit-level", "spirit-level"), + ("split-horizontal", "split-horizontal"), + ("split-vertical", "split-vertical"), + ("spoon-sugar", "spoon-sugar"), + ("spotify", "spotify"), + ("spotlight", "spotlight"), + ("spotlight-beam", "spotlight-beam"), + ("spray", "spray"), + ("spray-bottle", "spray-bottle"), + ("spreadsheet", "spreadsheet"), + ("sprinkler", "sprinkler"), + ("sprinkler-fire", "sprinkler-fire"), + ("sprinkler-variant", "sprinkler-variant"), + ("sprout", "sprout"), + ("sprout-outline", "sprout-outline"), + ("square", "square"), + ("square-circle", "square-circle"), + ("square-edit-outline", "square-edit-outline"), + ("square-inc", "square-inc"), + ("square-inc-cash", "square-inc-cash"), + ("square-medium", "square-medium"), + ("square-medium-outline", "square-medium-outline"), + ("square-off", "square-off"), + ("square-off-outline", "square-off-outline"), + ("square-opacity", "square-opacity"), + ("square-outline", "square-outline"), + ("square-root", "square-root"), + ("square-root-box", "square-root-box"), + ("square-rounded", "square-rounded"), + ("square-rounded-badge", "square-rounded-badge"), + ("square-rounded-badge-outline", "square-rounded-badge-outline"), + ("square-rounded-outline", "square-rounded-outline"), + ("square-small", "square-small"), + ("square-wave", "square-wave"), + ("squeegee", "squeegee"), + ("ssh", "ssh"), + ("stack-exchange", "stack-exchange"), + ("stack-overflow", "stack-overflow"), + ("stackpath", "stackpath"), + ("stadium", "stadium"), + ("stadium-outline", "stadium-outline"), + ("stadium-variant", "stadium-variant"), + ("stairs", "stairs"), + ("stairs-box", "stairs-box"), + ("stairs-down", "stairs-down"), + ("stairs-up", "stairs-up"), + ("stamper", "stamper"), + ("standard-definition", "standard-definition"), + ("star", "star"), + ("star-box", "star-box"), + ("star-box-multiple", "star-box-multiple"), + ("star-box-multiple-outline", "star-box-multiple-outline"), + ("star-box-outline", "star-box-outline"), + ("star-check", "star-check"), + ("star-check-outline", "star-check-outline"), + ("star-circle", "star-circle"), + ("star-circle-outline", "star-circle-outline"), + ("star-cog", "star-cog"), + ("star-cog-outline", "star-cog-outline"), + ("star-crescent", "star-crescent"), + ("star-david", "star-david"), + ("star-face", "star-face"), + ("star-four-points", "star-four-points"), + ("star-four-points-outline", "star-four-points-outline"), + ("star-half", "star-half"), + ("star-half-full", "star-half-full"), + ("star-minus", "star-minus"), + ("star-minus-outline", "star-minus-outline"), + ("star-off", "star-off"), + ("star-off-outline", "star-off-outline"), + ("star-outline", "star-outline"), + ("star-plus", "star-plus"), + ("star-plus-outline", "star-plus-outline"), + ("star-remove", "star-remove"), + ("star-remove-outline", "star-remove-outline"), + ("star-settings", "star-settings"), + ("star-settings-outline", "star-settings-outline"), + ("star-shooting", "star-shooting"), + ("star-shooting-outline", "star-shooting-outline"), + ("star-three-points", "star-three-points"), + ("star-three-points-outline", "star-three-points-outline"), + ("state-machine", "state-machine"), + ("steam", "steam"), + ("steam-box", "steam-box"), + ("steering", "steering"), + ("steering-off", "steering-off"), + ("step-backward", "step-backward"), + ("step-backward-2", "step-backward-2"), + ("step-forward", "step-forward"), + ("step-forward-2", "step-forward-2"), + ("stethoscope", "stethoscope"), + ("sticker", "sticker"), + ("sticker-alert", "sticker-alert"), + ("sticker-alert-outline", "sticker-alert-outline"), + ("sticker-check", "sticker-check"), + ("sticker-check-outline", "sticker-check-outline"), + ("sticker-circle-outline", "sticker-circle-outline"), + ("sticker-emoji", "sticker-emoji"), + ("sticker-minus", "sticker-minus"), + ("sticker-minus-outline", "sticker-minus-outline"), + ("sticker-outline", "sticker-outline"), + ("sticker-plus", "sticker-plus"), + ("sticker-plus-outline", "sticker-plus-outline"), + ("sticker-remove", "sticker-remove"), + ("sticker-remove-outline", "sticker-remove-outline"), + ("sticker-text", "sticker-text"), + ("sticker-text-outline", "sticker-text-outline"), + ("stocking", "stocking"), + ("stomach", "stomach"), + ("stool", "stool"), + ("stool-outline", "stool-outline"), + ("stop", "stop"), + ("stop-circle", "stop-circle"), + ("stop-circle-outline", "stop-circle-outline"), + ("storage-tank", "storage-tank"), + ("storage-tank-outline", "storage-tank-outline"), + ("store", "store"), + ("store-24-hour", "store-24-hour"), + ("store-alert", "store-alert"), + ("store-alert-outline", "store-alert-outline"), + ("store-check", "store-check"), + ("store-check-outline", "store-check-outline"), + ("store-clock", "store-clock"), + ("store-clock-outline", "store-clock-outline"), + ("store-cog", "store-cog"), + ("store-cog-outline", "store-cog-outline"), + ("store-edit", "store-edit"), + ("store-edit-outline", "store-edit-outline"), + ("store-marker", "store-marker"), + ("store-marker-outline", "store-marker-outline"), + ("store-minus", "store-minus"), + ("store-minus-outline", "store-minus-outline"), + ("store-off", "store-off"), + ("store-off-outline", "store-off-outline"), + ("store-outline", "store-outline"), + ("store-plus", "store-plus"), + ("store-plus-outline", "store-plus-outline"), + ("store-remove", "store-remove"), + ("store-remove-outline", "store-remove-outline"), + ("store-search", "store-search"), + ("store-search-outline", "store-search-outline"), + ("store-settings", "store-settings"), + ("store-settings-outline", "store-settings-outline"), + ("storefront", "storefront"), + ("storefront-check", "storefront-check"), + ("storefront-check-outline", "storefront-check-outline"), + ("storefront-edit", "storefront-edit"), + ("storefront-edit-outline", "storefront-edit-outline"), + ("storefront-minus", "storefront-minus"), + ("storefront-minus-outline", "storefront-minus-outline"), + ("storefront-outline", "storefront-outline"), + ("storefront-plus", "storefront-plus"), + ("storefront-plus-outline", "storefront-plus-outline"), + ("storefront-remove", "storefront-remove"), + ("storefront-remove-outline", "storefront-remove-outline"), + ("stove", "stove"), + ("strategy", "strategy"), + ("strava", "strava"), + ("stretch-to-page", "stretch-to-page"), + ("stretch-to-page-outline", "stretch-to-page-outline"), + ("string-lights", "string-lights"), + ("string-lights-off", "string-lights-off"), + ("subdirectory-arrow-left", "subdirectory-arrow-left"), + ("subdirectory-arrow-right", "subdirectory-arrow-right"), + ("submarine", "submarine"), + ("subtitles", "subtitles"), + ("subtitles-outline", "subtitles-outline"), + ("subway", "subway"), + ("subway-alert-variant", "subway-alert-variant"), + ("subway-variant", "subway-variant"), + ("summit", "summit"), + ("sun-angle", "sun-angle"), + ("sun-angle-outline", "sun-angle-outline"), + ("sun-clock", "sun-clock"), + ("sun-clock-outline", "sun-clock-outline"), + ("sun-compass", "sun-compass"), + ("sun-snowflake", "sun-snowflake"), + ("sun-snowflake-variant", "sun-snowflake-variant"), + ("sun-thermometer", "sun-thermometer"), + ("sun-thermometer-outline", "sun-thermometer-outline"), + ("sun-wireless", "sun-wireless"), + ("sun-wireless-outline", "sun-wireless-outline"), + ("sunglasses", "sunglasses"), + ("surfing", "surfing"), + ("surround-sound", "surround-sound"), + ("surround-sound-2-0", "surround-sound-2-0"), + ("surround-sound-2-1", "surround-sound-2-1"), + ("surround-sound-3-1", "surround-sound-3-1"), + ("surround-sound-5-1", "surround-sound-5-1"), + ("surround-sound-5-1-2", "surround-sound-5-1-2"), + ("surround-sound-7-1", "surround-sound-7-1"), + ("svg", "svg"), + ("swap-horizontal", "swap-horizontal"), + ("swap-horizontal-bold", "swap-horizontal-bold"), + ("swap-horizontal-circle", "swap-horizontal-circle"), + ("swap-horizontal-circle-outline", "swap-horizontal-circle-outline"), + ("swap-horizontal-variant", "swap-horizontal-variant"), + ("swap-vertical", "swap-vertical"), + ("swap-vertical-bold", "swap-vertical-bold"), + ("swap-vertical-circle", "swap-vertical-circle"), + ("swap-vertical-circle-outline", "swap-vertical-circle-outline"), + ("swap-vertical-variant", "swap-vertical-variant"), + ("swim", "swim"), + ("switch", "switch"), + ("sword", "sword"), + ("sword-cross", "sword-cross"), + ("syllabary-hangul", "syllabary-hangul"), + ("syllabary-hiragana", "syllabary-hiragana"), + ("syllabary-katakana", "syllabary-katakana"), + ("syllabary-katakana-halfwidth", "syllabary-katakana-halfwidth"), + ("symbol", "symbol"), + ("symfony", "symfony"), + ("synagogue", "synagogue"), + ("synagogue-outline", "synagogue-outline"), + ("sync", "sync"), + ("sync-alert", "sync-alert"), + ("sync-circle", "sync-circle"), + ("sync-off", "sync-off"), + ("tab", "tab"), + ("tab-minus", "tab-minus"), + ("tab-plus", "tab-plus"), + ("tab-remove", "tab-remove"), + ("tab-search", "tab-search"), + ("tab-unselected", "tab-unselected"), + ("table", "table"), + ("table-account", "table-account"), + ("table-alert", "table-alert"), + ("table-arrow-down", "table-arrow-down"), + ("table-arrow-left", "table-arrow-left"), + ("table-arrow-right", "table-arrow-right"), + ("table-arrow-up", "table-arrow-up"), + ("table-border", "table-border"), + ("table-cancel", "table-cancel"), + ("table-chair", "table-chair"), + ("table-check", "table-check"), + ("table-clock", "table-clock"), + ("table-cog", "table-cog"), + ("table-column", "table-column"), + ("table-column-plus-after", "table-column-plus-after"), + ("table-column-plus-before", "table-column-plus-before"), + ("table-column-remove", "table-column-remove"), + ("table-column-width", "table-column-width"), + ("table-edit", "table-edit"), + ("table-eye", "table-eye"), + ("table-eye-off", "table-eye-off"), + ("table-filter", "table-filter"), + ("table-furniture", "table-furniture"), + ("table-headers-eye", "table-headers-eye"), + ("table-headers-eye-off", "table-headers-eye-off"), + ("table-heart", "table-heart"), + ("table-key", "table-key"), + ("table-large", "table-large"), + ("table-large-plus", "table-large-plus"), + ("table-large-remove", "table-large-remove"), + ("table-lock", "table-lock"), + ("table-merge-cells", "table-merge-cells"), + ("table-minus", "table-minus"), + ("table-multiple", "table-multiple"), + ("table-network", "table-network"), + ("table-of-contents", "table-of-contents"), + ("table-off", "table-off"), + ("table-picnic", "table-picnic"), + ("table-pivot", "table-pivot"), + ("table-plus", "table-plus"), + ("table-question", "table-question"), + ("table-refresh", "table-refresh"), + ("table-remove", "table-remove"), + ("table-row", "table-row"), + ("table-row-height", "table-row-height"), + ("table-row-plus-after", "table-row-plus-after"), + ("table-row-plus-before", "table-row-plus-before"), + ("table-row-remove", "table-row-remove"), + ("table-search", "table-search"), + ("table-settings", "table-settings"), + ("table-split-cell", "table-split-cell"), + ("table-star", "table-star"), + ("table-sync", "table-sync"), + ("table-tennis", "table-tennis"), + ("tablet", "tablet"), + ("tablet-android", "tablet-android"), + ("tablet-cellphone", "tablet-cellphone"), + ("tablet-dashboard", "tablet-dashboard"), + ("tablet-ipad", "tablet-ipad"), + ("taco", "taco"), + ("tag", "tag"), + ("tag-arrow-down", "tag-arrow-down"), + ("tag-arrow-down-outline", "tag-arrow-down-outline"), + ("tag-arrow-left", "tag-arrow-left"), + ("tag-arrow-left-outline", "tag-arrow-left-outline"), + ("tag-arrow-right", "tag-arrow-right"), + ("tag-arrow-right-outline", "tag-arrow-right-outline"), + ("tag-arrow-up", "tag-arrow-up"), + ("tag-arrow-up-outline", "tag-arrow-up-outline"), + ("tag-check", "tag-check"), + ("tag-check-outline", "tag-check-outline"), + ("tag-faces", "tag-faces"), + ("tag-heart", "tag-heart"), + ("tag-heart-outline", "tag-heart-outline"), + ("tag-minus", "tag-minus"), + ("tag-minus-outline", "tag-minus-outline"), + ("tag-multiple", "tag-multiple"), + ("tag-multiple-outline", "tag-multiple-outline"), + ("tag-off", "tag-off"), + ("tag-off-outline", "tag-off-outline"), + ("tag-outline", "tag-outline"), + ("tag-plus", "tag-plus"), + ("tag-plus-outline", "tag-plus-outline"), + ("tag-remove", "tag-remove"), + ("tag-remove-outline", "tag-remove-outline"), + ("tag-search", "tag-search"), + ("tag-search-outline", "tag-search-outline"), + ("tag-text", "tag-text"), + ("tag-text-outline", "tag-text-outline"), + ("tailwind", "tailwind"), + ("tally-mark-1", "tally-mark-1"), + ("tally-mark-2", "tally-mark-2"), + ("tally-mark-3", "tally-mark-3"), + ("tally-mark-4", "tally-mark-4"), + ("tally-mark-5", "tally-mark-5"), + ("tangram", "tangram"), + ("tank", "tank"), + ("tanker-truck", "tanker-truck"), + ("tape-drive", "tape-drive"), + ("tape-measure", "tape-measure"), + ("target", "target"), + ("target-account", "target-account"), + ("target-variant", "target-variant"), + ("taxi", "taxi"), + ("tea", "tea"), + ("tea-outline", "tea-outline"), + ("teamspeak", "teamspeak"), + ("teamviewer", "teamviewer"), + ("teddy-bear", "teddy-bear"), + ("telegram", "telegram"), + ("telescope", "telescope"), + ("television", "television"), + ("television-ambient-light", "television-ambient-light"), + ("television-box", "television-box"), + ("television-classic", "television-classic"), + ("television-classic-off", "television-classic-off"), + ("television-guide", "television-guide"), + ("television-off", "television-off"), + ("television-pause", "television-pause"), + ("television-play", "television-play"), + ("television-shimmer", "television-shimmer"), + ("television-speaker", "television-speaker"), + ("television-speaker-off", "television-speaker-off"), + ("television-stop", "television-stop"), + ("temperature-celsius", "temperature-celsius"), + ("temperature-fahrenheit", "temperature-fahrenheit"), + ("temperature-kelvin", "temperature-kelvin"), + ("temple-buddhist", "temple-buddhist"), + ("temple-buddhist-outline", "temple-buddhist-outline"), + ("temple-hindu", "temple-hindu"), + ("temple-hindu-outline", "temple-hindu-outline"), + ("tennis", "tennis"), + ("tennis-ball", "tennis-ball"), + ("tent", "tent"), + ("terraform", "terraform"), + ("terrain", "terrain"), + ("test-tube", "test-tube"), + ("test-tube-empty", "test-tube-empty"), + ("test-tube-off", "test-tube-off"), + ("text", "text"), + ("text-account", "text-account"), + ("text-box", "text-box"), + ("text-box-check", "text-box-check"), + ("text-box-check-outline", "text-box-check-outline"), + ("text-box-edit", "text-box-edit"), + ("text-box-edit-outline", "text-box-edit-outline"), + ("text-box-minus", "text-box-minus"), + ("text-box-minus-outline", "text-box-minus-outline"), + ("text-box-multiple", "text-box-multiple"), + ("text-box-multiple-outline", "text-box-multiple-outline"), + ("text-box-outline", "text-box-outline"), + ("text-box-plus", "text-box-plus"), + ("text-box-plus-outline", "text-box-plus-outline"), + ("text-box-remove", "text-box-remove"), + ("text-box-remove-outline", "text-box-remove-outline"), + ("text-box-search", "text-box-search"), + ("text-box-search-outline", "text-box-search-outline"), + ("text-long", "text-long"), + ("text-recognition", "text-recognition"), + ("text-search", "text-search"), + ("text-search-variant", "text-search-variant"), + ("text-shadow", "text-shadow"), + ("text-short", "text-short"), + ("texture", "texture"), + ("texture-box", "texture-box"), + ("theater", "theater"), + ("theme-light-dark", "theme-light-dark"), + ("thermometer", "thermometer"), + ("thermometer-alert", "thermometer-alert"), + ("thermometer-auto", "thermometer-auto"), + ("thermometer-bluetooth", "thermometer-bluetooth"), + ("thermometer-check", "thermometer-check"), + ("thermometer-chevron-down", "thermometer-chevron-down"), + ("thermometer-chevron-up", "thermometer-chevron-up"), + ("thermometer-high", "thermometer-high"), + ("thermometer-lines", "thermometer-lines"), + ("thermometer-low", "thermometer-low"), + ("thermometer-minus", "thermometer-minus"), + ("thermometer-off", "thermometer-off"), + ("thermometer-plus", "thermometer-plus"), + ("thermometer-probe", "thermometer-probe"), + ("thermometer-probe-off", "thermometer-probe-off"), + ("thermometer-water", "thermometer-water"), + ("thermostat", "thermostat"), + ("thermostat-auto", "thermostat-auto"), + ("thermostat-box", "thermostat-box"), + ("thermostat-box-auto", "thermostat-box-auto"), + ("thought-bubble", "thought-bubble"), + ("thought-bubble-outline", "thought-bubble-outline"), + ("thumb-down", "thumb-down"), + ("thumb-down-outline", "thumb-down-outline"), + ("thumb-up", "thumb-up"), + ("thumb-up-outline", "thumb-up-outline"), + ("thumbs-up-down", "thumbs-up-down"), + ("thumbs-up-down-outline", "thumbs-up-down-outline"), + ("ticket", "ticket"), + ("ticket-account", "ticket-account"), + ("ticket-confirmation", "ticket-confirmation"), + ("ticket-confirmation-outline", "ticket-confirmation-outline"), + ("ticket-outline", "ticket-outline"), + ("ticket-percent", "ticket-percent"), + ("ticket-percent-outline", "ticket-percent-outline"), + ("tie", "tie"), + ("tilde", "tilde"), + ("tilde-off", "tilde-off"), + ("timelapse", "timelapse"), + ("timeline", "timeline"), + ("timeline-alert", "timeline-alert"), + ("timeline-alert-outline", "timeline-alert-outline"), + ("timeline-check", "timeline-check"), + ("timeline-check-outline", "timeline-check-outline"), + ("timeline-clock", "timeline-clock"), + ("timeline-clock-outline", "timeline-clock-outline"), + ("timeline-minus", "timeline-minus"), + ("timeline-minus-outline", "timeline-minus-outline"), + ("timeline-outline", "timeline-outline"), + ("timeline-plus", "timeline-plus"), + ("timeline-plus-outline", "timeline-plus-outline"), + ("timeline-question", "timeline-question"), + ("timeline-question-outline", "timeline-question-outline"), + ("timeline-remove", "timeline-remove"), + ("timeline-remove-outline", "timeline-remove-outline"), + ("timeline-text", "timeline-text"), + ("timeline-text-outline", "timeline-text-outline"), + ("timer", "timer"), + ("timer-10", "timer-10"), + ("timer-3", "timer-3"), + ("timer-alert", "timer-alert"), + ("timer-alert-outline", "timer-alert-outline"), + ("timer-cancel", "timer-cancel"), + ("timer-cancel-outline", "timer-cancel-outline"), + ("timer-check", "timer-check"), + ("timer-check-outline", "timer-check-outline"), + ("timer-cog", "timer-cog"), + ("timer-cog-outline", "timer-cog-outline"), + ("timer-edit", "timer-edit"), + ("timer-edit-outline", "timer-edit-outline"), + ("timer-lock", "timer-lock"), + ("timer-lock-open", "timer-lock-open"), + ("timer-lock-open-outline", "timer-lock-open-outline"), + ("timer-lock-outline", "timer-lock-outline"), + ("timer-marker", "timer-marker"), + ("timer-marker-outline", "timer-marker-outline"), + ("timer-minus", "timer-minus"), + ("timer-minus-outline", "timer-minus-outline"), + ("timer-music", "timer-music"), + ("timer-music-outline", "timer-music-outline"), + ("timer-off", "timer-off"), + ("timer-off-outline", "timer-off-outline"), + ("timer-outline", "timer-outline"), + ("timer-pause", "timer-pause"), + ("timer-pause-outline", "timer-pause-outline"), + ("timer-play", "timer-play"), + ("timer-play-outline", "timer-play-outline"), + ("timer-plus", "timer-plus"), + ("timer-plus-outline", "timer-plus-outline"), + ("timer-refresh", "timer-refresh"), + ("timer-refresh-outline", "timer-refresh-outline"), + ("timer-remove", "timer-remove"), + ("timer-remove-outline", "timer-remove-outline"), + ("timer-sand", "timer-sand"), + ("timer-sand-complete", "timer-sand-complete"), + ("timer-sand-empty", "timer-sand-empty"), + ("timer-sand-full", "timer-sand-full"), + ("timer-sand-paused", "timer-sand-paused"), + ("timer-settings", "timer-settings"), + ("timer-settings-outline", "timer-settings-outline"), + ("timer-star", "timer-star"), + ("timer-star-outline", "timer-star-outline"), + ("timer-stop", "timer-stop"), + ("timer-stop-outline", "timer-stop-outline"), + ("timer-sync", "timer-sync"), + ("timer-sync-outline", "timer-sync-outline"), + ("timetable", "timetable"), + ("tire", "tire"), + ("toaster", "toaster"), + ("toaster-off", "toaster-off"), + ("toaster-oven", "toaster-oven"), + ("toggle-switch", "toggle-switch"), + ("toggle-switch-off", "toggle-switch-off"), + ("toggle-switch-off-outline", "toggle-switch-off-outline"), + ("toggle-switch-outline", "toggle-switch-outline"), + ("toggle-switch-variant", "toggle-switch-variant"), + ("toggle-switch-variant-off", "toggle-switch-variant-off"), + ("toilet", "toilet"), + ("toolbox", "toolbox"), + ("toolbox-outline", "toolbox-outline"), + ("tools", "tools"), + ("tooltip", "tooltip"), + ("tooltip-account", "tooltip-account"), + ("tooltip-cellphone", "tooltip-cellphone"), + ("tooltip-check", "tooltip-check"), + ("tooltip-check-outline", "tooltip-check-outline"), + ("tooltip-edit", "tooltip-edit"), + ("tooltip-edit-outline", "tooltip-edit-outline"), + ("tooltip-image", "tooltip-image"), + ("tooltip-image-outline", "tooltip-image-outline"), + ("tooltip-minus", "tooltip-minus"), + ("tooltip-minus-outline", "tooltip-minus-outline"), + ("tooltip-outline", "tooltip-outline"), + ("tooltip-plus", "tooltip-plus"), + ("tooltip-plus-outline", "tooltip-plus-outline"), + ("tooltip-question", "tooltip-question"), + ("tooltip-question-outline", "tooltip-question-outline"), + ("tooltip-remove", "tooltip-remove"), + ("tooltip-remove-outline", "tooltip-remove-outline"), + ("tooltip-text", "tooltip-text"), + ("tooltip-text-outline", "tooltip-text-outline"), + ("tooth", "tooth"), + ("tooth-outline", "tooth-outline"), + ("toothbrush", "toothbrush"), + ("toothbrush-electric", "toothbrush-electric"), + ("toothbrush-paste", "toothbrush-paste"), + ("tor", "tor"), + ("torch", "torch"), + ("tortoise", "tortoise"), + ("toslink", "toslink"), + ("tournament", "tournament"), + ("tow-truck", "tow-truck"), + ("tower-beach", "tower-beach"), + ("tower-fire", "tower-fire"), + ("town-hall", "town-hall"), + ("toy-brick", "toy-brick"), + ("toy-brick-marker", "toy-brick-marker"), + ("toy-brick-marker-outline", "toy-brick-marker-outline"), + ("toy-brick-minus", "toy-brick-minus"), + ("toy-brick-minus-outline", "toy-brick-minus-outline"), + ("toy-brick-outline", "toy-brick-outline"), + ("toy-brick-plus", "toy-brick-plus"), + ("toy-brick-plus-outline", "toy-brick-plus-outline"), + ("toy-brick-remove", "toy-brick-remove"), + ("toy-brick-remove-outline", "toy-brick-remove-outline"), + ("toy-brick-search", "toy-brick-search"), + ("toy-brick-search-outline", "toy-brick-search-outline"), + ("track-light", "track-light"), + ("track-light-off", "track-light-off"), + ("trackpad", "trackpad"), + ("trackpad-lock", "trackpad-lock"), + ("tractor", "tractor"), + ("tractor-variant", "tractor-variant"), + ("trademark", "trademark"), + ("traffic-cone", "traffic-cone"), + ("traffic-light", "traffic-light"), + ("traffic-light-outline", "traffic-light-outline"), + ("train", "train"), + ("train-car", "train-car"), + ("train-car-autorack", "train-car-autorack"), + ("train-car-box", "train-car-box"), + ("train-car-box-full", "train-car-box-full"), + ("train-car-box-open", "train-car-box-open"), + ("train-car-caboose", "train-car-caboose"), + ("train-car-centerbeam", "train-car-centerbeam"), + ("train-car-centerbeam-full", "train-car-centerbeam-full"), + ("train-car-container", "train-car-container"), + ("train-car-flatbed", "train-car-flatbed"), + ("train-car-flatbed-car", "train-car-flatbed-car"), + ("train-car-flatbed-tank", "train-car-flatbed-tank"), + ("train-car-gondola", "train-car-gondola"), + ("train-car-gondola-full", "train-car-gondola-full"), + ("train-car-hopper", "train-car-hopper"), + ("train-car-hopper-covered", "train-car-hopper-covered"), + ("train-car-hopper-full", "train-car-hopper-full"), + ("train-car-intermodal", "train-car-intermodal"), + ("train-car-passenger", "train-car-passenger"), + ("train-car-passenger-door", "train-car-passenger-door"), + ("train-car-passenger-door-open", "train-car-passenger-door-open"), + ("train-car-passenger-variant", "train-car-passenger-variant"), + ("train-car-tank", "train-car-tank"), + ("train-variant", "train-variant"), + ("tram", "tram"), + ("tram-side", "tram-side"), + ("transcribe", "transcribe"), + ("transcribe-close", "transcribe-close"), + ("transfer", "transfer"), + ("transfer-down", "transfer-down"), + ("transfer-left", "transfer-left"), + ("transfer-right", "transfer-right"), + ("transfer-up", "transfer-up"), + ("transit-connection", "transit-connection"), + ("transit-connection-horizontal", "transit-connection-horizontal"), + ("transit-connection-variant", "transit-connection-variant"), + ("transit-detour", "transit-detour"), + ("transit-skip", "transit-skip"), + ("transit-transfer", "transit-transfer"), + ("transition", "transition"), + ("transition-masked", "transition-masked"), + ("translate", "translate"), + ("translate-off", "translate-off"), + ("translate-variant", "translate-variant"), + ("transmission-tower", "transmission-tower"), + ("transmission-tower-export", "transmission-tower-export"), + ("transmission-tower-import", "transmission-tower-import"), + ("transmission-tower-off", "transmission-tower-off"), + ("trash-can", "trash-can"), + ("trash-can-outline", "trash-can-outline"), + ("tray", "tray"), + ("tray-alert", "tray-alert"), + ("tray-arrow-down", "tray-arrow-down"), + ("tray-arrow-up", "tray-arrow-up"), + ("tray-full", "tray-full"), + ("tray-minus", "tray-minus"), + ("tray-plus", "tray-plus"), + ("tray-remove", "tray-remove"), + ("treasure-chest", "treasure-chest"), + ("tree", "tree"), + ("tree-outline", "tree-outline"), + ("trello", "trello"), + ("trending-down", "trending-down"), + ("trending-neutral", "trending-neutral"), + ("trending-up", "trending-up"), + ("triangle", "triangle"), + ("triangle-outline", "triangle-outline"), + ("triangle-small-down", "triangle-small-down"), + ("triangle-small-up", "triangle-small-up"), + ("triangle-wave", "triangle-wave"), + ("triforce", "triforce"), + ("trophy", "trophy"), + ("trophy-award", "trophy-award"), + ("trophy-broken", "trophy-broken"), + ("trophy-outline", "trophy-outline"), + ("trophy-variant", "trophy-variant"), + ("trophy-variant-outline", "trophy-variant-outline"), + ("truck", "truck"), + ("truck-alert", "truck-alert"), + ("truck-alert-outline", "truck-alert-outline"), + ("truck-cargo-container", "truck-cargo-container"), + ("truck-check", "truck-check"), + ("truck-check-outline", "truck-check-outline"), + ("truck-delivery", "truck-delivery"), + ("truck-delivery-outline", "truck-delivery-outline"), + ("truck-fast", "truck-fast"), + ("truck-fast-outline", "truck-fast-outline"), + ("truck-flatbed", "truck-flatbed"), + ("truck-minus", "truck-minus"), + ("truck-minus-outline", "truck-minus-outline"), + ("truck-outline", "truck-outline"), + ("truck-plus", "truck-plus"), + ("truck-plus-outline", "truck-plus-outline"), + ("truck-remove", "truck-remove"), + ("truck-remove-outline", "truck-remove-outline"), + ("truck-snowflake", "truck-snowflake"), + ("truck-trailer", "truck-trailer"), + ("trumpet", "trumpet"), + ("tshirt-crew", "tshirt-crew"), + ("tshirt-crew-outline", "tshirt-crew-outline"), + ("tshirt-v", "tshirt-v"), + ("tshirt-v-outline", "tshirt-v-outline"), + ("tsunami", "tsunami"), + ("tumble-dryer", "tumble-dryer"), + ("tumble-dryer-alert", "tumble-dryer-alert"), + ("tumble-dryer-off", "tumble-dryer-off"), + ("tumblr", "tumblr"), + ("tumblr-box", "tumblr-box"), + ("tumblr-reblog", "tumblr-reblog"), + ("tune", "tune"), + ("tune-variant", "tune-variant"), + ("tune-vertical", "tune-vertical"), + ("tune-vertical-variant", "tune-vertical-variant"), + ("tunnel", "tunnel"), + ("tunnel-outline", "tunnel-outline"), + ("turbine", "turbine"), + ("turkey", "turkey"), + ("turnstile", "turnstile"), + ("turnstile-outline", "turnstile-outline"), + ("turtle", "turtle"), + ("twitch", "twitch"), + ("twitter", "twitter"), + ("twitter-box", "twitter-box"), + ("twitter-circle", "twitter-circle"), + ("two-factor-authentication", "two-factor-authentication"), + ("typewriter", "typewriter"), + ("uber", "uber"), + ("ubisoft", "ubisoft"), + ("ubuntu", "ubuntu"), + ("ufo", "ufo"), + ("ufo-outline", "ufo-outline"), + ("ultra-high-definition", "ultra-high-definition"), + ("umbraco", "umbraco"), + ("umbrella", "umbrella"), + ("umbrella-beach", "umbrella-beach"), + ("umbrella-beach-outline", "umbrella-beach-outline"), + ("umbrella-closed", "umbrella-closed"), + ("umbrella-closed-outline", "umbrella-closed-outline"), + ("umbrella-closed-variant", "umbrella-closed-variant"), + ("umbrella-outline", "umbrella-outline"), + ("undo", "undo"), + ("undo-variant", "undo-variant"), + ("unfold-less-horizontal", "unfold-less-horizontal"), + ("unfold-less-vertical", "unfold-less-vertical"), + ("unfold-more-horizontal", "unfold-more-horizontal"), + ("unfold-more-vertical", "unfold-more-vertical"), + ("ungroup", "ungroup"), + ("unicode", "unicode"), + ("unicorn", "unicorn"), + ("unicorn-variant", "unicorn-variant"), + ("unicycle", "unicycle"), + ("unity", "unity"), + ("unreal", "unreal"), + ("untappd", "untappd"), + ("update", "update"), + ("upload", "upload"), + ("upload-lock", "upload-lock"), + ("upload-lock-outline", "upload-lock-outline"), + ("upload-multiple", "upload-multiple"), + ("upload-network", "upload-network"), + ("upload-network-outline", "upload-network-outline"), + ("upload-off", "upload-off"), + ("upload-off-outline", "upload-off-outline"), + ("upload-outline", "upload-outline"), + ("usb", "usb"), + ("usb-flash-drive", "usb-flash-drive"), + ("usb-flash-drive-outline", "usb-flash-drive-outline"), + ("usb-port", "usb-port"), + ("vacuum", "vacuum"), + ("vacuum-outline", "vacuum-outline"), + ("valve", "valve"), + ("valve-closed", "valve-closed"), + ("valve-open", "valve-open"), + ("van-passenger", "van-passenger"), + ("van-utility", "van-utility"), + ("vanish", "vanish"), + ("vanish-quarter", "vanish-quarter"), + ("vanity-light", "vanity-light"), + ("variable", "variable"), + ("variable-box", "variable-box"), + ("vector-arrange-above", "vector-arrange-above"), + ("vector-arrange-below", "vector-arrange-below"), + ("vector-bezier", "vector-bezier"), + ("vector-circle", "vector-circle"), + ("vector-circle-variant", "vector-circle-variant"), + ("vector-combine", "vector-combine"), + ("vector-curve", "vector-curve"), + ("vector-difference", "vector-difference"), + ("vector-difference-ab", "vector-difference-ab"), + ("vector-difference-ba", "vector-difference-ba"), + ("vector-ellipse", "vector-ellipse"), + ("vector-intersection", "vector-intersection"), + ("vector-line", "vector-line"), + ("vector-link", "vector-link"), + ("vector-point", "vector-point"), + ("vector-point-edit", "vector-point-edit"), + ("vector-point-minus", "vector-point-minus"), + ("vector-point-plus", "vector-point-plus"), + ("vector-point-select", "vector-point-select"), + ("vector-polygon", "vector-polygon"), + ("vector-polygon-variant", "vector-polygon-variant"), + ("vector-polyline", "vector-polyline"), + ("vector-polyline-edit", "vector-polyline-edit"), + ("vector-polyline-minus", "vector-polyline-minus"), + ("vector-polyline-plus", "vector-polyline-plus"), + ("vector-polyline-remove", "vector-polyline-remove"), + ("vector-radius", "vector-radius"), + ("vector-rectangle", "vector-rectangle"), + ("vector-selection", "vector-selection"), + ("vector-square", "vector-square"), + ("vector-square-close", "vector-square-close"), + ("vector-square-edit", "vector-square-edit"), + ("vector-square-minus", "vector-square-minus"), + ("vector-square-open", "vector-square-open"), + ("vector-square-plus", "vector-square-plus"), + ("vector-square-remove", "vector-square-remove"), + ("vector-triangle", "vector-triangle"), + ("vector-union", "vector-union"), + ("venmo", "venmo"), + ("vhs", "vhs"), + ("vibrate", "vibrate"), + ("vibrate-off", "vibrate-off"), + ("video", "video"), + ("video-2d", "video-2d"), + ("video-3d", "video-3d"), + ("video-3d-off", "video-3d-off"), + ("video-3d-variant", "video-3d-variant"), + ("video-4k-box", "video-4k-box"), + ("video-account", "video-account"), + ("video-box", "video-box"), + ("video-box-off", "video-box-off"), + ("video-check", "video-check"), + ("video-check-outline", "video-check-outline"), + ("video-high-definition", "video-high-definition"), + ("video-image", "video-image"), + ("video-input-antenna", "video-input-antenna"), + ("video-input-component", "video-input-component"), + ("video-input-hdmi", "video-input-hdmi"), + ("video-input-scart", "video-input-scart"), + ("video-input-svideo", "video-input-svideo"), + ("video-marker", "video-marker"), + ("video-marker-outline", "video-marker-outline"), + ("video-minus", "video-minus"), + ("video-minus-outline", "video-minus-outline"), + ("video-off", "video-off"), + ("video-off-outline", "video-off-outline"), + ("video-outline", "video-outline"), + ("video-plus", "video-plus"), + ("video-plus-outline", "video-plus-outline"), + ("video-stabilization", "video-stabilization"), + ("video-switch", "video-switch"), + ("video-switch-outline", "video-switch-outline"), + ("video-vintage", "video-vintage"), + ("video-wireless", "video-wireless"), + ("video-wireless-outline", "video-wireless-outline"), + ("view-agenda", "view-agenda"), + ("view-agenda-outline", "view-agenda-outline"), + ("view-array", "view-array"), + ("view-array-outline", "view-array-outline"), + ("view-carousel", "view-carousel"), + ("view-carousel-outline", "view-carousel-outline"), + ("view-column", "view-column"), + ("view-column-outline", "view-column-outline"), + ("view-comfy", "view-comfy"), + ("view-comfy-outline", "view-comfy-outline"), + ("view-compact", "view-compact"), + ("view-compact-outline", "view-compact-outline"), + ("view-dashboard", "view-dashboard"), + ("view-dashboard-edit", "view-dashboard-edit"), + ("view-dashboard-edit-outline", "view-dashboard-edit-outline"), + ("view-dashboard-outline", "view-dashboard-outline"), + ("view-dashboard-variant", "view-dashboard-variant"), + ("view-dashboard-variant-outline", "view-dashboard-variant-outline"), + ("view-day", "view-day"), + ("view-day-outline", "view-day-outline"), + ("view-gallery", "view-gallery"), + ("view-gallery-outline", "view-gallery-outline"), + ("view-grid", "view-grid"), + ("view-grid-outline", "view-grid-outline"), + ("view-grid-plus", "view-grid-plus"), + ("view-grid-plus-outline", "view-grid-plus-outline"), + ("view-headline", "view-headline"), + ("view-list", "view-list"), + ("view-list-outline", "view-list-outline"), + ("view-module", "view-module"), + ("view-module-outline", "view-module-outline"), + ("view-parallel", "view-parallel"), + ("view-parallel-outline", "view-parallel-outline"), + ("view-quilt", "view-quilt"), + ("view-quilt-outline", "view-quilt-outline"), + ("view-sequential", "view-sequential"), + ("view-sequential-outline", "view-sequential-outline"), + ("view-split-horizontal", "view-split-horizontal"), + ("view-split-vertical", "view-split-vertical"), + ("view-stream", "view-stream"), + ("view-stream-outline", "view-stream-outline"), + ("view-week", "view-week"), + ("view-week-outline", "view-week-outline"), + ("vimeo", "vimeo"), + ("vine", "vine"), + ("violin", "violin"), + ("virtual-reality", "virtual-reality"), + ("virus", "virus"), + ("virus-off", "virus-off"), + ("virus-off-outline", "virus-off-outline"), + ("virus-outline", "virus-outline"), + ("vk", "vk"), + ("vk-box", "vk-box"), + ("vk-circle", "vk-circle"), + ("vlc", "vlc"), + ("voicemail", "voicemail"), + ("volcano", "volcano"), + ("volcano-outline", "volcano-outline"), + ("volleyball", "volleyball"), + ("volume", "volume"), + ("volume-equal", "volume-equal"), + ("volume-high", "volume-high"), + ("volume-low", "volume-low"), + ("volume-medium", "volume-medium"), + ("volume-minus", "volume-minus"), + ("volume-mute", "volume-mute"), + ("volume-off", "volume-off"), + ("volume-plus", "volume-plus"), + ("volume-source", "volume-source"), + ("volume-variant-off", "volume-variant-off"), + ("volume-vibrate", "volume-vibrate"), + ("vote", "vote"), + ("vote-outline", "vote-outline"), + ("vpn", "vpn"), + ("vuejs", "vuejs"), + ("vuetify", "vuetify"), + ("walk", "walk"), + ("wall", "wall"), + ("wall-fire", "wall-fire"), + ("wall-sconce", "wall-sconce"), + ("wall-sconce-flat", "wall-sconce-flat"), + ("wall-sconce-flat-outline", "wall-sconce-flat-outline"), + ("wall-sconce-flat-variant", "wall-sconce-flat-variant"), + ("wall-sconce-flat-variant-outline", "wall-sconce-flat-variant-outline"), + ("wall-sconce-outline", "wall-sconce-outline"), + ("wall-sconce-round", "wall-sconce-round"), + ("wall-sconce-round-outline", "wall-sconce-round-outline"), + ("wall-sconce-round-variant", "wall-sconce-round-variant"), + ("wall-sconce-round-variant-outline", "wall-sconce-round-variant-outline"), + ("wall-sconce-variant", "wall-sconce-variant"), + ("wallet", "wallet"), + ("wallet-giftcard", "wallet-giftcard"), + ("wallet-membership", "wallet-membership"), + ("wallet-outline", "wallet-outline"), + ("wallet-plus", "wallet-plus"), + ("wallet-plus-outline", "wallet-plus-outline"), + ("wallet-travel", "wallet-travel"), + ("wallpaper", "wallpaper"), + ("wan", "wan"), + ("wardrobe", "wardrobe"), + ("wardrobe-outline", "wardrobe-outline"), + ("warehouse", "warehouse"), + ("washing-machine", "washing-machine"), + ("washing-machine-alert", "washing-machine-alert"), + ("washing-machine-off", "washing-machine-off"), + ("watch", "watch"), + ("watch-export", "watch-export"), + ("watch-export-variant", "watch-export-variant"), + ("watch-import", "watch-import"), + ("watch-import-variant", "watch-import-variant"), + ("watch-variant", "watch-variant"), + ("watch-vibrate", "watch-vibrate"), + ("watch-vibrate-off", "watch-vibrate-off"), + ("water", "water"), + ("water-alert", "water-alert"), + ("water-alert-outline", "water-alert-outline"), + ("water-boiler", "water-boiler"), + ("water-boiler-alert", "water-boiler-alert"), + ("water-boiler-auto", "water-boiler-auto"), + ("water-boiler-off", "water-boiler-off"), + ("water-check", "water-check"), + ("water-check-outline", "water-check-outline"), + ("water-circle", "water-circle"), + ("water-minus", "water-minus"), + ("water-minus-outline", "water-minus-outline"), + ("water-off", "water-off"), + ("water-off-outline", "water-off-outline"), + ("water-opacity", "water-opacity"), + ("water-outline", "water-outline"), + ("water-percent", "water-percent"), + ("water-percent-alert", "water-percent-alert"), + ("water-plus", "water-plus"), + ("water-plus-outline", "water-plus-outline"), + ("water-polo", "water-polo"), + ("water-pump", "water-pump"), + ("water-pump-off", "water-pump-off"), + ("water-remove", "water-remove"), + ("water-remove-outline", "water-remove-outline"), + ("water-sync", "water-sync"), + ("water-thermometer", "water-thermometer"), + ("water-thermometer-outline", "water-thermometer-outline"), + ("water-well", "water-well"), + ("water-well-outline", "water-well-outline"), + ("waterfall", "waterfall"), + ("watering-can", "watering-can"), + ("watering-can-outline", "watering-can-outline"), + ("watermark", "watermark"), + ("wave", "wave"), + ("waveform", "waveform"), + ("waves", "waves"), + ("waves-arrow-left", "waves-arrow-left"), + ("waves-arrow-right", "waves-arrow-right"), + ("waves-arrow-up", "waves-arrow-up"), + ("waze", "waze"), + ("weather-cloudy", "weather-cloudy"), + ("weather-cloudy-alert", "weather-cloudy-alert"), + ("weather-cloudy-arrow-right", "weather-cloudy-arrow-right"), + ("weather-cloudy-clock", "weather-cloudy-clock"), + ("weather-dust", "weather-dust"), + ("weather-fog", "weather-fog"), + ("weather-hail", "weather-hail"), + ("weather-hazy", "weather-hazy"), + ("weather-hurricane", "weather-hurricane"), + ("weather-lightning", "weather-lightning"), + ("weather-lightning-rainy", "weather-lightning-rainy"), + ("weather-night", "weather-night"), + ("weather-night-partly-cloudy", "weather-night-partly-cloudy"), + ("weather-partly-cloudy", "weather-partly-cloudy"), + ("weather-partly-lightning", "weather-partly-lightning"), + ("weather-partly-rainy", "weather-partly-rainy"), + ("weather-partly-snowy", "weather-partly-snowy"), + ("weather-partly-snowy-rainy", "weather-partly-snowy-rainy"), + ("weather-pouring", "weather-pouring"), + ("weather-rainy", "weather-rainy"), + ("weather-snowy", "weather-snowy"), + ("weather-snowy-heavy", "weather-snowy-heavy"), + ("weather-snowy-rainy", "weather-snowy-rainy"), + ("weather-sunny", "weather-sunny"), + ("weather-sunny-alert", "weather-sunny-alert"), + ("weather-sunny-off", "weather-sunny-off"), + ("weather-sunset", "weather-sunset"), + ("weather-sunset-down", "weather-sunset-down"), + ("weather-sunset-up", "weather-sunset-up"), + ("weather-tornado", "weather-tornado"), + ("weather-windy", "weather-windy"), + ("weather-windy-variant", "weather-windy-variant"), + ("web", "web"), + ("web-box", "web-box"), + ("web-cancel", "web-cancel"), + ("web-check", "web-check"), + ("web-clock", "web-clock"), + ("web-minus", "web-minus"), + ("web-off", "web-off"), + ("web-plus", "web-plus"), + ("web-refresh", "web-refresh"), + ("web-remove", "web-remove"), + ("web-sync", "web-sync"), + ("webcam", "webcam"), + ("webcam-off", "webcam-off"), + ("webhook", "webhook"), + ("webpack", "webpack"), + ("webrtc", "webrtc"), + ("wechat", "wechat"), + ("weight", "weight"), + ("weight-gram", "weight-gram"), + ("weight-kilogram", "weight-kilogram"), + ("weight-lifter", "weight-lifter"), + ("weight-pound", "weight-pound"), + ("whatsapp", "whatsapp"), + ("wheel-barrow", "wheel-barrow"), + ("wheelchair", "wheelchair"), + ("wheelchair-accessibility", "wheelchair-accessibility"), + ("whistle", "whistle"), + ("whistle-outline", "whistle-outline"), + ("white-balance-auto", "white-balance-auto"), + ("white-balance-incandescent", "white-balance-incandescent"), + ("white-balance-iridescent", "white-balance-iridescent"), + ("white-balance-sunny", "white-balance-sunny"), + ("widgets", "widgets"), + ("widgets-outline", "widgets-outline"), + ("wifi", "wifi"), + ("wifi-alert", "wifi-alert"), + ("wifi-arrow-down", "wifi-arrow-down"), + ("wifi-arrow-left", "wifi-arrow-left"), + ("wifi-arrow-left-right", "wifi-arrow-left-right"), + ("wifi-arrow-right", "wifi-arrow-right"), + ("wifi-arrow-up", "wifi-arrow-up"), + ("wifi-arrow-up-down", "wifi-arrow-up-down"), + ("wifi-cancel", "wifi-cancel"), + ("wifi-check", "wifi-check"), + ("wifi-cog", "wifi-cog"), + ("wifi-lock", "wifi-lock"), + ("wifi-lock-open", "wifi-lock-open"), + ("wifi-marker", "wifi-marker"), + ("wifi-minus", "wifi-minus"), + ("wifi-off", "wifi-off"), + ("wifi-plus", "wifi-plus"), + ("wifi-refresh", "wifi-refresh"), + ("wifi-remove", "wifi-remove"), + ("wifi-settings", "wifi-settings"), + ("wifi-star", "wifi-star"), + ("wifi-strength-1", "wifi-strength-1"), + ("wifi-strength-1-alert", "wifi-strength-1-alert"), + ("wifi-strength-1-lock", "wifi-strength-1-lock"), + ("wifi-strength-1-lock-open", "wifi-strength-1-lock-open"), + ("wifi-strength-2", "wifi-strength-2"), + ("wifi-strength-2-alert", "wifi-strength-2-alert"), + ("wifi-strength-2-lock", "wifi-strength-2-lock"), + ("wifi-strength-2-lock-open", "wifi-strength-2-lock-open"), + ("wifi-strength-3", "wifi-strength-3"), + ("wifi-strength-3-alert", "wifi-strength-3-alert"), + ("wifi-strength-3-lock", "wifi-strength-3-lock"), + ("wifi-strength-3-lock-open", "wifi-strength-3-lock-open"), + ("wifi-strength-4", "wifi-strength-4"), + ("wifi-strength-4-alert", "wifi-strength-4-alert"), + ("wifi-strength-4-lock", "wifi-strength-4-lock"), + ("wifi-strength-4-lock-open", "wifi-strength-4-lock-open"), + ("wifi-strength-alert-outline", "wifi-strength-alert-outline"), + ("wifi-strength-lock-open-outline", "wifi-strength-lock-open-outline"), + ("wifi-strength-lock-outline", "wifi-strength-lock-outline"), + ("wifi-strength-off", "wifi-strength-off"), + ("wifi-strength-off-outline", "wifi-strength-off-outline"), + ("wifi-strength-outline", "wifi-strength-outline"), + ("wifi-sync", "wifi-sync"), + ("wikipedia", "wikipedia"), + ("wind-power", "wind-power"), + ("wind-power-outline", "wind-power-outline"), + ("wind-turbine", "wind-turbine"), + ("wind-turbine-alert", "wind-turbine-alert"), + ("wind-turbine-check", "wind-turbine-check"), + ("window-close", "window-close"), + ("window-closed", "window-closed"), + ("window-closed-variant", "window-closed-variant"), + ("window-maximize", "window-maximize"), + ("window-minimize", "window-minimize"), + ("window-open", "window-open"), + ("window-open-variant", "window-open-variant"), + ("window-restore", "window-restore"), + ("window-shutter", "window-shutter"), + ("window-shutter-alert", "window-shutter-alert"), + ("window-shutter-auto", "window-shutter-auto"), + ("window-shutter-cog", "window-shutter-cog"), + ("window-shutter-open", "window-shutter-open"), + ("window-shutter-settings", "window-shutter-settings"), + ("windsock", "windsock"), + ("wiper", "wiper"), + ("wiper-wash", "wiper-wash"), + ("wiper-wash-alert", "wiper-wash-alert"), + ("wizard-hat", "wizard-hat"), + ("wordpress", "wordpress"), + ("wrap", "wrap"), + ("wrap-disabled", "wrap-disabled"), + ("wrench", "wrench"), + ("wrench-check", "wrench-check"), + ("wrench-check-outline", "wrench-check-outline"), + ("wrench-clock", "wrench-clock"), + ("wrench-clock-outline", "wrench-clock-outline"), + ("wrench-cog", "wrench-cog"), + ("wrench-cog-outline", "wrench-cog-outline"), + ("wrench-outline", "wrench-outline"), + ("wunderlist", "wunderlist"), + ("xamarin", "xamarin"), + ("xamarin-outline", "xamarin-outline"), + ("xda", "xda"), + ("xing", "xing"), + ("xing-circle", "xing-circle"), + ("xml", "xml"), + ("xmpp", "xmpp"), + ("y-combinator", "y-combinator"), + ("yahoo", "yahoo"), + ("yammer", "yammer"), + ("yeast", "yeast"), + ("yelp", "yelp"), + ("yin-yang", "yin-yang"), + ("yoga", "yoga"), + ("youtube", "youtube"), + ("youtube-gaming", "youtube-gaming"), + ("youtube-studio", "youtube-studio"), + ("youtube-subscription", "youtube-subscription"), + ("youtube-tv", "youtube-tv"), + ("yurt", "yurt"), + ("z-wave", "z-wave"), + ("zend", "zend"), + ("zigbee", "zigbee"), + ("zip-box", "zip-box"), + ("zip-box-outline", "zip-box-outline"), + ("zip-disk", "zip-disk"), + ("zodiac-aquarius", "zodiac-aquarius"), + ("zodiac-aries", "zodiac-aries"), + ("zodiac-cancer", "zodiac-cancer"), + ("zodiac-capricorn", "zodiac-capricorn"), + ("zodiac-gemini", "zodiac-gemini"), + ("zodiac-leo", "zodiac-leo"), + ("zodiac-libra", "zodiac-libra"), + ("zodiac-pisces", "zodiac-pisces"), + ("zodiac-sagittarius", "zodiac-sagittarius"), + ("zodiac-scorpio", "zodiac-scorpio"), + ("zodiac-taurus", "zodiac-taurus"), + ("zodiac-virgo", "zodiac-virgo"), + ], + max_length=50, + verbose_name="Icon", + ), + ), + migrations.AlterField( + model_name="dashboardwidget", + name="polymorphic_ctype", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="polymorphic_%(app_label)s.%(class)s_set+", + to="contenttypes.contenttype", + ), + ), + migrations.AlterField( + model_name="notification", + name="icon", + field=models.CharField( + choices=[ + ("ab-testing", "ab-testing"), + ("abacus", "abacus"), + ("abjad-arabic", "abjad-arabic"), + ("abjad-hebrew", "abjad-hebrew"), + ("abugida-devanagari", "abugida-devanagari"), + ("abugida-thai", "abugida-thai"), + ("access-point", "access-point"), + ("access-point-check", "access-point-check"), + ("access-point-minus", "access-point-minus"), + ("access-point-network", "access-point-network"), + ("access-point-network-off", "access-point-network-off"), + ("access-point-off", "access-point-off"), + ("access-point-plus", "access-point-plus"), + ("access-point-remove", "access-point-remove"), + ("account", "account"), + ("account-alert", "account-alert"), + ("account-alert-outline", "account-alert-outline"), + ("account-arrow-down", "account-arrow-down"), + ("account-arrow-down-outline", "account-arrow-down-outline"), + ("account-arrow-left", "account-arrow-left"), + ("account-arrow-left-outline", "account-arrow-left-outline"), + ("account-arrow-right", "account-arrow-right"), + ("account-arrow-right-outline", "account-arrow-right-outline"), + ("account-arrow-up", "account-arrow-up"), + ("account-arrow-up-outline", "account-arrow-up-outline"), + ("account-badge", "account-badge"), + ("account-badge-outline", "account-badge-outline"), + ("account-box", "account-box"), + ("account-box-multiple", "account-box-multiple"), + ("account-box-multiple-outline", "account-box-multiple-outline"), + ("account-box-outline", "account-box-outline"), + ("account-cancel", "account-cancel"), + ("account-cancel-outline", "account-cancel-outline"), + ("account-card", "account-card"), + ("account-card-outline", "account-card-outline"), + ("account-cash", "account-cash"), + ("account-cash-outline", "account-cash-outline"), + ("account-check", "account-check"), + ("account-check-outline", "account-check-outline"), + ("account-child", "account-child"), + ("account-child-circle", "account-child-circle"), + ("account-child-outline", "account-child-outline"), + ("account-circle", "account-circle"), + ("account-circle-outline", "account-circle-outline"), + ("account-clock", "account-clock"), + ("account-clock-outline", "account-clock-outline"), + ("account-cog", "account-cog"), + ("account-cog-outline", "account-cog-outline"), + ("account-convert", "account-convert"), + ("account-convert-outline", "account-convert-outline"), + ("account-cowboy-hat", "account-cowboy-hat"), + ("account-cowboy-hat-outline", "account-cowboy-hat-outline"), + ("account-credit-card", "account-credit-card"), + ("account-credit-card-outline", "account-credit-card-outline"), + ("account-details", "account-details"), + ("account-details-outline", "account-details-outline"), + ("account-edit", "account-edit"), + ("account-edit-outline", "account-edit-outline"), + ("account-eye", "account-eye"), + ("account-eye-outline", "account-eye-outline"), + ("account-filter", "account-filter"), + ("account-filter-outline", "account-filter-outline"), + ("account-group", "account-group"), + ("account-group-outline", "account-group-outline"), + ("account-hard-hat", "account-hard-hat"), + ("account-hard-hat-outline", "account-hard-hat-outline"), + ("account-heart", "account-heart"), + ("account-heart-outline", "account-heart-outline"), + ("account-injury", "account-injury"), + ("account-injury-outline", "account-injury-outline"), + ("account-key", "account-key"), + ("account-key-outline", "account-key-outline"), + ("account-lock", "account-lock"), + ("account-lock-open", "account-lock-open"), + ("account-lock-open-outline", "account-lock-open-outline"), + ("account-lock-outline", "account-lock-outline"), + ("account-minus", "account-minus"), + ("account-minus-outline", "account-minus-outline"), + ("account-multiple", "account-multiple"), + ("account-multiple-check", "account-multiple-check"), + ("account-multiple-check-outline", "account-multiple-check-outline"), + ("account-multiple-minus", "account-multiple-minus"), + ("account-multiple-minus-outline", "account-multiple-minus-outline"), + ("account-multiple-outline", "account-multiple-outline"), + ("account-multiple-plus", "account-multiple-plus"), + ("account-multiple-plus-outline", "account-multiple-plus-outline"), + ("account-multiple-remove", "account-multiple-remove"), + ("account-multiple-remove-outline", "account-multiple-remove-outline"), + ("account-music", "account-music"), + ("account-music-outline", "account-music-outline"), + ("account-network", "account-network"), + ("account-network-off", "account-network-off"), + ("account-network-off-outline", "account-network-off-outline"), + ("account-network-outline", "account-network-outline"), + ("account-off", "account-off"), + ("account-off-outline", "account-off-outline"), + ("account-outline", "account-outline"), + ("account-plus", "account-plus"), + ("account-plus-outline", "account-plus-outline"), + ("account-question", "account-question"), + ("account-question-outline", "account-question-outline"), + ("account-reactivate", "account-reactivate"), + ("account-reactivate-outline", "account-reactivate-outline"), + ("account-remove", "account-remove"), + ("account-remove-outline", "account-remove-outline"), + ("account-school", "account-school"), + ("account-school-outline", "account-school-outline"), + ("account-search", "account-search"), + ("account-search-outline", "account-search-outline"), + ("account-settings", "account-settings"), + ("account-settings-outline", "account-settings-outline"), + ("account-settings-variant", "account-settings-variant"), + ("account-star", "account-star"), + ("account-star-outline", "account-star-outline"), + ("account-supervisor", "account-supervisor"), + ("account-supervisor-circle", "account-supervisor-circle"), + ("account-supervisor-circle-outline", "account-supervisor-circle-outline"), + ("account-supervisor-outline", "account-supervisor-outline"), + ("account-switch", "account-switch"), + ("account-switch-outline", "account-switch-outline"), + ("account-sync", "account-sync"), + ("account-sync-outline", "account-sync-outline"), + ("account-tag", "account-tag"), + ("account-tag-outline", "account-tag-outline"), + ("account-tie", "account-tie"), + ("account-tie-hat", "account-tie-hat"), + ("account-tie-hat-outline", "account-tie-hat-outline"), + ("account-tie-outline", "account-tie-outline"), + ("account-tie-voice", "account-tie-voice"), + ("account-tie-voice-off", "account-tie-voice-off"), + ("account-tie-voice-off-outline", "account-tie-voice-off-outline"), + ("account-tie-voice-outline", "account-tie-voice-outline"), + ("account-tie-woman", "account-tie-woman"), + ("account-voice", "account-voice"), + ("account-voice-off", "account-voice-off"), + ("account-wrench", "account-wrench"), + ("account-wrench-outline", "account-wrench-outline"), + ("accusoft", "accusoft"), + ("ad-choices", "ad-choices"), + ("adchoices", "adchoices"), + ("adjust", "adjust"), + ("adobe", "adobe"), + ("advertisements", "advertisements"), + ("advertisements-off", "advertisements-off"), + ("air-conditioner", "air-conditioner"), + ("air-filter", "air-filter"), + ("air-horn", "air-horn"), + ("air-humidifier", "air-humidifier"), + ("air-humidifier-off", "air-humidifier-off"), + ("air-purifier", "air-purifier"), + ("air-purifier-off", "air-purifier-off"), + ("airbag", "airbag"), + ("airballoon", "airballoon"), + ("airballoon-outline", "airballoon-outline"), + ("airplane", "airplane"), + ("airplane-alert", "airplane-alert"), + ("airplane-check", "airplane-check"), + ("airplane-clock", "airplane-clock"), + ("airplane-cog", "airplane-cog"), + ("airplane-edit", "airplane-edit"), + ("airplane-landing", "airplane-landing"), + ("airplane-marker", "airplane-marker"), + ("airplane-minus", "airplane-minus"), + ("airplane-off", "airplane-off"), + ("airplane-plus", "airplane-plus"), + ("airplane-remove", "airplane-remove"), + ("airplane-search", "airplane-search"), + ("airplane-settings", "airplane-settings"), + ("airplane-takeoff", "airplane-takeoff"), + ("airport", "airport"), + ("alarm", "alarm"), + ("alarm-bell", "alarm-bell"), + ("alarm-check", "alarm-check"), + ("alarm-light", "alarm-light"), + ("alarm-light-off", "alarm-light-off"), + ("alarm-light-off-outline", "alarm-light-off-outline"), + ("alarm-light-outline", "alarm-light-outline"), + ("alarm-multiple", "alarm-multiple"), + ("alarm-note", "alarm-note"), + ("alarm-note-off", "alarm-note-off"), + ("alarm-off", "alarm-off"), + ("alarm-panel", "alarm-panel"), + ("alarm-panel-outline", "alarm-panel-outline"), + ("alarm-plus", "alarm-plus"), + ("alarm-snooze", "alarm-snooze"), + ("album", "album"), + ("alert", "alert"), + ("alert-box", "alert-box"), + ("alert-box-outline", "alert-box-outline"), + ("alert-circle", "alert-circle"), + ("alert-circle-check", "alert-circle-check"), + ("alert-circle-check-outline", "alert-circle-check-outline"), + ("alert-circle-outline", "alert-circle-outline"), + ("alert-decagram", "alert-decagram"), + ("alert-decagram-outline", "alert-decagram-outline"), + ("alert-minus", "alert-minus"), + ("alert-minus-outline", "alert-minus-outline"), + ("alert-octagon", "alert-octagon"), + ("alert-octagon-outline", "alert-octagon-outline"), + ("alert-octagram", "alert-octagram"), + ("alert-octagram-outline", "alert-octagram-outline"), + ("alert-outline", "alert-outline"), + ("alert-plus", "alert-plus"), + ("alert-plus-outline", "alert-plus-outline"), + ("alert-remove", "alert-remove"), + ("alert-remove-outline", "alert-remove-outline"), + ("alert-rhombus", "alert-rhombus"), + ("alert-rhombus-outline", "alert-rhombus-outline"), + ("alien", "alien"), + ("alien-outline", "alien-outline"), + ("align-horizontal-center", "align-horizontal-center"), + ("align-horizontal-distribute", "align-horizontal-distribute"), + ("align-horizontal-left", "align-horizontal-left"), + ("align-horizontal-right", "align-horizontal-right"), + ("align-vertical-bottom", "align-vertical-bottom"), + ("align-vertical-center", "align-vertical-center"), + ("align-vertical-distribute", "align-vertical-distribute"), + ("align-vertical-top", "align-vertical-top"), + ("all-inclusive", "all-inclusive"), + ("all-inclusive-box", "all-inclusive-box"), + ("all-inclusive-box-outline", "all-inclusive-box-outline"), + ("allergy", "allergy"), + ("allo", "allo"), + ("alpha", "alpha"), + ("alpha-a", "alpha-a"), + ("alpha-a-box", "alpha-a-box"), + ("alpha-a-box-outline", "alpha-a-box-outline"), + ("alpha-a-circle", "alpha-a-circle"), + ("alpha-a-circle-outline", "alpha-a-circle-outline"), + ("alpha-b", "alpha-b"), + ("alpha-b-box", "alpha-b-box"), + ("alpha-b-box-outline", "alpha-b-box-outline"), + ("alpha-b-circle", "alpha-b-circle"), + ("alpha-b-circle-outline", "alpha-b-circle-outline"), + ("alpha-c", "alpha-c"), + ("alpha-c-box", "alpha-c-box"), + ("alpha-c-box-outline", "alpha-c-box-outline"), + ("alpha-c-circle", "alpha-c-circle"), + ("alpha-c-circle-outline", "alpha-c-circle-outline"), + ("alpha-d", "alpha-d"), + ("alpha-d-box", "alpha-d-box"), + ("alpha-d-box-outline", "alpha-d-box-outline"), + ("alpha-d-circle", "alpha-d-circle"), + ("alpha-d-circle-outline", "alpha-d-circle-outline"), + ("alpha-e", "alpha-e"), + ("alpha-e-box", "alpha-e-box"), + ("alpha-e-box-outline", "alpha-e-box-outline"), + ("alpha-e-circle", "alpha-e-circle"), + ("alpha-e-circle-outline", "alpha-e-circle-outline"), + ("alpha-f", "alpha-f"), + ("alpha-f-box", "alpha-f-box"), + ("alpha-f-box-outline", "alpha-f-box-outline"), + ("alpha-f-circle", "alpha-f-circle"), + ("alpha-f-circle-outline", "alpha-f-circle-outline"), + ("alpha-g", "alpha-g"), + ("alpha-g-box", "alpha-g-box"), + ("alpha-g-box-outline", "alpha-g-box-outline"), + ("alpha-g-circle", "alpha-g-circle"), + ("alpha-g-circle-outline", "alpha-g-circle-outline"), + ("alpha-h", "alpha-h"), + ("alpha-h-box", "alpha-h-box"), + ("alpha-h-box-outline", "alpha-h-box-outline"), + ("alpha-h-circle", "alpha-h-circle"), + ("alpha-h-circle-outline", "alpha-h-circle-outline"), + ("alpha-i", "alpha-i"), + ("alpha-i-box", "alpha-i-box"), + ("alpha-i-box-outline", "alpha-i-box-outline"), + ("alpha-i-circle", "alpha-i-circle"), + ("alpha-i-circle-outline", "alpha-i-circle-outline"), + ("alpha-j", "alpha-j"), + ("alpha-j-box", "alpha-j-box"), + ("alpha-j-box-outline", "alpha-j-box-outline"), + ("alpha-j-circle", "alpha-j-circle"), + ("alpha-j-circle-outline", "alpha-j-circle-outline"), + ("alpha-k", "alpha-k"), + ("alpha-k-box", "alpha-k-box"), + ("alpha-k-box-outline", "alpha-k-box-outline"), + ("alpha-k-circle", "alpha-k-circle"), + ("alpha-k-circle-outline", "alpha-k-circle-outline"), + ("alpha-l", "alpha-l"), + ("alpha-l-box", "alpha-l-box"), + ("alpha-l-box-outline", "alpha-l-box-outline"), + ("alpha-l-circle", "alpha-l-circle"), + ("alpha-l-circle-outline", "alpha-l-circle-outline"), + ("alpha-m", "alpha-m"), + ("alpha-m-box", "alpha-m-box"), + ("alpha-m-box-outline", "alpha-m-box-outline"), + ("alpha-m-circle", "alpha-m-circle"), + ("alpha-m-circle-outline", "alpha-m-circle-outline"), + ("alpha-n", "alpha-n"), + ("alpha-n-box", "alpha-n-box"), + ("alpha-n-box-outline", "alpha-n-box-outline"), + ("alpha-n-circle", "alpha-n-circle"), + ("alpha-n-circle-outline", "alpha-n-circle-outline"), + ("alpha-o", "alpha-o"), + ("alpha-o-box", "alpha-o-box"), + ("alpha-o-box-outline", "alpha-o-box-outline"), + ("alpha-o-circle", "alpha-o-circle"), + ("alpha-o-circle-outline", "alpha-o-circle-outline"), + ("alpha-p", "alpha-p"), + ("alpha-p-box", "alpha-p-box"), + ("alpha-p-box-outline", "alpha-p-box-outline"), + ("alpha-p-circle", "alpha-p-circle"), + ("alpha-p-circle-outline", "alpha-p-circle-outline"), + ("alpha-q", "alpha-q"), + ("alpha-q-box", "alpha-q-box"), + ("alpha-q-box-outline", "alpha-q-box-outline"), + ("alpha-q-circle", "alpha-q-circle"), + ("alpha-q-circle-outline", "alpha-q-circle-outline"), + ("alpha-r", "alpha-r"), + ("alpha-r-box", "alpha-r-box"), + ("alpha-r-box-outline", "alpha-r-box-outline"), + ("alpha-r-circle", "alpha-r-circle"), + ("alpha-r-circle-outline", "alpha-r-circle-outline"), + ("alpha-s", "alpha-s"), + ("alpha-s-box", "alpha-s-box"), + ("alpha-s-box-outline", "alpha-s-box-outline"), + ("alpha-s-circle", "alpha-s-circle"), + ("alpha-s-circle-outline", "alpha-s-circle-outline"), + ("alpha-t", "alpha-t"), + ("alpha-t-box", "alpha-t-box"), + ("alpha-t-box-outline", "alpha-t-box-outline"), + ("alpha-t-circle", "alpha-t-circle"), + ("alpha-t-circle-outline", "alpha-t-circle-outline"), + ("alpha-u", "alpha-u"), + ("alpha-u-box", "alpha-u-box"), + ("alpha-u-box-outline", "alpha-u-box-outline"), + ("alpha-u-circle", "alpha-u-circle"), + ("alpha-u-circle-outline", "alpha-u-circle-outline"), + ("alpha-v", "alpha-v"), + ("alpha-v-box", "alpha-v-box"), + ("alpha-v-box-outline", "alpha-v-box-outline"), + ("alpha-v-circle", "alpha-v-circle"), + ("alpha-v-circle-outline", "alpha-v-circle-outline"), + ("alpha-w", "alpha-w"), + ("alpha-w-box", "alpha-w-box"), + ("alpha-w-box-outline", "alpha-w-box-outline"), + ("alpha-w-circle", "alpha-w-circle"), + ("alpha-w-circle-outline", "alpha-w-circle-outline"), + ("alpha-x", "alpha-x"), + ("alpha-x-box", "alpha-x-box"), + ("alpha-x-box-outline", "alpha-x-box-outline"), + ("alpha-x-circle", "alpha-x-circle"), + ("alpha-x-circle-outline", "alpha-x-circle-outline"), + ("alpha-y", "alpha-y"), + ("alpha-y-box", "alpha-y-box"), + ("alpha-y-box-outline", "alpha-y-box-outline"), + ("alpha-y-circle", "alpha-y-circle"), + ("alpha-y-circle-outline", "alpha-y-circle-outline"), + ("alpha-z", "alpha-z"), + ("alpha-z-box", "alpha-z-box"), + ("alpha-z-box-outline", "alpha-z-box-outline"), + ("alpha-z-circle", "alpha-z-circle"), + ("alpha-z-circle-outline", "alpha-z-circle-outline"), + ("alphabet-aurebesh", "alphabet-aurebesh"), + ("alphabet-cyrillic", "alphabet-cyrillic"), + ("alphabet-greek", "alphabet-greek"), + ("alphabet-latin", "alphabet-latin"), + ("alphabet-piqad", "alphabet-piqad"), + ("alphabet-tengwar", "alphabet-tengwar"), + ("alphabetical", "alphabetical"), + ("alphabetical-off", "alphabetical-off"), + ("alphabetical-variant", "alphabetical-variant"), + ("alphabetical-variant-off", "alphabetical-variant-off"), + ("altimeter", "altimeter"), + ("amazon", "amazon"), + ("amazon-alexa", "amazon-alexa"), + ("amazon-drive", "amazon-drive"), + ("ambulance", "ambulance"), + ("ammunition", "ammunition"), + ("ampersand", "ampersand"), + ("amplifier", "amplifier"), + ("amplifier-off", "amplifier-off"), + ("anchor", "anchor"), + ("android", "android"), + ("android-auto", "android-auto"), + ("android-debug-bridge", "android-debug-bridge"), + ("android-head", "android-head"), + ("android-messages", "android-messages"), + ("android-studio", "android-studio"), + ("angle-acute", "angle-acute"), + ("angle-obtuse", "angle-obtuse"), + ("angle-right", "angle-right"), + ("angular", "angular"), + ("angularjs", "angularjs"), + ("animation", "animation"), + ("animation-outline", "animation-outline"), + ("animation-play", "animation-play"), + ("animation-play-outline", "animation-play-outline"), + ("ansible", "ansible"), + ("antenna", "antenna"), + ("anvil", "anvil"), + ("apache-kafka", "apache-kafka"), + ("api", "api"), + ("api-off", "api-off"), + ("apple", "apple"), + ("apple-finder", "apple-finder"), + ("apple-icloud", "apple-icloud"), + ("apple-ios", "apple-ios"), + ("apple-keyboard-caps", "apple-keyboard-caps"), + ("apple-keyboard-command", "apple-keyboard-command"), + ("apple-keyboard-control", "apple-keyboard-control"), + ("apple-keyboard-option", "apple-keyboard-option"), + ("apple-keyboard-shift", "apple-keyboard-shift"), + ("apple-safari", "apple-safari"), + ("application", "application"), + ("application-array", "application-array"), + ("application-array-outline", "application-array-outline"), + ("application-braces", "application-braces"), + ("application-braces-outline", "application-braces-outline"), + ("application-brackets", "application-brackets"), + ("application-brackets-outline", "application-brackets-outline"), + ("application-cog", "application-cog"), + ("application-cog-outline", "application-cog-outline"), + ("application-edit", "application-edit"), + ("application-edit-outline", "application-edit-outline"), + ("application-export", "application-export"), + ("application-import", "application-import"), + ("application-outline", "application-outline"), + ("application-parentheses", "application-parentheses"), + ("application-parentheses-outline", "application-parentheses-outline"), + ("application-settings", "application-settings"), + ("application-settings-outline", "application-settings-outline"), + ("application-variable", "application-variable"), + ("application-variable-outline", "application-variable-outline"), + ("appnet", "appnet"), + ("approximately-equal", "approximately-equal"), + ("approximately-equal-box", "approximately-equal-box"), + ("apps", "apps"), + ("apps-box", "apps-box"), + ("arch", "arch"), + ("archive", "archive"), + ("archive-alert", "archive-alert"), + ("archive-alert-outline", "archive-alert-outline"), + ("archive-arrow-down", "archive-arrow-down"), + ("archive-arrow-down-outline", "archive-arrow-down-outline"), + ("archive-arrow-up", "archive-arrow-up"), + ("archive-arrow-up-outline", "archive-arrow-up-outline"), + ("archive-cancel", "archive-cancel"), + ("archive-cancel-outline", "archive-cancel-outline"), + ("archive-check", "archive-check"), + ("archive-check-outline", "archive-check-outline"), + ("archive-clock", "archive-clock"), + ("archive-clock-outline", "archive-clock-outline"), + ("archive-cog", "archive-cog"), + ("archive-cog-outline", "archive-cog-outline"), + ("archive-edit", "archive-edit"), + ("archive-edit-outline", "archive-edit-outline"), + ("archive-eye", "archive-eye"), + ("archive-eye-outline", "archive-eye-outline"), + ("archive-lock", "archive-lock"), + ("archive-lock-open", "archive-lock-open"), + ("archive-lock-open-outline", "archive-lock-open-outline"), + ("archive-lock-outline", "archive-lock-outline"), + ("archive-marker", "archive-marker"), + ("archive-marker-outline", "archive-marker-outline"), + ("archive-minus", "archive-minus"), + ("archive-minus-outline", "archive-minus-outline"), + ("archive-music", "archive-music"), + ("archive-music-outline", "archive-music-outline"), + ("archive-off", "archive-off"), + ("archive-off-outline", "archive-off-outline"), + ("archive-outline", "archive-outline"), + ("archive-plus", "archive-plus"), + ("archive-plus-outline", "archive-plus-outline"), + ("archive-refresh", "archive-refresh"), + ("archive-refresh-outline", "archive-refresh-outline"), + ("archive-remove", "archive-remove"), + ("archive-remove-outline", "archive-remove-outline"), + ("archive-search", "archive-search"), + ("archive-search-outline", "archive-search-outline"), + ("archive-settings", "archive-settings"), + ("archive-settings-outline", "archive-settings-outline"), + ("archive-star", "archive-star"), + ("archive-star-outline", "archive-star-outline"), + ("archive-sync", "archive-sync"), + ("archive-sync-outline", "archive-sync-outline"), + ("arm-flex", "arm-flex"), + ("arm-flex-outline", "arm-flex-outline"), + ("arrange-bring-forward", "arrange-bring-forward"), + ("arrange-bring-to-front", "arrange-bring-to-front"), + ("arrange-send-backward", "arrange-send-backward"), + ("arrange-send-to-back", "arrange-send-to-back"), + ("arrow-all", "arrow-all"), + ("arrow-bottom-left", "arrow-bottom-left"), + ("arrow-bottom-left-bold-box", "arrow-bottom-left-bold-box"), + ("arrow-bottom-left-bold-box-outline", "arrow-bottom-left-bold-box-outline"), + ("arrow-bottom-left-bold-outline", "arrow-bottom-left-bold-outline"), + ("arrow-bottom-left-thick", "arrow-bottom-left-thick"), + ("arrow-bottom-left-thin", "arrow-bottom-left-thin"), + ( + "arrow-bottom-left-thin-circle-outline", + "arrow-bottom-left-thin-circle-outline", + ), + ("arrow-bottom-right", "arrow-bottom-right"), + ("arrow-bottom-right-bold-box", "arrow-bottom-right-bold-box"), + ("arrow-bottom-right-bold-box-outline", "arrow-bottom-right-bold-box-outline"), + ("arrow-bottom-right-bold-outline", "arrow-bottom-right-bold-outline"), + ("arrow-bottom-right-thick", "arrow-bottom-right-thick"), + ("arrow-bottom-right-thin", "arrow-bottom-right-thin"), + ( + "arrow-bottom-right-thin-circle-outline", + "arrow-bottom-right-thin-circle-outline", + ), + ("arrow-collapse", "arrow-collapse"), + ("arrow-collapse-all", "arrow-collapse-all"), + ("arrow-collapse-down", "arrow-collapse-down"), + ("arrow-collapse-horizontal", "arrow-collapse-horizontal"), + ("arrow-collapse-left", "arrow-collapse-left"), + ("arrow-collapse-right", "arrow-collapse-right"), + ("arrow-collapse-up", "arrow-collapse-up"), + ("arrow-collapse-vertical", "arrow-collapse-vertical"), + ("arrow-decision", "arrow-decision"), + ("arrow-decision-auto", "arrow-decision-auto"), + ("arrow-decision-auto-outline", "arrow-decision-auto-outline"), + ("arrow-decision-outline", "arrow-decision-outline"), + ("arrow-down", "arrow-down"), + ("arrow-down-bold", "arrow-down-bold"), + ("arrow-down-bold-box", "arrow-down-bold-box"), + ("arrow-down-bold-box-outline", "arrow-down-bold-box-outline"), + ("arrow-down-bold-circle", "arrow-down-bold-circle"), + ("arrow-down-bold-circle-outline", "arrow-down-bold-circle-outline"), + ("arrow-down-bold-hexagon-outline", "arrow-down-bold-hexagon-outline"), + ("arrow-down-bold-outline", "arrow-down-bold-outline"), + ("arrow-down-box", "arrow-down-box"), + ("arrow-down-circle", "arrow-down-circle"), + ("arrow-down-circle-outline", "arrow-down-circle-outline"), + ("arrow-down-drop-circle", "arrow-down-drop-circle"), + ("arrow-down-drop-circle-outline", "arrow-down-drop-circle-outline"), + ("arrow-down-left", "arrow-down-left"), + ("arrow-down-left-bold", "arrow-down-left-bold"), + ("arrow-down-right", "arrow-down-right"), + ("arrow-down-right-bold", "arrow-down-right-bold"), + ("arrow-down-thick", "arrow-down-thick"), + ("arrow-down-thin", "arrow-down-thin"), + ("arrow-down-thin-circle-outline", "arrow-down-thin-circle-outline"), + ("arrow-expand", "arrow-expand"), + ("arrow-expand-all", "arrow-expand-all"), + ("arrow-expand-down", "arrow-expand-down"), + ("arrow-expand-horizontal", "arrow-expand-horizontal"), + ("arrow-expand-left", "arrow-expand-left"), + ("arrow-expand-right", "arrow-expand-right"), + ("arrow-expand-up", "arrow-expand-up"), + ("arrow-expand-vertical", "arrow-expand-vertical"), + ("arrow-horizontal-lock", "arrow-horizontal-lock"), + ("arrow-left", "arrow-left"), + ("arrow-left-bold", "arrow-left-bold"), + ("arrow-left-bold-box", "arrow-left-bold-box"), + ("arrow-left-bold-box-outline", "arrow-left-bold-box-outline"), + ("arrow-left-bold-circle", "arrow-left-bold-circle"), + ("arrow-left-bold-circle-outline", "arrow-left-bold-circle-outline"), + ("arrow-left-bold-hexagon-outline", "arrow-left-bold-hexagon-outline"), + ("arrow-left-bold-outline", "arrow-left-bold-outline"), + ("arrow-left-bottom", "arrow-left-bottom"), + ("arrow-left-bottom-bold", "arrow-left-bottom-bold"), + ("arrow-left-box", "arrow-left-box"), + ("arrow-left-circle", "arrow-left-circle"), + ("arrow-left-circle-outline", "arrow-left-circle-outline"), + ("arrow-left-drop-circle", "arrow-left-drop-circle"), + ("arrow-left-drop-circle-outline", "arrow-left-drop-circle-outline"), + ("arrow-left-right", "arrow-left-right"), + ("arrow-left-right-bold", "arrow-left-right-bold"), + ("arrow-left-right-bold-outline", "arrow-left-right-bold-outline"), + ("arrow-left-thick", "arrow-left-thick"), + ("arrow-left-thin", "arrow-left-thin"), + ("arrow-left-thin-circle-outline", "arrow-left-thin-circle-outline"), + ("arrow-left-top", "arrow-left-top"), + ("arrow-left-top-bold", "arrow-left-top-bold"), + ("arrow-projectile", "arrow-projectile"), + ("arrow-projectile-multiple", "arrow-projectile-multiple"), + ("arrow-right", "arrow-right"), + ("arrow-right-bold", "arrow-right-bold"), + ("arrow-right-bold-box", "arrow-right-bold-box"), + ("arrow-right-bold-box-outline", "arrow-right-bold-box-outline"), + ("arrow-right-bold-circle", "arrow-right-bold-circle"), + ("arrow-right-bold-circle-outline", "arrow-right-bold-circle-outline"), + ("arrow-right-bold-hexagon-outline", "arrow-right-bold-hexagon-outline"), + ("arrow-right-bold-outline", "arrow-right-bold-outline"), + ("arrow-right-bottom", "arrow-right-bottom"), + ("arrow-right-bottom-bold", "arrow-right-bottom-bold"), + ("arrow-right-box", "arrow-right-box"), + ("arrow-right-circle", "arrow-right-circle"), + ("arrow-right-circle-outline", "arrow-right-circle-outline"), + ("arrow-right-drop-circle", "arrow-right-drop-circle"), + ("arrow-right-drop-circle-outline", "arrow-right-drop-circle-outline"), + ("arrow-right-thick", "arrow-right-thick"), + ("arrow-right-thin", "arrow-right-thin"), + ("arrow-right-thin-circle-outline", "arrow-right-thin-circle-outline"), + ("arrow-right-top", "arrow-right-top"), + ("arrow-right-top-bold", "arrow-right-top-bold"), + ("arrow-split-horizontal", "arrow-split-horizontal"), + ("arrow-split-vertical", "arrow-split-vertical"), + ("arrow-top-left", "arrow-top-left"), + ("arrow-top-left-bold-box", "arrow-top-left-bold-box"), + ("arrow-top-left-bold-box-outline", "arrow-top-left-bold-box-outline"), + ("arrow-top-left-bold-outline", "arrow-top-left-bold-outline"), + ("arrow-top-left-bottom-right", "arrow-top-left-bottom-right"), + ("arrow-top-left-bottom-right-bold", "arrow-top-left-bottom-right-bold"), + ("arrow-top-left-thick", "arrow-top-left-thick"), + ("arrow-top-left-thin", "arrow-top-left-thin"), + ("arrow-top-left-thin-circle-outline", "arrow-top-left-thin-circle-outline"), + ("arrow-top-right", "arrow-top-right"), + ("arrow-top-right-bold-box", "arrow-top-right-bold-box"), + ("arrow-top-right-bold-box-outline", "arrow-top-right-bold-box-outline"), + ("arrow-top-right-bold-outline", "arrow-top-right-bold-outline"), + ("arrow-top-right-bottom-left", "arrow-top-right-bottom-left"), + ("arrow-top-right-bottom-left-bold", "arrow-top-right-bottom-left-bold"), + ("arrow-top-right-thick", "arrow-top-right-thick"), + ("arrow-top-right-thin", "arrow-top-right-thin"), + ("arrow-top-right-thin-circle-outline", "arrow-top-right-thin-circle-outline"), + ("arrow-u-down-left", "arrow-u-down-left"), + ("arrow-u-down-left-bold", "arrow-u-down-left-bold"), + ("arrow-u-down-right", "arrow-u-down-right"), + ("arrow-u-down-right-bold", "arrow-u-down-right-bold"), + ("arrow-u-left-bottom", "arrow-u-left-bottom"), + ("arrow-u-left-bottom-bold", "arrow-u-left-bottom-bold"), + ("arrow-u-left-top", "arrow-u-left-top"), + ("arrow-u-left-top-bold", "arrow-u-left-top-bold"), + ("arrow-u-right-bottom", "arrow-u-right-bottom"), + ("arrow-u-right-bottom-bold", "arrow-u-right-bottom-bold"), + ("arrow-u-right-top", "arrow-u-right-top"), + ("arrow-u-right-top-bold", "arrow-u-right-top-bold"), + ("arrow-u-up-left", "arrow-u-up-left"), + ("arrow-u-up-left-bold", "arrow-u-up-left-bold"), + ("arrow-u-up-right", "arrow-u-up-right"), + ("arrow-u-up-right-bold", "arrow-u-up-right-bold"), + ("arrow-up", "arrow-up"), + ("arrow-up-bold", "arrow-up-bold"), + ("arrow-up-bold-box", "arrow-up-bold-box"), + ("arrow-up-bold-box-outline", "arrow-up-bold-box-outline"), + ("arrow-up-bold-circle", "arrow-up-bold-circle"), + ("arrow-up-bold-circle-outline", "arrow-up-bold-circle-outline"), + ("arrow-up-bold-hexagon-outline", "arrow-up-bold-hexagon-outline"), + ("arrow-up-bold-outline", "arrow-up-bold-outline"), + ("arrow-up-box", "arrow-up-box"), + ("arrow-up-circle", "arrow-up-circle"), + ("arrow-up-circle-outline", "arrow-up-circle-outline"), + ("arrow-up-down", "arrow-up-down"), + ("arrow-up-down-bold", "arrow-up-down-bold"), + ("arrow-up-down-bold-outline", "arrow-up-down-bold-outline"), + ("arrow-up-drop-circle", "arrow-up-drop-circle"), + ("arrow-up-drop-circle-outline", "arrow-up-drop-circle-outline"), + ("arrow-up-left", "arrow-up-left"), + ("arrow-up-left-bold", "arrow-up-left-bold"), + ("arrow-up-right", "arrow-up-right"), + ("arrow-up-right-bold", "arrow-up-right-bold"), + ("arrow-up-thick", "arrow-up-thick"), + ("arrow-up-thin", "arrow-up-thin"), + ("arrow-up-thin-circle-outline", "arrow-up-thin-circle-outline"), + ("arrow-vertical-lock", "arrow-vertical-lock"), + ("artboard", "artboard"), + ("artstation", "artstation"), + ("aspect-ratio", "aspect-ratio"), + ("assistant", "assistant"), + ("asterisk", "asterisk"), + ("asterisk-circle-outline", "asterisk-circle-outline"), + ("at", "at"), + ("atlassian", "atlassian"), + ("atm", "atm"), + ("atom", "atom"), + ("atom-variant", "atom-variant"), + ("attachment", "attachment"), + ("attachment-check", "attachment-check"), + ("attachment-lock", "attachment-lock"), + ("attachment-minus", "attachment-minus"), + ("attachment-off", "attachment-off"), + ("attachment-plus", "attachment-plus"), + ("attachment-remove", "attachment-remove"), + ("atv", "atv"), + ("audio-input-rca", "audio-input-rca"), + ("audio-input-stereo-minijack", "audio-input-stereo-minijack"), + ("audio-input-xlr", "audio-input-xlr"), + ("audio-video", "audio-video"), + ("audio-video-off", "audio-video-off"), + ("augmented-reality", "augmented-reality"), + ("aurora", "aurora"), + ("auto-download", "auto-download"), + ("auto-fix", "auto-fix"), + ("auto-upload", "auto-upload"), + ("autorenew", "autorenew"), + ("autorenew-off", "autorenew-off"), + ("av-timer", "av-timer"), + ("awning", "awning"), + ("awning-outline", "awning-outline"), + ("aws", "aws"), + ("axe", "axe"), + ("axe-battle", "axe-battle"), + ("axis", "axis"), + ("axis-arrow", "axis-arrow"), + ("axis-arrow-info", "axis-arrow-info"), + ("axis-arrow-lock", "axis-arrow-lock"), + ("axis-lock", "axis-lock"), + ("axis-x-arrow", "axis-x-arrow"), + ("axis-x-arrow-lock", "axis-x-arrow-lock"), + ("axis-x-rotate-clockwise", "axis-x-rotate-clockwise"), + ("axis-x-rotate-counterclockwise", "axis-x-rotate-counterclockwise"), + ("axis-x-y-arrow-lock", "axis-x-y-arrow-lock"), + ("axis-y-arrow", "axis-y-arrow"), + ("axis-y-arrow-lock", "axis-y-arrow-lock"), + ("axis-y-rotate-clockwise", "axis-y-rotate-clockwise"), + ("axis-y-rotate-counterclockwise", "axis-y-rotate-counterclockwise"), + ("axis-z-arrow", "axis-z-arrow"), + ("axis-z-arrow-lock", "axis-z-arrow-lock"), + ("axis-z-rotate-clockwise", "axis-z-rotate-clockwise"), + ("axis-z-rotate-counterclockwise", "axis-z-rotate-counterclockwise"), + ("babel", "babel"), + ("baby", "baby"), + ("baby-bottle", "baby-bottle"), + ("baby-bottle-outline", "baby-bottle-outline"), + ("baby-buggy", "baby-buggy"), + ("baby-buggy-off", "baby-buggy-off"), + ("baby-carriage", "baby-carriage"), + ("baby-carriage-off", "baby-carriage-off"), + ("baby-face", "baby-face"), + ("baby-face-outline", "baby-face-outline"), + ("backburger", "backburger"), + ("backspace", "backspace"), + ("backspace-outline", "backspace-outline"), + ("backspace-reverse", "backspace-reverse"), + ("backspace-reverse-outline", "backspace-reverse-outline"), + ("backup-restore", "backup-restore"), + ("bacteria", "bacteria"), + ("bacteria-outline", "bacteria-outline"), + ("badge-account", "badge-account"), + ("badge-account-alert", "badge-account-alert"), + ("badge-account-alert-outline", "badge-account-alert-outline"), + ("badge-account-horizontal", "badge-account-horizontal"), + ("badge-account-horizontal-outline", "badge-account-horizontal-outline"), + ("badge-account-outline", "badge-account-outline"), + ("badminton", "badminton"), + ("bag-carry-on", "bag-carry-on"), + ("bag-carry-on-check", "bag-carry-on-check"), + ("bag-carry-on-off", "bag-carry-on-off"), + ("bag-checked", "bag-checked"), + ("bag-personal", "bag-personal"), + ("bag-personal-off", "bag-personal-off"), + ("bag-personal-off-outline", "bag-personal-off-outline"), + ("bag-personal-outline", "bag-personal-outline"), + ("bag-personal-tag", "bag-personal-tag"), + ("bag-personal-tag-outline", "bag-personal-tag-outline"), + ("bag-suitcase", "bag-suitcase"), + ("bag-suitcase-off", "bag-suitcase-off"), + ("bag-suitcase-off-outline", "bag-suitcase-off-outline"), + ("bag-suitcase-outline", "bag-suitcase-outline"), + ("baguette", "baguette"), + ("balcony", "balcony"), + ("balloon", "balloon"), + ("ballot", "ballot"), + ("ballot-outline", "ballot-outline"), + ("ballot-recount", "ballot-recount"), + ("ballot-recount-outline", "ballot-recount-outline"), + ("bandage", "bandage"), + ("bandcamp", "bandcamp"), + ("bank", "bank"), + ("bank-check", "bank-check"), + ("bank-circle", "bank-circle"), + ("bank-circle-outline", "bank-circle-outline"), + ("bank-minus", "bank-minus"), + ("bank-off", "bank-off"), + ("bank-off-outline", "bank-off-outline"), + ("bank-outline", "bank-outline"), + ("bank-plus", "bank-plus"), + ("bank-remove", "bank-remove"), + ("bank-transfer", "bank-transfer"), + ("bank-transfer-in", "bank-transfer-in"), + ("bank-transfer-out", "bank-transfer-out"), + ("barcode", "barcode"), + ("barcode-off", "barcode-off"), + ("barcode-scan", "barcode-scan"), + ("barley", "barley"), + ("barley-off", "barley-off"), + ("barn", "barn"), + ("barrel", "barrel"), + ("barrel-outline", "barrel-outline"), + ("baseball", "baseball"), + ("baseball-bat", "baseball-bat"), + ("baseball-diamond", "baseball-diamond"), + ("baseball-diamond-outline", "baseball-diamond-outline"), + ("basecamp", "basecamp"), + ("bash", "bash"), + ("basket", "basket"), + ("basket-check", "basket-check"), + ("basket-check-outline", "basket-check-outline"), + ("basket-fill", "basket-fill"), + ("basket-minus", "basket-minus"), + ("basket-minus-outline", "basket-minus-outline"), + ("basket-off", "basket-off"), + ("basket-off-outline", "basket-off-outline"), + ("basket-outline", "basket-outline"), + ("basket-plus", "basket-plus"), + ("basket-plus-outline", "basket-plus-outline"), + ("basket-remove", "basket-remove"), + ("basket-remove-outline", "basket-remove-outline"), + ("basket-unfill", "basket-unfill"), + ("basketball", "basketball"), + ("basketball-hoop", "basketball-hoop"), + ("basketball-hoop-outline", "basketball-hoop-outline"), + ("bat", "bat"), + ("bathtub", "bathtub"), + ("bathtub-outline", "bathtub-outline"), + ("battery", "battery"), + ("battery-10", "battery-10"), + ("battery-10-bluetooth", "battery-10-bluetooth"), + ("battery-20", "battery-20"), + ("battery-20-bluetooth", "battery-20-bluetooth"), + ("battery-30", "battery-30"), + ("battery-30-bluetooth", "battery-30-bluetooth"), + ("battery-40", "battery-40"), + ("battery-40-bluetooth", "battery-40-bluetooth"), + ("battery-50", "battery-50"), + ("battery-50-bluetooth", "battery-50-bluetooth"), + ("battery-60", "battery-60"), + ("battery-60-bluetooth", "battery-60-bluetooth"), + ("battery-70", "battery-70"), + ("battery-70-bluetooth", "battery-70-bluetooth"), + ("battery-80", "battery-80"), + ("battery-80-bluetooth", "battery-80-bluetooth"), + ("battery-90", "battery-90"), + ("battery-90-bluetooth", "battery-90-bluetooth"), + ("battery-alert", "battery-alert"), + ("battery-alert-bluetooth", "battery-alert-bluetooth"), + ("battery-alert-variant", "battery-alert-variant"), + ("battery-alert-variant-outline", "battery-alert-variant-outline"), + ("battery-arrow-down", "battery-arrow-down"), + ("battery-arrow-down-outline", "battery-arrow-down-outline"), + ("battery-arrow-up", "battery-arrow-up"), + ("battery-arrow-up-outline", "battery-arrow-up-outline"), + ("battery-bluetooth", "battery-bluetooth"), + ("battery-bluetooth-variant", "battery-bluetooth-variant"), + ("battery-charging", "battery-charging"), + ("battery-charging-10", "battery-charging-10"), + ("battery-charging-100", "battery-charging-100"), + ("battery-charging-20", "battery-charging-20"), + ("battery-charging-30", "battery-charging-30"), + ("battery-charging-40", "battery-charging-40"), + ("battery-charging-50", "battery-charging-50"), + ("battery-charging-60", "battery-charging-60"), + ("battery-charging-70", "battery-charging-70"), + ("battery-charging-80", "battery-charging-80"), + ("battery-charging-90", "battery-charging-90"), + ("battery-charging-high", "battery-charging-high"), + ("battery-charging-low", "battery-charging-low"), + ("battery-charging-medium", "battery-charging-medium"), + ("battery-charging-outline", "battery-charging-outline"), + ("battery-charging-wireless", "battery-charging-wireless"), + ("battery-charging-wireless-10", "battery-charging-wireless-10"), + ("battery-charging-wireless-20", "battery-charging-wireless-20"), + ("battery-charging-wireless-30", "battery-charging-wireless-30"), + ("battery-charging-wireless-40", "battery-charging-wireless-40"), + ("battery-charging-wireless-50", "battery-charging-wireless-50"), + ("battery-charging-wireless-60", "battery-charging-wireless-60"), + ("battery-charging-wireless-70", "battery-charging-wireless-70"), + ("battery-charging-wireless-80", "battery-charging-wireless-80"), + ("battery-charging-wireless-90", "battery-charging-wireless-90"), + ("battery-charging-wireless-alert", "battery-charging-wireless-alert"), + ("battery-charging-wireless-outline", "battery-charging-wireless-outline"), + ("battery-check", "battery-check"), + ("battery-check-outline", "battery-check-outline"), + ("battery-clock", "battery-clock"), + ("battery-clock-outline", "battery-clock-outline"), + ("battery-heart", "battery-heart"), + ("battery-heart-outline", "battery-heart-outline"), + ("battery-heart-variant", "battery-heart-variant"), + ("battery-high", "battery-high"), + ("battery-lock", "battery-lock"), + ("battery-lock-open", "battery-lock-open"), + ("battery-low", "battery-low"), + ("battery-medium", "battery-medium"), + ("battery-minus", "battery-minus"), + ("battery-minus-outline", "battery-minus-outline"), + ("battery-minus-variant", "battery-minus-variant"), + ("battery-negative", "battery-negative"), + ("battery-off", "battery-off"), + ("battery-off-outline", "battery-off-outline"), + ("battery-outline", "battery-outline"), + ("battery-plus", "battery-plus"), + ("battery-plus-outline", "battery-plus-outline"), + ("battery-plus-variant", "battery-plus-variant"), + ("battery-positive", "battery-positive"), + ("battery-remove", "battery-remove"), + ("battery-remove-outline", "battery-remove-outline"), + ("battery-standard", "battery-standard"), + ("battery-sync", "battery-sync"), + ("battery-sync-outline", "battery-sync-outline"), + ("battery-unknown", "battery-unknown"), + ("battery-unknown-bluetooth", "battery-unknown-bluetooth"), + ("battlenet", "battlenet"), + ("beach", "beach"), + ("beaker", "beaker"), + ("beaker-alert", "beaker-alert"), + ("beaker-alert-outline", "beaker-alert-outline"), + ("beaker-check", "beaker-check"), + ("beaker-check-outline", "beaker-check-outline"), + ("beaker-minus", "beaker-minus"), + ("beaker-minus-outline", "beaker-minus-outline"), + ("beaker-outline", "beaker-outline"), + ("beaker-plus", "beaker-plus"), + ("beaker-plus-outline", "beaker-plus-outline"), + ("beaker-question", "beaker-question"), + ("beaker-question-outline", "beaker-question-outline"), + ("beaker-remove", "beaker-remove"), + ("beaker-remove-outline", "beaker-remove-outline"), + ("beam", "beam"), + ("beats", "beats"), + ("bed", "bed"), + ("bed-clock", "bed-clock"), + ("bed-double", "bed-double"), + ("bed-double-outline", "bed-double-outline"), + ("bed-empty", "bed-empty"), + ("bed-king", "bed-king"), + ("bed-king-outline", "bed-king-outline"), + ("bed-outline", "bed-outline"), + ("bed-queen", "bed-queen"), + ("bed-queen-outline", "bed-queen-outline"), + ("bed-single", "bed-single"), + ("bed-single-outline", "bed-single-outline"), + ("bee", "bee"), + ("bee-flower", "bee-flower"), + ("beehive-off-outline", "beehive-off-outline"), + ("beehive-outline", "beehive-outline"), + ("beekeeper", "beekeeper"), + ("beer", "beer"), + ("beer-outline", "beer-outline"), + ("behance", "behance"), + ("bell", "bell"), + ("bell-alert", "bell-alert"), + ("bell-alert-outline", "bell-alert-outline"), + ("bell-badge", "bell-badge"), + ("bell-badge-outline", "bell-badge-outline"), + ("bell-cancel", "bell-cancel"), + ("bell-cancel-outline", "bell-cancel-outline"), + ("bell-check", "bell-check"), + ("bell-check-outline", "bell-check-outline"), + ("bell-circle", "bell-circle"), + ("bell-circle-outline", "bell-circle-outline"), + ("bell-cog", "bell-cog"), + ("bell-cog-outline", "bell-cog-outline"), + ("bell-minus", "bell-minus"), + ("bell-minus-outline", "bell-minus-outline"), + ("bell-off", "bell-off"), + ("bell-off-outline", "bell-off-outline"), + ("bell-outline", "bell-outline"), + ("bell-plus", "bell-plus"), + ("bell-plus-outline", "bell-plus-outline"), + ("bell-remove", "bell-remove"), + ("bell-remove-outline", "bell-remove-outline"), + ("bell-ring", "bell-ring"), + ("bell-ring-outline", "bell-ring-outline"), + ("bell-sleep", "bell-sleep"), + ("bell-sleep-outline", "bell-sleep-outline"), + ("beta", "beta"), + ("betamax", "betamax"), + ("biathlon", "biathlon"), + ("bicycle", "bicycle"), + ("bicycle-basket", "bicycle-basket"), + ("bicycle-cargo", "bicycle-cargo"), + ("bicycle-electric", "bicycle-electric"), + ("bicycle-penny-farthing", "bicycle-penny-farthing"), + ("bike", "bike"), + ("bike-fast", "bike-fast"), + ("billboard", "billboard"), + ("billiards", "billiards"), + ("billiards-rack", "billiards-rack"), + ("binoculars", "binoculars"), + ("bio", "bio"), + ("biohazard", "biohazard"), + ("bird", "bird"), + ("bitbucket", "bitbucket"), + ("bitcoin", "bitcoin"), + ("black-mesa", "black-mesa"), + ("blackberry", "blackberry"), + ("blender", "blender"), + ("blender-outline", "blender-outline"), + ("blender-software", "blender-software"), + ("blinds", "blinds"), + ("blinds-horizontal", "blinds-horizontal"), + ("blinds-horizontal-closed", "blinds-horizontal-closed"), + ("blinds-open", "blinds-open"), + ("blinds-vertical", "blinds-vertical"), + ("blinds-vertical-closed", "blinds-vertical-closed"), + ("block-helper", "block-helper"), + ("blogger", "blogger"), + ("blood-bag", "blood-bag"), + ("bluetooth", "bluetooth"), + ("bluetooth-audio", "bluetooth-audio"), + ("bluetooth-connect", "bluetooth-connect"), + ("bluetooth-off", "bluetooth-off"), + ("bluetooth-settings", "bluetooth-settings"), + ("bluetooth-transfer", "bluetooth-transfer"), + ("blur", "blur"), + ("blur-linear", "blur-linear"), + ("blur-off", "blur-off"), + ("blur-radial", "blur-radial"), + ("bolt", "bolt"), + ("bomb", "bomb"), + ("bomb-off", "bomb-off"), + ("bone", "bone"), + ("bone-off", "bone-off"), + ("book", "book"), + ("book-account", "book-account"), + ("book-account-outline", "book-account-outline"), + ("book-alert", "book-alert"), + ("book-alert-outline", "book-alert-outline"), + ("book-alphabet", "book-alphabet"), + ("book-arrow-down", "book-arrow-down"), + ("book-arrow-down-outline", "book-arrow-down-outline"), + ("book-arrow-left", "book-arrow-left"), + ("book-arrow-left-outline", "book-arrow-left-outline"), + ("book-arrow-right", "book-arrow-right"), + ("book-arrow-right-outline", "book-arrow-right-outline"), + ("book-arrow-up", "book-arrow-up"), + ("book-arrow-up-outline", "book-arrow-up-outline"), + ("book-cancel", "book-cancel"), + ("book-cancel-outline", "book-cancel-outline"), + ("book-check", "book-check"), + ("book-check-outline", "book-check-outline"), + ("book-clock", "book-clock"), + ("book-clock-outline", "book-clock-outline"), + ("book-cog", "book-cog"), + ("book-cog-outline", "book-cog-outline"), + ("book-cross", "book-cross"), + ("book-edit", "book-edit"), + ("book-edit-outline", "book-edit-outline"), + ("book-education", "book-education"), + ("book-education-outline", "book-education-outline"), + ("book-heart", "book-heart"), + ("book-heart-outline", "book-heart-outline"), + ("book-information-variant", "book-information-variant"), + ("book-lock", "book-lock"), + ("book-lock-open", "book-lock-open"), + ("book-lock-open-outline", "book-lock-open-outline"), + ("book-lock-outline", "book-lock-outline"), + ("book-marker", "book-marker"), + ("book-marker-outline", "book-marker-outline"), + ("book-minus", "book-minus"), + ("book-minus-multiple", "book-minus-multiple"), + ("book-minus-multiple-outline", "book-minus-multiple-outline"), + ("book-minus-outline", "book-minus-outline"), + ("book-multiple", "book-multiple"), + ("book-multiple-minus", "book-multiple-minus"), + ("book-multiple-outline", "book-multiple-outline"), + ("book-multiple-plus", "book-multiple-plus"), + ("book-multiple-remove", "book-multiple-remove"), + ("book-multiple-variant", "book-multiple-variant"), + ("book-music", "book-music"), + ("book-music-outline", "book-music-outline"), + ("book-off", "book-off"), + ("book-off-outline", "book-off-outline"), + ("book-open", "book-open"), + ("book-open-blank-variant", "book-open-blank-variant"), + ("book-open-outline", "book-open-outline"), + ("book-open-page-variant", "book-open-page-variant"), + ("book-open-page-variant-outline", "book-open-page-variant-outline"), + ("book-open-variant", "book-open-variant"), + ("book-outline", "book-outline"), + ("book-play", "book-play"), + ("book-play-outline", "book-play-outline"), + ("book-plus", "book-plus"), + ("book-plus-multiple", "book-plus-multiple"), + ("book-plus-multiple-outline", "book-plus-multiple-outline"), + ("book-plus-outline", "book-plus-outline"), + ("book-refresh", "book-refresh"), + ("book-refresh-outline", "book-refresh-outline"), + ("book-remove", "book-remove"), + ("book-remove-multiple", "book-remove-multiple"), + ("book-remove-multiple-outline", "book-remove-multiple-outline"), + ("book-remove-outline", "book-remove-outline"), + ("book-search", "book-search"), + ("book-search-outline", "book-search-outline"), + ("book-settings", "book-settings"), + ("book-settings-outline", "book-settings-outline"), + ("book-sync", "book-sync"), + ("book-sync-outline", "book-sync-outline"), + ("book-variant", "book-variant"), + ("book-variant-multiple", "book-variant-multiple"), + ("bookmark", "bookmark"), + ("bookmark-box", "bookmark-box"), + ("bookmark-box-multiple", "bookmark-box-multiple"), + ("bookmark-box-multiple-outline", "bookmark-box-multiple-outline"), + ("bookmark-box-outline", "bookmark-box-outline"), + ("bookmark-check", "bookmark-check"), + ("bookmark-check-outline", "bookmark-check-outline"), + ("bookmark-minus", "bookmark-minus"), + ("bookmark-minus-outline", "bookmark-minus-outline"), + ("bookmark-multiple", "bookmark-multiple"), + ("bookmark-multiple-outline", "bookmark-multiple-outline"), + ("bookmark-music", "bookmark-music"), + ("bookmark-music-outline", "bookmark-music-outline"), + ("bookmark-off", "bookmark-off"), + ("bookmark-off-outline", "bookmark-off-outline"), + ("bookmark-outline", "bookmark-outline"), + ("bookmark-plus", "bookmark-plus"), + ("bookmark-plus-outline", "bookmark-plus-outline"), + ("bookmark-remove", "bookmark-remove"), + ("bookmark-remove-outline", "bookmark-remove-outline"), + ("bookshelf", "bookshelf"), + ("boom-gate", "boom-gate"), + ("boom-gate-alert", "boom-gate-alert"), + ("boom-gate-alert-outline", "boom-gate-alert-outline"), + ("boom-gate-arrow-down", "boom-gate-arrow-down"), + ("boom-gate-arrow-down-outline", "boom-gate-arrow-down-outline"), + ("boom-gate-arrow-up", "boom-gate-arrow-up"), + ("boom-gate-arrow-up-outline", "boom-gate-arrow-up-outline"), + ("boom-gate-outline", "boom-gate-outline"), + ("boom-gate-up", "boom-gate-up"), + ("boom-gate-up-outline", "boom-gate-up-outline"), + ("boombox", "boombox"), + ("boomerang", "boomerang"), + ("bootstrap", "bootstrap"), + ("border-all", "border-all"), + ("border-all-variant", "border-all-variant"), + ("border-bottom", "border-bottom"), + ("border-bottom-variant", "border-bottom-variant"), + ("border-color", "border-color"), + ("border-horizontal", "border-horizontal"), + ("border-inside", "border-inside"), + ("border-left", "border-left"), + ("border-left-variant", "border-left-variant"), + ("border-none", "border-none"), + ("border-none-variant", "border-none-variant"), + ("border-outside", "border-outside"), + ("border-radius", "border-radius"), + ("border-right", "border-right"), + ("border-right-variant", "border-right-variant"), + ("border-style", "border-style"), + ("border-top", "border-top"), + ("border-top-variant", "border-top-variant"), + ("border-vertical", "border-vertical"), + ("bottle-soda", "bottle-soda"), + ("bottle-soda-classic", "bottle-soda-classic"), + ("bottle-soda-classic-outline", "bottle-soda-classic-outline"), + ("bottle-soda-outline", "bottle-soda-outline"), + ("bottle-tonic", "bottle-tonic"), + ("bottle-tonic-outline", "bottle-tonic-outline"), + ("bottle-tonic-plus", "bottle-tonic-plus"), + ("bottle-tonic-plus-outline", "bottle-tonic-plus-outline"), + ("bottle-tonic-skull", "bottle-tonic-skull"), + ("bottle-tonic-skull-outline", "bottle-tonic-skull-outline"), + ("bottle-wine", "bottle-wine"), + ("bottle-wine-outline", "bottle-wine-outline"), + ("bow-arrow", "bow-arrow"), + ("bow-tie", "bow-tie"), + ("bowl", "bowl"), + ("bowl-mix", "bowl-mix"), + ("bowl-mix-outline", "bowl-mix-outline"), + ("bowl-outline", "bowl-outline"), + ("bowling", "bowling"), + ("box", "box"), + ("box-cutter", "box-cutter"), + ("box-cutter-off", "box-cutter-off"), + ("box-download", "box-download"), + ("box-shadow", "box-shadow"), + ("box-upload", "box-upload"), + ("boxing-glove", "boxing-glove"), + ("boxing-gloves", "boxing-gloves"), + ("braille", "braille"), + ("brain", "brain"), + ("bread-slice", "bread-slice"), + ("bread-slice-outline", "bread-slice-outline"), + ("bridge", "bridge"), + ("briefcase", "briefcase"), + ("briefcase-account", "briefcase-account"), + ("briefcase-account-outline", "briefcase-account-outline"), + ("briefcase-arrow-left-right", "briefcase-arrow-left-right"), + ("briefcase-arrow-left-right-outline", "briefcase-arrow-left-right-outline"), + ("briefcase-arrow-up-down", "briefcase-arrow-up-down"), + ("briefcase-arrow-up-down-outline", "briefcase-arrow-up-down-outline"), + ("briefcase-check", "briefcase-check"), + ("briefcase-check-outline", "briefcase-check-outline"), + ("briefcase-clock", "briefcase-clock"), + ("briefcase-clock-outline", "briefcase-clock-outline"), + ("briefcase-download", "briefcase-download"), + ("briefcase-download-outline", "briefcase-download-outline"), + ("briefcase-edit", "briefcase-edit"), + ("briefcase-edit-outline", "briefcase-edit-outline"), + ("briefcase-eye", "briefcase-eye"), + ("briefcase-eye-outline", "briefcase-eye-outline"), + ("briefcase-minus", "briefcase-minus"), + ("briefcase-minus-outline", "briefcase-minus-outline"), + ("briefcase-off", "briefcase-off"), + ("briefcase-off-outline", "briefcase-off-outline"), + ("briefcase-outline", "briefcase-outline"), + ("briefcase-plus", "briefcase-plus"), + ("briefcase-plus-outline", "briefcase-plus-outline"), + ("briefcase-remove", "briefcase-remove"), + ("briefcase-remove-outline", "briefcase-remove-outline"), + ("briefcase-search", "briefcase-search"), + ("briefcase-search-outline", "briefcase-search-outline"), + ("briefcase-upload", "briefcase-upload"), + ("briefcase-upload-outline", "briefcase-upload-outline"), + ("briefcase-variant", "briefcase-variant"), + ("briefcase-variant-off", "briefcase-variant-off"), + ("briefcase-variant-off-outline", "briefcase-variant-off-outline"), + ("briefcase-variant-outline", "briefcase-variant-outline"), + ("brightness", "brightness"), + ("brightness-1", "brightness-1"), + ("brightness-2", "brightness-2"), + ("brightness-3", "brightness-3"), + ("brightness-4", "brightness-4"), + ("brightness-5", "brightness-5"), + ("brightness-6", "brightness-6"), + ("brightness-7", "brightness-7"), + ("brightness-auto", "brightness-auto"), + ("brightness-percent", "brightness-percent"), + ("broadcast", "broadcast"), + ("broadcast-off", "broadcast-off"), + ("broom", "broom"), + ("brush", "brush"), + ("brush-off", "brush-off"), + ("brush-outline", "brush-outline"), + ("brush-variant", "brush-variant"), + ("bucket", "bucket"), + ("bucket-outline", "bucket-outline"), + ("buffer", "buffer"), + ("buffet", "buffet"), + ("bug", "bug"), + ("bug-check", "bug-check"), + ("bug-check-outline", "bug-check-outline"), + ("bug-outline", "bug-outline"), + ("bug-pause", "bug-pause"), + ("bug-pause-outline", "bug-pause-outline"), + ("bug-play", "bug-play"), + ("bug-play-outline", "bug-play-outline"), + ("bug-stop", "bug-stop"), + ("bug-stop-outline", "bug-stop-outline"), + ("bugle", "bugle"), + ("bulkhead-light", "bulkhead-light"), + ("bulldozer", "bulldozer"), + ("bullet", "bullet"), + ("bulletin-board", "bulletin-board"), + ("bullhorn", "bullhorn"), + ("bullhorn-outline", "bullhorn-outline"), + ("bullhorn-variant", "bullhorn-variant"), + ("bullhorn-variant-outline", "bullhorn-variant-outline"), + ("bullseye", "bullseye"), + ("bullseye-arrow", "bullseye-arrow"), + ("bulma", "bulma"), + ("bunk-bed", "bunk-bed"), + ("bunk-bed-outline", "bunk-bed-outline"), + ("bus", "bus"), + ("bus-alert", "bus-alert"), + ("bus-articulated-end", "bus-articulated-end"), + ("bus-articulated-front", "bus-articulated-front"), + ("bus-clock", "bus-clock"), + ("bus-double-decker", "bus-double-decker"), + ("bus-electric", "bus-electric"), + ("bus-marker", "bus-marker"), + ("bus-multiple", "bus-multiple"), + ("bus-school", "bus-school"), + ("bus-side", "bus-side"), + ("bus-stop", "bus-stop"), + ("bus-stop-covered", "bus-stop-covered"), + ("bus-stop-uncovered", "bus-stop-uncovered"), + ("butterfly", "butterfly"), + ("butterfly-outline", "butterfly-outline"), + ("button-cursor", "button-cursor"), + ("button-pointer", "button-pointer"), + ("cabin-a-frame", "cabin-a-frame"), + ("cable-data", "cable-data"), + ("cached", "cached"), + ("cactus", "cactus"), + ("cake", "cake"), + ("cake-layered", "cake-layered"), + ("cake-variant", "cake-variant"), + ("cake-variant-outline", "cake-variant-outline"), + ("calculator", "calculator"), + ("calculator-off", "calculator-off"), + ("calculator-variant", "calculator-variant"), + ("calculator-variant-outline", "calculator-variant-outline"), + ("calendar", "calendar"), + ("calendar-account", "calendar-account"), + ("calendar-account-outline", "calendar-account-outline"), + ("calendar-alert", "calendar-alert"), + ("calendar-alert-outline", "calendar-alert-outline"), + ("calendar-arrow-left", "calendar-arrow-left"), + ("calendar-arrow-right", "calendar-arrow-right"), + ("calendar-badge", "calendar-badge"), + ("calendar-badge-outline", "calendar-badge-outline"), + ("calendar-blank", "calendar-blank"), + ("calendar-blank-multiple", "calendar-blank-multiple"), + ("calendar-blank-outline", "calendar-blank-outline"), + ("calendar-check", "calendar-check"), + ("calendar-check-outline", "calendar-check-outline"), + ("calendar-clock", "calendar-clock"), + ("calendar-clock-outline", "calendar-clock-outline"), + ("calendar-collapse-horizontal", "calendar-collapse-horizontal"), + ( + "calendar-collapse-horizontal-outline", + "calendar-collapse-horizontal-outline", + ), + ("calendar-cursor", "calendar-cursor"), + ("calendar-cursor-outline", "calendar-cursor-outline"), + ("calendar-edit", "calendar-edit"), + ("calendar-edit-outline", "calendar-edit-outline"), + ("calendar-end", "calendar-end"), + ("calendar-end-outline", "calendar-end-outline"), + ("calendar-expand-horizontal", "calendar-expand-horizontal"), + ("calendar-expand-horizontal-outline", "calendar-expand-horizontal-outline"), + ("calendar-export", "calendar-export"), + ("calendar-export-outline", "calendar-export-outline"), + ("calendar-filter", "calendar-filter"), + ("calendar-filter-outline", "calendar-filter-outline"), + ("calendar-heart", "calendar-heart"), + ("calendar-heart-outline", "calendar-heart-outline"), + ("calendar-import", "calendar-import"), + ("calendar-import-outline", "calendar-import-outline"), + ("calendar-lock", "calendar-lock"), + ("calendar-lock-open", "calendar-lock-open"), + ("calendar-lock-open-outline", "calendar-lock-open-outline"), + ("calendar-lock-outline", "calendar-lock-outline"), + ("calendar-minus", "calendar-minus"), + ("calendar-minus-outline", "calendar-minus-outline"), + ("calendar-month", "calendar-month"), + ("calendar-month-outline", "calendar-month-outline"), + ("calendar-multiple", "calendar-multiple"), + ("calendar-multiple-check", "calendar-multiple-check"), + ("calendar-multiselect", "calendar-multiselect"), + ("calendar-multiselect-outline", "calendar-multiselect-outline"), + ("calendar-outline", "calendar-outline"), + ("calendar-plus", "calendar-plus"), + ("calendar-plus-outline", "calendar-plus-outline"), + ("calendar-question", "calendar-question"), + ("calendar-question-outline", "calendar-question-outline"), + ("calendar-range", "calendar-range"), + ("calendar-range-outline", "calendar-range-outline"), + ("calendar-refresh", "calendar-refresh"), + ("calendar-refresh-outline", "calendar-refresh-outline"), + ("calendar-remove", "calendar-remove"), + ("calendar-remove-outline", "calendar-remove-outline"), + ("calendar-search", "calendar-search"), + ("calendar-search-outline", "calendar-search-outline"), + ("calendar-select", "calendar-select"), + ("calendar-star", "calendar-star"), + ("calendar-star-outline", "calendar-star-outline"), + ("calendar-start", "calendar-start"), + ("calendar-start-outline", "calendar-start-outline"), + ("calendar-sync", "calendar-sync"), + ("calendar-sync-outline", "calendar-sync-outline"), + ("calendar-text", "calendar-text"), + ("calendar-text-outline", "calendar-text-outline"), + ("calendar-today", "calendar-today"), + ("calendar-today-outline", "calendar-today-outline"), + ("calendar-week", "calendar-week"), + ("calendar-week-begin", "calendar-week-begin"), + ("calendar-week-begin-outline", "calendar-week-begin-outline"), + ("calendar-week-end", "calendar-week-end"), + ("calendar-week-end-outline", "calendar-week-end-outline"), + ("calendar-week-outline", "calendar-week-outline"), + ("calendar-weekend", "calendar-weekend"), + ("calendar-weekend-outline", "calendar-weekend-outline"), + ("call-made", "call-made"), + ("call-merge", "call-merge"), + ("call-missed", "call-missed"), + ("call-received", "call-received"), + ("call-split", "call-split"), + ("camcorder", "camcorder"), + ("camcorder-off", "camcorder-off"), + ("camera", "camera"), + ("camera-account", "camera-account"), + ("camera-burst", "camera-burst"), + ("camera-control", "camera-control"), + ("camera-document", "camera-document"), + ("camera-document-off", "camera-document-off"), + ("camera-enhance", "camera-enhance"), + ("camera-enhance-outline", "camera-enhance-outline"), + ("camera-flip", "camera-flip"), + ("camera-flip-outline", "camera-flip-outline"), + ("camera-focus", "camera-focus"), + ("camera-front", "camera-front"), + ("camera-front-variant", "camera-front-variant"), + ("camera-gopro", "camera-gopro"), + ("camera-image", "camera-image"), + ("camera-iris", "camera-iris"), + ("camera-lock", "camera-lock"), + ("camera-lock-open", "camera-lock-open"), + ("camera-lock-open-outline", "camera-lock-open-outline"), + ("camera-lock-outline", "camera-lock-outline"), + ("camera-marker", "camera-marker"), + ("camera-marker-outline", "camera-marker-outline"), + ("camera-metering-center", "camera-metering-center"), + ("camera-metering-matrix", "camera-metering-matrix"), + ("camera-metering-partial", "camera-metering-partial"), + ("camera-metering-spot", "camera-metering-spot"), + ("camera-off", "camera-off"), + ("camera-off-outline", "camera-off-outline"), + ("camera-outline", "camera-outline"), + ("camera-party-mode", "camera-party-mode"), + ("camera-plus", "camera-plus"), + ("camera-plus-outline", "camera-plus-outline"), + ("camera-rear", "camera-rear"), + ("camera-rear-variant", "camera-rear-variant"), + ("camera-retake", "camera-retake"), + ("camera-retake-outline", "camera-retake-outline"), + ("camera-switch", "camera-switch"), + ("camera-switch-outline", "camera-switch-outline"), + ("camera-timer", "camera-timer"), + ("camera-wireless", "camera-wireless"), + ("camera-wireless-outline", "camera-wireless-outline"), + ("campfire", "campfire"), + ("cancel", "cancel"), + ("candelabra", "candelabra"), + ("candelabra-fire", "candelabra-fire"), + ("candle", "candle"), + ("candy", "candy"), + ("candy-off", "candy-off"), + ("candy-off-outline", "candy-off-outline"), + ("candy-outline", "candy-outline"), + ("candycane", "candycane"), + ("cannabis", "cannabis"), + ("cannabis-off", "cannabis-off"), + ("caps-lock", "caps-lock"), + ("car", "car"), + ("car-2-plus", "car-2-plus"), + ("car-3-plus", "car-3-plus"), + ("car-arrow-left", "car-arrow-left"), + ("car-arrow-right", "car-arrow-right"), + ("car-back", "car-back"), + ("car-battery", "car-battery"), + ("car-brake-abs", "car-brake-abs"), + ("car-brake-alert", "car-brake-alert"), + ("car-brake-fluid-level", "car-brake-fluid-level"), + ("car-brake-hold", "car-brake-hold"), + ("car-brake-low-pressure", "car-brake-low-pressure"), + ("car-brake-parking", "car-brake-parking"), + ("car-brake-retarder", "car-brake-retarder"), + ("car-brake-temperature", "car-brake-temperature"), + ("car-brake-worn-linings", "car-brake-worn-linings"), + ("car-child-seat", "car-child-seat"), + ("car-clock", "car-clock"), + ("car-clutch", "car-clutch"), + ("car-cog", "car-cog"), + ("car-connected", "car-connected"), + ("car-convertable", "car-convertable"), + ("car-convertible", "car-convertible"), + ("car-coolant-level", "car-coolant-level"), + ("car-cruise-control", "car-cruise-control"), + ("car-defrost-front", "car-defrost-front"), + ("car-defrost-rear", "car-defrost-rear"), + ("car-door", "car-door"), + ("car-door-lock", "car-door-lock"), + ("car-electric", "car-electric"), + ("car-electric-outline", "car-electric-outline"), + ("car-emergency", "car-emergency"), + ("car-esp", "car-esp"), + ("car-estate", "car-estate"), + ("car-hatchback", "car-hatchback"), + ("car-info", "car-info"), + ("car-key", "car-key"), + ("car-lifted-pickup", "car-lifted-pickup"), + ("car-light-alert", "car-light-alert"), + ("car-light-dimmed", "car-light-dimmed"), + ("car-light-fog", "car-light-fog"), + ("car-light-high", "car-light-high"), + ("car-limousine", "car-limousine"), + ("car-multiple", "car-multiple"), + ("car-off", "car-off"), + ("car-outline", "car-outline"), + ("car-parking-lights", "car-parking-lights"), + ("car-pickup", "car-pickup"), + ("car-search", "car-search"), + ("car-search-outline", "car-search-outline"), + ("car-seat", "car-seat"), + ("car-seat-cooler", "car-seat-cooler"), + ("car-seat-heater", "car-seat-heater"), + ("car-select", "car-select"), + ("car-settings", "car-settings"), + ("car-shift-pattern", "car-shift-pattern"), + ("car-side", "car-side"), + ("car-speed-limiter", "car-speed-limiter"), + ("car-sports", "car-sports"), + ("car-tire-alert", "car-tire-alert"), + ("car-traction-control", "car-traction-control"), + ("car-turbocharger", "car-turbocharger"), + ("car-wash", "car-wash"), + ("car-windshield", "car-windshield"), + ("car-windshield-outline", "car-windshield-outline"), + ("car-wireless", "car-wireless"), + ("car-wrench", "car-wrench"), + ("carabiner", "carabiner"), + ("caravan", "caravan"), + ("card", "card"), + ("card-account-details", "card-account-details"), + ("card-account-details-outline", "card-account-details-outline"), + ("card-account-details-star", "card-account-details-star"), + ("card-account-details-star-outline", "card-account-details-star-outline"), + ("card-account-mail", "card-account-mail"), + ("card-account-mail-outline", "card-account-mail-outline"), + ("card-account-phone", "card-account-phone"), + ("card-account-phone-outline", "card-account-phone-outline"), + ("card-bulleted", "card-bulleted"), + ("card-bulleted-off", "card-bulleted-off"), + ("card-bulleted-off-outline", "card-bulleted-off-outline"), + ("card-bulleted-outline", "card-bulleted-outline"), + ("card-bulleted-settings", "card-bulleted-settings"), + ("card-bulleted-settings-outline", "card-bulleted-settings-outline"), + ("card-minus", "card-minus"), + ("card-minus-outline", "card-minus-outline"), + ("card-multiple", "card-multiple"), + ("card-multiple-outline", "card-multiple-outline"), + ("card-off", "card-off"), + ("card-off-outline", "card-off-outline"), + ("card-outline", "card-outline"), + ("card-plus", "card-plus"), + ("card-plus-outline", "card-plus-outline"), + ("card-remove", "card-remove"), + ("card-remove-outline", "card-remove-outline"), + ("card-search", "card-search"), + ("card-search-outline", "card-search-outline"), + ("card-text", "card-text"), + ("card-text-outline", "card-text-outline"), + ("cards", "cards"), + ("cards-club", "cards-club"), + ("cards-club-outline", "cards-club-outline"), + ("cards-diamond", "cards-diamond"), + ("cards-diamond-outline", "cards-diamond-outline"), + ("cards-heart", "cards-heart"), + ("cards-heart-outline", "cards-heart-outline"), + ("cards-outline", "cards-outline"), + ("cards-playing", "cards-playing"), + ("cards-playing-club", "cards-playing-club"), + ("cards-playing-club-multiple", "cards-playing-club-multiple"), + ("cards-playing-club-multiple-outline", "cards-playing-club-multiple-outline"), + ("cards-playing-club-outline", "cards-playing-club-outline"), + ("cards-playing-diamond", "cards-playing-diamond"), + ("cards-playing-diamond-multiple", "cards-playing-diamond-multiple"), + ( + "cards-playing-diamond-multiple-outline", + "cards-playing-diamond-multiple-outline", + ), + ("cards-playing-diamond-outline", "cards-playing-diamond-outline"), + ("cards-playing-heart", "cards-playing-heart"), + ("cards-playing-heart-multiple", "cards-playing-heart-multiple"), + ( + "cards-playing-heart-multiple-outline", + "cards-playing-heart-multiple-outline", + ), + ("cards-playing-heart-outline", "cards-playing-heart-outline"), + ("cards-playing-outline", "cards-playing-outline"), + ("cards-playing-spade", "cards-playing-spade"), + ("cards-playing-spade-multiple", "cards-playing-spade-multiple"), + ( + "cards-playing-spade-multiple-outline", + "cards-playing-spade-multiple-outline", + ), + ("cards-playing-spade-outline", "cards-playing-spade-outline"), + ("cards-spade", "cards-spade"), + ("cards-spade-outline", "cards-spade-outline"), + ("cards-variant", "cards-variant"), + ("carrot", "carrot"), + ("cart", "cart"), + ("cart-arrow-down", "cart-arrow-down"), + ("cart-arrow-right", "cart-arrow-right"), + ("cart-arrow-up", "cart-arrow-up"), + ("cart-check", "cart-check"), + ("cart-heart", "cart-heart"), + ("cart-minus", "cart-minus"), + ("cart-off", "cart-off"), + ("cart-outline", "cart-outline"), + ("cart-percent", "cart-percent"), + ("cart-plus", "cart-plus"), + ("cart-remove", "cart-remove"), + ("cart-variant", "cart-variant"), + ("case-sensitive-alt", "case-sensitive-alt"), + ("cash", "cash"), + ("cash-100", "cash-100"), + ("cash-check", "cash-check"), + ("cash-clock", "cash-clock"), + ("cash-fast", "cash-fast"), + ("cash-lock", "cash-lock"), + ("cash-lock-open", "cash-lock-open"), + ("cash-marker", "cash-marker"), + ("cash-minus", "cash-minus"), + ("cash-multiple", "cash-multiple"), + ("cash-plus", "cash-plus"), + ("cash-refund", "cash-refund"), + ("cash-register", "cash-register"), + ("cash-remove", "cash-remove"), + ("cash-sync", "cash-sync"), + ("cash-usd", "cash-usd"), + ("cash-usd-outline", "cash-usd-outline"), + ("cassette", "cassette"), + ("cast", "cast"), + ("cast-audio", "cast-audio"), + ("cast-audio-variant", "cast-audio-variant"), + ("cast-connected", "cast-connected"), + ("cast-education", "cast-education"), + ("cast-off", "cast-off"), + ("cast-variant", "cast-variant"), + ("castle", "castle"), + ("cat", "cat"), + ("cctv", "cctv"), + ("cctv-off", "cctv-off"), + ("ceiling-fan", "ceiling-fan"), + ("ceiling-fan-light", "ceiling-fan-light"), + ("ceiling-light", "ceiling-light"), + ("ceiling-light-multiple", "ceiling-light-multiple"), + ("ceiling-light-multiple-outline", "ceiling-light-multiple-outline"), + ("ceiling-light-outline", "ceiling-light-outline"), + ("cellphone", "cellphone"), + ("cellphone-android", "cellphone-android"), + ("cellphone-arrow-down", "cellphone-arrow-down"), + ("cellphone-arrow-down-variant", "cellphone-arrow-down-variant"), + ("cellphone-basic", "cellphone-basic"), + ("cellphone-charging", "cellphone-charging"), + ("cellphone-check", "cellphone-check"), + ("cellphone-cog", "cellphone-cog"), + ("cellphone-dock", "cellphone-dock"), + ("cellphone-information", "cellphone-information"), + ("cellphone-iphone", "cellphone-iphone"), + ("cellphone-key", "cellphone-key"), + ("cellphone-link", "cellphone-link"), + ("cellphone-link-off", "cellphone-link-off"), + ("cellphone-lock", "cellphone-lock"), + ("cellphone-marker", "cellphone-marker"), + ("cellphone-message", "cellphone-message"), + ("cellphone-message-off", "cellphone-message-off"), + ("cellphone-nfc", "cellphone-nfc"), + ("cellphone-nfc-off", "cellphone-nfc-off"), + ("cellphone-off", "cellphone-off"), + ("cellphone-play", "cellphone-play"), + ("cellphone-remove", "cellphone-remove"), + ("cellphone-screenshot", "cellphone-screenshot"), + ("cellphone-settings", "cellphone-settings"), + ("cellphone-sound", "cellphone-sound"), + ("cellphone-text", "cellphone-text"), + ("cellphone-wireless", "cellphone-wireless"), + ("centos", "centos"), + ("certificate", "certificate"), + ("certificate-outline", "certificate-outline"), + ("chair-rolling", "chair-rolling"), + ("chair-school", "chair-school"), + ("chandelier", "chandelier"), + ("charity", "charity"), + ("chart-arc", "chart-arc"), + ("chart-areaspline", "chart-areaspline"), + ("chart-areaspline-variant", "chart-areaspline-variant"), + ("chart-bar", "chart-bar"), + ("chart-bar-stacked", "chart-bar-stacked"), + ("chart-bell-curve", "chart-bell-curve"), + ("chart-bell-curve-cumulative", "chart-bell-curve-cumulative"), + ("chart-box", "chart-box"), + ("chart-box-outline", "chart-box-outline"), + ("chart-box-plus-outline", "chart-box-plus-outline"), + ("chart-bubble", "chart-bubble"), + ("chart-donut", "chart-donut"), + ("chart-donut-variant", "chart-donut-variant"), + ("chart-gantt", "chart-gantt"), + ("chart-histogram", "chart-histogram"), + ("chart-line", "chart-line"), + ("chart-line-stacked", "chart-line-stacked"), + ("chart-line-variant", "chart-line-variant"), + ("chart-multiline", "chart-multiline"), + ("chart-multiple", "chart-multiple"), + ("chart-pie", "chart-pie"), + ("chart-pie-outline", "chart-pie-outline"), + ("chart-ppf", "chart-ppf"), + ("chart-sankey", "chart-sankey"), + ("chart-sankey-variant", "chart-sankey-variant"), + ("chart-scatter-plot", "chart-scatter-plot"), + ("chart-scatter-plot-hexbin", "chart-scatter-plot-hexbin"), + ("chart-timeline", "chart-timeline"), + ("chart-timeline-variant", "chart-timeline-variant"), + ("chart-timeline-variant-shimmer", "chart-timeline-variant-shimmer"), + ("chart-tree", "chart-tree"), + ("chart-waterfall", "chart-waterfall"), + ("chat", "chat"), + ("chat-alert", "chat-alert"), + ("chat-alert-outline", "chat-alert-outline"), + ("chat-minus", "chat-minus"), + ("chat-minus-outline", "chat-minus-outline"), + ("chat-outline", "chat-outline"), + ("chat-plus", "chat-plus"), + ("chat-plus-outline", "chat-plus-outline"), + ("chat-processing", "chat-processing"), + ("chat-processing-outline", "chat-processing-outline"), + ("chat-question", "chat-question"), + ("chat-question-outline", "chat-question-outline"), + ("chat-remove", "chat-remove"), + ("chat-remove-outline", "chat-remove-outline"), + ("chat-sleep", "chat-sleep"), + ("chat-sleep-outline", "chat-sleep-outline"), + ("check", "check"), + ("check-all", "check-all"), + ("check-bold", "check-bold"), + ("check-bookmark", "check-bookmark"), + ("check-circle", "check-circle"), + ("check-circle-outline", "check-circle-outline"), + ("check-decagram", "check-decagram"), + ("check-decagram-outline", "check-decagram-outline"), + ("check-network", "check-network"), + ("check-network-outline", "check-network-outline"), + ("check-outline", "check-outline"), + ("check-underline", "check-underline"), + ("check-underline-circle", "check-underline-circle"), + ("check-underline-circle-outline", "check-underline-circle-outline"), + ("checkbook", "checkbook"), + ("checkbox-blank", "checkbox-blank"), + ("checkbox-blank-badge", "checkbox-blank-badge"), + ("checkbox-blank-badge-outline", "checkbox-blank-badge-outline"), + ("checkbox-blank-circle", "checkbox-blank-circle"), + ("checkbox-blank-circle-outline", "checkbox-blank-circle-outline"), + ("checkbox-blank-off", "checkbox-blank-off"), + ("checkbox-blank-off-outline", "checkbox-blank-off-outline"), + ("checkbox-blank-outline", "checkbox-blank-outline"), + ("checkbox-indeterminate", "checkbox-indeterminate"), + ("checkbox-intermediate", "checkbox-intermediate"), + ("checkbox-intermediate-variant", "checkbox-intermediate-variant"), + ("checkbox-marked", "checkbox-marked"), + ("checkbox-marked-circle", "checkbox-marked-circle"), + ("checkbox-marked-circle-outline", "checkbox-marked-circle-outline"), + ("checkbox-marked-circle-plus-outline", "checkbox-marked-circle-plus-outline"), + ("checkbox-marked-outline", "checkbox-marked-outline"), + ("checkbox-multiple-blank", "checkbox-multiple-blank"), + ("checkbox-multiple-blank-circle", "checkbox-multiple-blank-circle"), + ( + "checkbox-multiple-blank-circle-outline", + "checkbox-multiple-blank-circle-outline", + ), + ("checkbox-multiple-blank-outline", "checkbox-multiple-blank-outline"), + ("checkbox-multiple-marked", "checkbox-multiple-marked"), + ("checkbox-multiple-marked-circle", "checkbox-multiple-marked-circle"), + ( + "checkbox-multiple-marked-circle-outline", + "checkbox-multiple-marked-circle-outline", + ), + ("checkbox-multiple-marked-outline", "checkbox-multiple-marked-outline"), + ("checkbox-multiple-outline", "checkbox-multiple-outline"), + ("checkbox-outline", "checkbox-outline"), + ("checkerboard", "checkerboard"), + ("checkerboard-minus", "checkerboard-minus"), + ("checkerboard-plus", "checkerboard-plus"), + ("checkerboard-remove", "checkerboard-remove"), + ("cheese", "cheese"), + ("cheese-off", "cheese-off"), + ("chef-hat", "chef-hat"), + ("chemical-weapon", "chemical-weapon"), + ("chess-bishop", "chess-bishop"), + ("chess-king", "chess-king"), + ("chess-knight", "chess-knight"), + ("chess-pawn", "chess-pawn"), + ("chess-queen", "chess-queen"), + ("chess-rook", "chess-rook"), + ("chevron-double-down", "chevron-double-down"), + ("chevron-double-left", "chevron-double-left"), + ("chevron-double-right", "chevron-double-right"), + ("chevron-double-up", "chevron-double-up"), + ("chevron-down", "chevron-down"), + ("chevron-down-box", "chevron-down-box"), + ("chevron-down-box-outline", "chevron-down-box-outline"), + ("chevron-down-circle", "chevron-down-circle"), + ("chevron-down-circle-outline", "chevron-down-circle-outline"), + ("chevron-left", "chevron-left"), + ("chevron-left-box", "chevron-left-box"), + ("chevron-left-box-outline", "chevron-left-box-outline"), + ("chevron-left-circle", "chevron-left-circle"), + ("chevron-left-circle-outline", "chevron-left-circle-outline"), + ("chevron-right", "chevron-right"), + ("chevron-right-box", "chevron-right-box"), + ("chevron-right-box-outline", "chevron-right-box-outline"), + ("chevron-right-circle", "chevron-right-circle"), + ("chevron-right-circle-outline", "chevron-right-circle-outline"), + ("chevron-triple-down", "chevron-triple-down"), + ("chevron-triple-left", "chevron-triple-left"), + ("chevron-triple-right", "chevron-triple-right"), + ("chevron-triple-up", "chevron-triple-up"), + ("chevron-up", "chevron-up"), + ("chevron-up-box", "chevron-up-box"), + ("chevron-up-box-outline", "chevron-up-box-outline"), + ("chevron-up-circle", "chevron-up-circle"), + ("chevron-up-circle-outline", "chevron-up-circle-outline"), + ("chili-alert", "chili-alert"), + ("chili-alert-outline", "chili-alert-outline"), + ("chili-hot", "chili-hot"), + ("chili-hot-outline", "chili-hot-outline"), + ("chili-medium", "chili-medium"), + ("chili-medium-outline", "chili-medium-outline"), + ("chili-mild", "chili-mild"), + ("chili-mild-outline", "chili-mild-outline"), + ("chili-off", "chili-off"), + ("chili-off-outline", "chili-off-outline"), + ("chip", "chip"), + ("church", "church"), + ("church-outline", "church-outline"), + ("cigar", "cigar"), + ("cigar-off", "cigar-off"), + ("circle", "circle"), + ("circle-box", "circle-box"), + ("circle-box-outline", "circle-box-outline"), + ("circle-double", "circle-double"), + ("circle-edit-outline", "circle-edit-outline"), + ("circle-expand", "circle-expand"), + ("circle-half", "circle-half"), + ("circle-half-full", "circle-half-full"), + ("circle-medium", "circle-medium"), + ("circle-multiple", "circle-multiple"), + ("circle-multiple-outline", "circle-multiple-outline"), + ("circle-off-outline", "circle-off-outline"), + ("circle-opacity", "circle-opacity"), + ("circle-outline", "circle-outline"), + ("circle-slice-1", "circle-slice-1"), + ("circle-slice-2", "circle-slice-2"), + ("circle-slice-3", "circle-slice-3"), + ("circle-slice-4", "circle-slice-4"), + ("circle-slice-5", "circle-slice-5"), + ("circle-slice-6", "circle-slice-6"), + ("circle-slice-7", "circle-slice-7"), + ("circle-slice-8", "circle-slice-8"), + ("circle-small", "circle-small"), + ("circular-saw", "circular-saw"), + ("cisco-webex", "cisco-webex"), + ("city", "city"), + ("city-variant", "city-variant"), + ("city-variant-outline", "city-variant-outline"), + ("clipboard", "clipboard"), + ("clipboard-account", "clipboard-account"), + ("clipboard-account-outline", "clipboard-account-outline"), + ("clipboard-alert", "clipboard-alert"), + ("clipboard-alert-outline", "clipboard-alert-outline"), + ("clipboard-arrow-down", "clipboard-arrow-down"), + ("clipboard-arrow-down-outline", "clipboard-arrow-down-outline"), + ("clipboard-arrow-left", "clipboard-arrow-left"), + ("clipboard-arrow-left-outline", "clipboard-arrow-left-outline"), + ("clipboard-arrow-right", "clipboard-arrow-right"), + ("clipboard-arrow-right-outline", "clipboard-arrow-right-outline"), + ("clipboard-arrow-up", "clipboard-arrow-up"), + ("clipboard-arrow-up-outline", "clipboard-arrow-up-outline"), + ("clipboard-check", "clipboard-check"), + ("clipboard-check-multiple", "clipboard-check-multiple"), + ("clipboard-check-multiple-outline", "clipboard-check-multiple-outline"), + ("clipboard-check-outline", "clipboard-check-outline"), + ("clipboard-clock", "clipboard-clock"), + ("clipboard-clock-outline", "clipboard-clock-outline"), + ("clipboard-edit", "clipboard-edit"), + ("clipboard-edit-outline", "clipboard-edit-outline"), + ("clipboard-file", "clipboard-file"), + ("clipboard-file-outline", "clipboard-file-outline"), + ("clipboard-flow", "clipboard-flow"), + ("clipboard-flow-outline", "clipboard-flow-outline"), + ("clipboard-list", "clipboard-list"), + ("clipboard-list-outline", "clipboard-list-outline"), + ("clipboard-minus", "clipboard-minus"), + ("clipboard-minus-outline", "clipboard-minus-outline"), + ("clipboard-multiple", "clipboard-multiple"), + ("clipboard-multiple-outline", "clipboard-multiple-outline"), + ("clipboard-off", "clipboard-off"), + ("clipboard-off-outline", "clipboard-off-outline"), + ("clipboard-outline", "clipboard-outline"), + ("clipboard-play", "clipboard-play"), + ("clipboard-play-multiple", "clipboard-play-multiple"), + ("clipboard-play-multiple-outline", "clipboard-play-multiple-outline"), + ("clipboard-play-outline", "clipboard-play-outline"), + ("clipboard-plus", "clipboard-plus"), + ("clipboard-plus-outline", "clipboard-plus-outline"), + ("clipboard-pulse", "clipboard-pulse"), + ("clipboard-pulse-outline", "clipboard-pulse-outline"), + ("clipboard-remove", "clipboard-remove"), + ("clipboard-remove-outline", "clipboard-remove-outline"), + ("clipboard-search", "clipboard-search"), + ("clipboard-search-outline", "clipboard-search-outline"), + ("clipboard-text", "clipboard-text"), + ("clipboard-text-clock", "clipboard-text-clock"), + ("clipboard-text-clock-outline", "clipboard-text-clock-outline"), + ("clipboard-text-multiple", "clipboard-text-multiple"), + ("clipboard-text-multiple-outline", "clipboard-text-multiple-outline"), + ("clipboard-text-off", "clipboard-text-off"), + ("clipboard-text-off-outline", "clipboard-text-off-outline"), + ("clipboard-text-outline", "clipboard-text-outline"), + ("clipboard-text-play", "clipboard-text-play"), + ("clipboard-text-play-outline", "clipboard-text-play-outline"), + ("clipboard-text-search", "clipboard-text-search"), + ("clipboard-text-search-outline", "clipboard-text-search-outline"), + ("clippy", "clippy"), + ("clock", "clock"), + ("clock-alert", "clock-alert"), + ("clock-alert-outline", "clock-alert-outline"), + ("clock-check", "clock-check"), + ("clock-check-outline", "clock-check-outline"), + ("clock-digital", "clock-digital"), + ("clock-edit", "clock-edit"), + ("clock-edit-outline", "clock-edit-outline"), + ("clock-end", "clock-end"), + ("clock-fast", "clock-fast"), + ("clock-in", "clock-in"), + ("clock-minus", "clock-minus"), + ("clock-minus-outline", "clock-minus-outline"), + ("clock-out", "clock-out"), + ("clock-outline", "clock-outline"), + ("clock-plus", "clock-plus"), + ("clock-plus-outline", "clock-plus-outline"), + ("clock-remove", "clock-remove"), + ("clock-remove-outline", "clock-remove-outline"), + ("clock-start", "clock-start"), + ("clock-time-eight", "clock-time-eight"), + ("clock-time-eight-outline", "clock-time-eight-outline"), + ("clock-time-eleven", "clock-time-eleven"), + ("clock-time-eleven-outline", "clock-time-eleven-outline"), + ("clock-time-five", "clock-time-five"), + ("clock-time-five-outline", "clock-time-five-outline"), + ("clock-time-four", "clock-time-four"), + ("clock-time-four-outline", "clock-time-four-outline"), + ("clock-time-nine", "clock-time-nine"), + ("clock-time-nine-outline", "clock-time-nine-outline"), + ("clock-time-one", "clock-time-one"), + ("clock-time-one-outline", "clock-time-one-outline"), + ("clock-time-seven", "clock-time-seven"), + ("clock-time-seven-outline", "clock-time-seven-outline"), + ("clock-time-six", "clock-time-six"), + ("clock-time-six-outline", "clock-time-six-outline"), + ("clock-time-ten", "clock-time-ten"), + ("clock-time-ten-outline", "clock-time-ten-outline"), + ("clock-time-three", "clock-time-three"), + ("clock-time-three-outline", "clock-time-three-outline"), + ("clock-time-twelve", "clock-time-twelve"), + ("clock-time-twelve-outline", "clock-time-twelve-outline"), + ("clock-time-two", "clock-time-two"), + ("clock-time-two-outline", "clock-time-two-outline"), + ("close", "close"), + ("close-box", "close-box"), + ("close-box-multiple", "close-box-multiple"), + ("close-box-multiple-outline", "close-box-multiple-outline"), + ("close-box-outline", "close-box-outline"), + ("close-circle", "close-circle"), + ("close-circle-multiple", "close-circle-multiple"), + ("close-circle-multiple-outline", "close-circle-multiple-outline"), + ("close-circle-outline", "close-circle-outline"), + ("close-network", "close-network"), + ("close-network-outline", "close-network-outline"), + ("close-octagon", "close-octagon"), + ("close-octagon-outline", "close-octagon-outline"), + ("close-outline", "close-outline"), + ("close-thick", "close-thick"), + ("closed-caption", "closed-caption"), + ("closed-caption-outline", "closed-caption-outline"), + ("cloud", "cloud"), + ("cloud-alert", "cloud-alert"), + ("cloud-alert-outline", "cloud-alert-outline"), + ("cloud-arrow-down", "cloud-arrow-down"), + ("cloud-arrow-down-outline", "cloud-arrow-down-outline"), + ("cloud-arrow-left", "cloud-arrow-left"), + ("cloud-arrow-left-outline", "cloud-arrow-left-outline"), + ("cloud-arrow-right", "cloud-arrow-right"), + ("cloud-arrow-right-outline", "cloud-arrow-right-outline"), + ("cloud-arrow-up", "cloud-arrow-up"), + ("cloud-arrow-up-outline", "cloud-arrow-up-outline"), + ("cloud-braces", "cloud-braces"), + ("cloud-cancel", "cloud-cancel"), + ("cloud-cancel-outline", "cloud-cancel-outline"), + ("cloud-check", "cloud-check"), + ("cloud-check-outline", "cloud-check-outline"), + ("cloud-check-variant", "cloud-check-variant"), + ("cloud-check-variant-outline", "cloud-check-variant-outline"), + ("cloud-circle", "cloud-circle"), + ("cloud-circle-outline", "cloud-circle-outline"), + ("cloud-clock", "cloud-clock"), + ("cloud-clock-outline", "cloud-clock-outline"), + ("cloud-cog", "cloud-cog"), + ("cloud-cog-outline", "cloud-cog-outline"), + ("cloud-download", "cloud-download"), + ("cloud-download-outline", "cloud-download-outline"), + ("cloud-lock", "cloud-lock"), + ("cloud-lock-open", "cloud-lock-open"), + ("cloud-lock-open-outline", "cloud-lock-open-outline"), + ("cloud-lock-outline", "cloud-lock-outline"), + ("cloud-minus", "cloud-minus"), + ("cloud-minus-outline", "cloud-minus-outline"), + ("cloud-off", "cloud-off"), + ("cloud-off-outline", "cloud-off-outline"), + ("cloud-outline", "cloud-outline"), + ("cloud-percent", "cloud-percent"), + ("cloud-percent-outline", "cloud-percent-outline"), + ("cloud-plus", "cloud-plus"), + ("cloud-plus-outline", "cloud-plus-outline"), + ("cloud-print", "cloud-print"), + ("cloud-print-outline", "cloud-print-outline"), + ("cloud-question", "cloud-question"), + ("cloud-question-outline", "cloud-question-outline"), + ("cloud-refresh", "cloud-refresh"), + ("cloud-refresh-outline", "cloud-refresh-outline"), + ("cloud-refresh-variant", "cloud-refresh-variant"), + ("cloud-refresh-variant-outline", "cloud-refresh-variant-outline"), + ("cloud-remove", "cloud-remove"), + ("cloud-remove-outline", "cloud-remove-outline"), + ("cloud-search", "cloud-search"), + ("cloud-search-outline", "cloud-search-outline"), + ("cloud-sync", "cloud-sync"), + ("cloud-sync-outline", "cloud-sync-outline"), + ("cloud-tags", "cloud-tags"), + ("cloud-upload", "cloud-upload"), + ("cloud-upload-outline", "cloud-upload-outline"), + ("clouds", "clouds"), + ("clover", "clover"), + ("coach-lamp", "coach-lamp"), + ("coach-lamp-variant", "coach-lamp-variant"), + ("coat-rack", "coat-rack"), + ("code-array", "code-array"), + ("code-braces", "code-braces"), + ("code-braces-box", "code-braces-box"), + ("code-brackets", "code-brackets"), + ("code-equal", "code-equal"), + ("code-greater-than", "code-greater-than"), + ("code-greater-than-or-equal", "code-greater-than-or-equal"), + ("code-json", "code-json"), + ("code-less-than", "code-less-than"), + ("code-less-than-or-equal", "code-less-than-or-equal"), + ("code-not-equal", "code-not-equal"), + ("code-not-equal-variant", "code-not-equal-variant"), + ("code-parentheses", "code-parentheses"), + ("code-parentheses-box", "code-parentheses-box"), + ("code-string", "code-string"), + ("code-tags", "code-tags"), + ("code-tags-check", "code-tags-check"), + ("codepen", "codepen"), + ("coffee", "coffee"), + ("coffee-maker", "coffee-maker"), + ("coffee-maker-check", "coffee-maker-check"), + ("coffee-maker-check-outline", "coffee-maker-check-outline"), + ("coffee-maker-outline", "coffee-maker-outline"), + ("coffee-off", "coffee-off"), + ("coffee-off-outline", "coffee-off-outline"), + ("coffee-outline", "coffee-outline"), + ("coffee-to-go", "coffee-to-go"), + ("coffee-to-go-outline", "coffee-to-go-outline"), + ("coffin", "coffin"), + ("cog", "cog"), + ("cog-box", "cog-box"), + ("cog-clockwise", "cog-clockwise"), + ("cog-counterclockwise", "cog-counterclockwise"), + ("cog-off", "cog-off"), + ("cog-off-outline", "cog-off-outline"), + ("cog-outline", "cog-outline"), + ("cog-pause", "cog-pause"), + ("cog-pause-outline", "cog-pause-outline"), + ("cog-play", "cog-play"), + ("cog-play-outline", "cog-play-outline"), + ("cog-refresh", "cog-refresh"), + ("cog-refresh-outline", "cog-refresh-outline"), + ("cog-stop", "cog-stop"), + ("cog-stop-outline", "cog-stop-outline"), + ("cog-sync", "cog-sync"), + ("cog-sync-outline", "cog-sync-outline"), + ("cog-transfer", "cog-transfer"), + ("cog-transfer-outline", "cog-transfer-outline"), + ("cogs", "cogs"), + ("collage", "collage"), + ("collapse-all", "collapse-all"), + ("collapse-all-outline", "collapse-all-outline"), + ("color-helper", "color-helper"), + ("comma", "comma"), + ("comma-box", "comma-box"), + ("comma-box-outline", "comma-box-outline"), + ("comma-circle", "comma-circle"), + ("comma-circle-outline", "comma-circle-outline"), + ("comment", "comment"), + ("comment-account", "comment-account"), + ("comment-account-outline", "comment-account-outline"), + ("comment-alert", "comment-alert"), + ("comment-alert-outline", "comment-alert-outline"), + ("comment-arrow-left", "comment-arrow-left"), + ("comment-arrow-left-outline", "comment-arrow-left-outline"), + ("comment-arrow-right", "comment-arrow-right"), + ("comment-arrow-right-outline", "comment-arrow-right-outline"), + ("comment-bookmark", "comment-bookmark"), + ("comment-bookmark-outline", "comment-bookmark-outline"), + ("comment-check", "comment-check"), + ("comment-check-outline", "comment-check-outline"), + ("comment-edit", "comment-edit"), + ("comment-edit-outline", "comment-edit-outline"), + ("comment-eye", "comment-eye"), + ("comment-eye-outline", "comment-eye-outline"), + ("comment-flash", "comment-flash"), + ("comment-flash-outline", "comment-flash-outline"), + ("comment-minus", "comment-minus"), + ("comment-minus-outline", "comment-minus-outline"), + ("comment-multiple", "comment-multiple"), + ("comment-multiple-outline", "comment-multiple-outline"), + ("comment-off", "comment-off"), + ("comment-off-outline", "comment-off-outline"), + ("comment-outline", "comment-outline"), + ("comment-plus", "comment-plus"), + ("comment-plus-outline", "comment-plus-outline"), + ("comment-processing", "comment-processing"), + ("comment-processing-outline", "comment-processing-outline"), + ("comment-question", "comment-question"), + ("comment-question-outline", "comment-question-outline"), + ("comment-quote", "comment-quote"), + ("comment-quote-outline", "comment-quote-outline"), + ("comment-remove", "comment-remove"), + ("comment-remove-outline", "comment-remove-outline"), + ("comment-search", "comment-search"), + ("comment-search-outline", "comment-search-outline"), + ("comment-text", "comment-text"), + ("comment-text-multiple", "comment-text-multiple"), + ("comment-text-multiple-outline", "comment-text-multiple-outline"), + ("comment-text-outline", "comment-text-outline"), + ("compare", "compare"), + ("compare-horizontal", "compare-horizontal"), + ("compare-remove", "compare-remove"), + ("compare-vertical", "compare-vertical"), + ("compass", "compass"), + ("compass-off", "compass-off"), + ("compass-off-outline", "compass-off-outline"), + ("compass-outline", "compass-outline"), + ("compass-rose", "compass-rose"), + ("compost", "compost"), + ("concourse-ci", "concourse-ci"), + ("cone", "cone"), + ("cone-off", "cone-off"), + ("connection", "connection"), + ("console", "console"), + ("console-line", "console-line"), + ("console-network", "console-network"), + ("console-network-outline", "console-network-outline"), + ("consolidate", "consolidate"), + ("contactless-payment", "contactless-payment"), + ("contactless-payment-circle", "contactless-payment-circle"), + ("contactless-payment-circle-outline", "contactless-payment-circle-outline"), + ("contacts", "contacts"), + ("contacts-outline", "contacts-outline"), + ("contain", "contain"), + ("contain-end", "contain-end"), + ("contain-start", "contain-start"), + ("content-copy", "content-copy"), + ("content-cut", "content-cut"), + ("content-duplicate", "content-duplicate"), + ("content-paste", "content-paste"), + ("content-save", "content-save"), + ("content-save-alert", "content-save-alert"), + ("content-save-alert-outline", "content-save-alert-outline"), + ("content-save-all", "content-save-all"), + ("content-save-all-outline", "content-save-all-outline"), + ("content-save-check", "content-save-check"), + ("content-save-check-outline", "content-save-check-outline"), + ("content-save-cog", "content-save-cog"), + ("content-save-cog-outline", "content-save-cog-outline"), + ("content-save-edit", "content-save-edit"), + ("content-save-edit-outline", "content-save-edit-outline"), + ("content-save-minus", "content-save-minus"), + ("content-save-minus-outline", "content-save-minus-outline"), + ("content-save-move", "content-save-move"), + ("content-save-move-outline", "content-save-move-outline"), + ("content-save-off", "content-save-off"), + ("content-save-off-outline", "content-save-off-outline"), + ("content-save-outline", "content-save-outline"), + ("content-save-plus", "content-save-plus"), + ("content-save-plus-outline", "content-save-plus-outline"), + ("content-save-settings", "content-save-settings"), + ("content-save-settings-outline", "content-save-settings-outline"), + ("contrast", "contrast"), + ("contrast-box", "contrast-box"), + ("contrast-circle", "contrast-circle"), + ("controller", "controller"), + ("controller-classic", "controller-classic"), + ("controller-classic-outline", "controller-classic-outline"), + ("controller-off", "controller-off"), + ("controller-xbox", "controller-xbox"), + ("cookie", "cookie"), + ("cookie-alert", "cookie-alert"), + ("cookie-alert-outline", "cookie-alert-outline"), + ("cookie-check", "cookie-check"), + ("cookie-check-outline", "cookie-check-outline"), + ("cookie-clock", "cookie-clock"), + ("cookie-clock-outline", "cookie-clock-outline"), + ("cookie-cog", "cookie-cog"), + ("cookie-cog-outline", "cookie-cog-outline"), + ("cookie-edit", "cookie-edit"), + ("cookie-edit-outline", "cookie-edit-outline"), + ("cookie-lock", "cookie-lock"), + ("cookie-lock-outline", "cookie-lock-outline"), + ("cookie-minus", "cookie-minus"), + ("cookie-minus-outline", "cookie-minus-outline"), + ("cookie-off", "cookie-off"), + ("cookie-off-outline", "cookie-off-outline"), + ("cookie-outline", "cookie-outline"), + ("cookie-plus", "cookie-plus"), + ("cookie-plus-outline", "cookie-plus-outline"), + ("cookie-refresh", "cookie-refresh"), + ("cookie-refresh-outline", "cookie-refresh-outline"), + ("cookie-remove", "cookie-remove"), + ("cookie-remove-outline", "cookie-remove-outline"), + ("cookie-settings", "cookie-settings"), + ("cookie-settings-outline", "cookie-settings-outline"), + ("coolant-temperature", "coolant-temperature"), + ("copyleft", "copyleft"), + ("copyright", "copyright"), + ("cordova", "cordova"), + ("corn", "corn"), + ("corn-off", "corn-off"), + ("cosine-wave", "cosine-wave"), + ("counter", "counter"), + ("countertop", "countertop"), + ("countertop-outline", "countertop-outline"), + ("cow", "cow"), + ("cow-off", "cow-off"), + ("cpu-32-bit", "cpu-32-bit"), + ("cpu-64-bit", "cpu-64-bit"), + ("cradle", "cradle"), + ("cradle-outline", "cradle-outline"), + ("crane", "crane"), + ("creation", "creation"), + ("creative-commons", "creative-commons"), + ("credit-card", "credit-card"), + ("credit-card-check", "credit-card-check"), + ("credit-card-check-outline", "credit-card-check-outline"), + ("credit-card-chip", "credit-card-chip"), + ("credit-card-chip-outline", "credit-card-chip-outline"), + ("credit-card-clock", "credit-card-clock"), + ("credit-card-clock-outline", "credit-card-clock-outline"), + ("credit-card-edit", "credit-card-edit"), + ("credit-card-edit-outline", "credit-card-edit-outline"), + ("credit-card-fast", "credit-card-fast"), + ("credit-card-fast-outline", "credit-card-fast-outline"), + ("credit-card-lock", "credit-card-lock"), + ("credit-card-lock-outline", "credit-card-lock-outline"), + ("credit-card-marker", "credit-card-marker"), + ("credit-card-marker-outline", "credit-card-marker-outline"), + ("credit-card-minus", "credit-card-minus"), + ("credit-card-minus-outline", "credit-card-minus-outline"), + ("credit-card-multiple", "credit-card-multiple"), + ("credit-card-multiple-outline", "credit-card-multiple-outline"), + ("credit-card-off", "credit-card-off"), + ("credit-card-off-outline", "credit-card-off-outline"), + ("credit-card-outline", "credit-card-outline"), + ("credit-card-plus", "credit-card-plus"), + ("credit-card-plus-outline", "credit-card-plus-outline"), + ("credit-card-refresh", "credit-card-refresh"), + ("credit-card-refresh-outline", "credit-card-refresh-outline"), + ("credit-card-refund", "credit-card-refund"), + ("credit-card-refund-outline", "credit-card-refund-outline"), + ("credit-card-remove", "credit-card-remove"), + ("credit-card-remove-outline", "credit-card-remove-outline"), + ("credit-card-scan", "credit-card-scan"), + ("credit-card-scan-outline", "credit-card-scan-outline"), + ("credit-card-search", "credit-card-search"), + ("credit-card-search-outline", "credit-card-search-outline"), + ("credit-card-settings", "credit-card-settings"), + ("credit-card-settings-outline", "credit-card-settings-outline"), + ("credit-card-sync", "credit-card-sync"), + ("credit-card-sync-outline", "credit-card-sync-outline"), + ("credit-card-wireless", "credit-card-wireless"), + ("credit-card-wireless-off", "credit-card-wireless-off"), + ("credit-card-wireless-off-outline", "credit-card-wireless-off-outline"), + ("credit-card-wireless-outline", "credit-card-wireless-outline"), + ("cricket", "cricket"), + ("crop", "crop"), + ("crop-free", "crop-free"), + ("crop-landscape", "crop-landscape"), + ("crop-portrait", "crop-portrait"), + ("crop-rotate", "crop-rotate"), + ("crop-square", "crop-square"), + ("cross", "cross"), + ("cross-bolnisi", "cross-bolnisi"), + ("cross-celtic", "cross-celtic"), + ("cross-outline", "cross-outline"), + ("crosshairs", "crosshairs"), + ("crosshairs-gps", "crosshairs-gps"), + ("crosshairs-off", "crosshairs-off"), + ("crosshairs-question", "crosshairs-question"), + ("crowd", "crowd"), + ("crown", "crown"), + ("crown-circle", "crown-circle"), + ("crown-circle-outline", "crown-circle-outline"), + ("crown-outline", "crown-outline"), + ("cryengine", "cryengine"), + ("crystal-ball", "crystal-ball"), + ("cube", "cube"), + ("cube-off", "cube-off"), + ("cube-off-outline", "cube-off-outline"), + ("cube-outline", "cube-outline"), + ("cube-scan", "cube-scan"), + ("cube-send", "cube-send"), + ("cube-unfolded", "cube-unfolded"), + ("cup", "cup"), + ("cup-off", "cup-off"), + ("cup-off-outline", "cup-off-outline"), + ("cup-outline", "cup-outline"), + ("cup-water", "cup-water"), + ("cupboard", "cupboard"), + ("cupboard-outline", "cupboard-outline"), + ("cupcake", "cupcake"), + ("curling", "curling"), + ("currency-bdt", "currency-bdt"), + ("currency-brl", "currency-brl"), + ("currency-btc", "currency-btc"), + ("currency-chf", "currency-chf"), + ("currency-cny", "currency-cny"), + ("currency-eth", "currency-eth"), + ("currency-eur", "currency-eur"), + ("currency-eur-off", "currency-eur-off"), + ("currency-fra", "currency-fra"), + ("currency-gbp", "currency-gbp"), + ("currency-ils", "currency-ils"), + ("currency-inr", "currency-inr"), + ("currency-jpy", "currency-jpy"), + ("currency-krw", "currency-krw"), + ("currency-kzt", "currency-kzt"), + ("currency-mnt", "currency-mnt"), + ("currency-ngn", "currency-ngn"), + ("currency-php", "currency-php"), + ("currency-rial", "currency-rial"), + ("currency-rub", "currency-rub"), + ("currency-rupee", "currency-rupee"), + ("currency-sign", "currency-sign"), + ("currency-thb", "currency-thb"), + ("currency-try", "currency-try"), + ("currency-twd", "currency-twd"), + ("currency-uah", "currency-uah"), + ("currency-usd", "currency-usd"), + ("currency-usd-circle", "currency-usd-circle"), + ("currency-usd-circle-outline", "currency-usd-circle-outline"), + ("currency-usd-off", "currency-usd-off"), + ("current-ac", "current-ac"), + ("current-dc", "current-dc"), + ("cursor-default", "cursor-default"), + ("cursor-default-click", "cursor-default-click"), + ("cursor-default-click-outline", "cursor-default-click-outline"), + ("cursor-default-gesture", "cursor-default-gesture"), + ("cursor-default-gesture-outline", "cursor-default-gesture-outline"), + ("cursor-default-outline", "cursor-default-outline"), + ("cursor-move", "cursor-move"), + ("cursor-pointer", "cursor-pointer"), + ("cursor-text", "cursor-text"), + ("curtains", "curtains"), + ("curtains-closed", "curtains-closed"), + ("cylinder", "cylinder"), + ("cylinder-off", "cylinder-off"), + ("dance-ballroom", "dance-ballroom"), + ("dance-pole", "dance-pole"), + ("data", "data"), + ("data-matrix", "data-matrix"), + ("data-matrix-edit", "data-matrix-edit"), + ("data-matrix-minus", "data-matrix-minus"), + ("data-matrix-plus", "data-matrix-plus"), + ("data-matrix-remove", "data-matrix-remove"), + ("data-matrix-scan", "data-matrix-scan"), + ("database", "database"), + ("database-alert", "database-alert"), + ("database-alert-outline", "database-alert-outline"), + ("database-arrow-down", "database-arrow-down"), + ("database-arrow-down-outline", "database-arrow-down-outline"), + ("database-arrow-left", "database-arrow-left"), + ("database-arrow-left-outline", "database-arrow-left-outline"), + ("database-arrow-right", "database-arrow-right"), + ("database-arrow-right-outline", "database-arrow-right-outline"), + ("database-arrow-up", "database-arrow-up"), + ("database-arrow-up-outline", "database-arrow-up-outline"), + ("database-check", "database-check"), + ("database-check-outline", "database-check-outline"), + ("database-clock", "database-clock"), + ("database-clock-outline", "database-clock-outline"), + ("database-cog", "database-cog"), + ("database-cog-outline", "database-cog-outline"), + ("database-edit", "database-edit"), + ("database-edit-outline", "database-edit-outline"), + ("database-export", "database-export"), + ("database-export-outline", "database-export-outline"), + ("database-eye", "database-eye"), + ("database-eye-off", "database-eye-off"), + ("database-eye-off-outline", "database-eye-off-outline"), + ("database-eye-outline", "database-eye-outline"), + ("database-import", "database-import"), + ("database-import-outline", "database-import-outline"), + ("database-lock", "database-lock"), + ("database-lock-outline", "database-lock-outline"), + ("database-marker", "database-marker"), + ("database-marker-outline", "database-marker-outline"), + ("database-minus", "database-minus"), + ("database-minus-outline", "database-minus-outline"), + ("database-off", "database-off"), + ("database-off-outline", "database-off-outline"), + ("database-outline", "database-outline"), + ("database-plus", "database-plus"), + ("database-plus-outline", "database-plus-outline"), + ("database-refresh", "database-refresh"), + ("database-refresh-outline", "database-refresh-outline"), + ("database-remove", "database-remove"), + ("database-remove-outline", "database-remove-outline"), + ("database-search", "database-search"), + ("database-search-outline", "database-search-outline"), + ("database-settings", "database-settings"), + ("database-settings-outline", "database-settings-outline"), + ("database-sync", "database-sync"), + ("database-sync-outline", "database-sync-outline"), + ("death-star", "death-star"), + ("death-star-variant", "death-star-variant"), + ("deathly-hallows", "deathly-hallows"), + ("debian", "debian"), + ("debug-step-into", "debug-step-into"), + ("debug-step-out", "debug-step-out"), + ("debug-step-over", "debug-step-over"), + ("decagram", "decagram"), + ("decagram-outline", "decagram-outline"), + ("decimal", "decimal"), + ("decimal-comma", "decimal-comma"), + ("decimal-comma-decrease", "decimal-comma-decrease"), + ("decimal-comma-increase", "decimal-comma-increase"), + ("decimal-decrease", "decimal-decrease"), + ("decimal-increase", "decimal-increase"), + ("delete", "delete"), + ("delete-alert", "delete-alert"), + ("delete-alert-outline", "delete-alert-outline"), + ("delete-circle", "delete-circle"), + ("delete-circle-outline", "delete-circle-outline"), + ("delete-clock", "delete-clock"), + ("delete-clock-outline", "delete-clock-outline"), + ("delete-empty", "delete-empty"), + ("delete-empty-outline", "delete-empty-outline"), + ("delete-forever", "delete-forever"), + ("delete-forever-outline", "delete-forever-outline"), + ("delete-off", "delete-off"), + ("delete-off-outline", "delete-off-outline"), + ("delete-outline", "delete-outline"), + ("delete-restore", "delete-restore"), + ("delete-sweep", "delete-sweep"), + ("delete-sweep-outline", "delete-sweep-outline"), + ("delete-variant", "delete-variant"), + ("delta", "delta"), + ("desk", "desk"), + ("desk-lamp", "desk-lamp"), + ("desk-lamp-off", "desk-lamp-off"), + ("desk-lamp-on", "desk-lamp-on"), + ("deskphone", "deskphone"), + ("desktop-classic", "desktop-classic"), + ("desktop-mac", "desktop-mac"), + ("desktop-mac-dashboard", "desktop-mac-dashboard"), + ("desktop-tower", "desktop-tower"), + ("desktop-tower-monitor", "desktop-tower-monitor"), + ("details", "details"), + ("dev-to", "dev-to"), + ("developer-board", "developer-board"), + ("deviantart", "deviantart"), + ("devices", "devices"), + ("dharmachakra", "dharmachakra"), + ("diabetes", "diabetes"), + ("dialpad", "dialpad"), + ("diameter", "diameter"), + ("diameter-outline", "diameter-outline"), + ("diameter-variant", "diameter-variant"), + ("diamond", "diamond"), + ("diamond-outline", "diamond-outline"), + ("diamond-stone", "diamond-stone"), + ("dice", "dice"), + ("dice-1", "dice-1"), + ("dice-1-outline", "dice-1-outline"), + ("dice-2", "dice-2"), + ("dice-2-outline", "dice-2-outline"), + ("dice-3", "dice-3"), + ("dice-3-outline", "dice-3-outline"), + ("dice-4", "dice-4"), + ("dice-4-outline", "dice-4-outline"), + ("dice-5", "dice-5"), + ("dice-5-outline", "dice-5-outline"), + ("dice-6", "dice-6"), + ("dice-6-outline", "dice-6-outline"), + ("dice-d10", "dice-d10"), + ("dice-d10-outline", "dice-d10-outline"), + ("dice-d12", "dice-d12"), + ("dice-d12-outline", "dice-d12-outline"), + ("dice-d20", "dice-d20"), + ("dice-d20-outline", "dice-d20-outline"), + ("dice-d4", "dice-d4"), + ("dice-d4-outline", "dice-d4-outline"), + ("dice-d6", "dice-d6"), + ("dice-d6-outline", "dice-d6-outline"), + ("dice-d8", "dice-d8"), + ("dice-d8-outline", "dice-d8-outline"), + ("dice-multiple", "dice-multiple"), + ("dice-multiple-outline", "dice-multiple-outline"), + ("digital-ocean", "digital-ocean"), + ("dip-switch", "dip-switch"), + ("directions", "directions"), + ("directions-fork", "directions-fork"), + ("disc", "disc"), + ("disc-alert", "disc-alert"), + ("disc-player", "disc-player"), + ("discord", "discord"), + ("dishwasher", "dishwasher"), + ("dishwasher-alert", "dishwasher-alert"), + ("dishwasher-off", "dishwasher-off"), + ("disk", "disk"), + ("disk-alert", "disk-alert"), + ("disk-player", "disk-player"), + ("disqus", "disqus"), + ("disqus-outline", "disqus-outline"), + ("distribute-horizontal-center", "distribute-horizontal-center"), + ("distribute-horizontal-left", "distribute-horizontal-left"), + ("distribute-horizontal-right", "distribute-horizontal-right"), + ("distribute-vertical-bottom", "distribute-vertical-bottom"), + ("distribute-vertical-center", "distribute-vertical-center"), + ("distribute-vertical-top", "distribute-vertical-top"), + ("diversify", "diversify"), + ("diving", "diving"), + ("diving-flippers", "diving-flippers"), + ("diving-helmet", "diving-helmet"), + ("diving-scuba", "diving-scuba"), + ("diving-scuba-flag", "diving-scuba-flag"), + ("diving-scuba-mask", "diving-scuba-mask"), + ("diving-scuba-tank", "diving-scuba-tank"), + ("diving-scuba-tank-multiple", "diving-scuba-tank-multiple"), + ("diving-snorkel", "diving-snorkel"), + ("division", "division"), + ("division-box", "division-box"), + ("dlna", "dlna"), + ("dna", "dna"), + ("dns", "dns"), + ("dns-outline", "dns-outline"), + ("do-not-disturb", "do-not-disturb"), + ("dock-bottom", "dock-bottom"), + ("dock-left", "dock-left"), + ("dock-right", "dock-right"), + ("dock-top", "dock-top"), + ("dock-window", "dock-window"), + ("docker", "docker"), + ("doctor", "doctor"), + ("document", "document"), + ("dog", "dog"), + ("dog-service", "dog-service"), + ("dog-side", "dog-side"), + ("dog-side-off", "dog-side-off"), + ("dolby", "dolby"), + ("dolly", "dolly"), + ("dolphin", "dolphin"), + ("domain", "domain"), + ("domain-off", "domain-off"), + ("domain-plus", "domain-plus"), + ("domain-remove", "domain-remove"), + ("dome-light", "dome-light"), + ("domino-mask", "domino-mask"), + ("donkey", "donkey"), + ("door", "door"), + ("door-closed", "door-closed"), + ("door-closed-lock", "door-closed-lock"), + ("door-open", "door-open"), + ("door-sliding", "door-sliding"), + ("door-sliding-lock", "door-sliding-lock"), + ("door-sliding-open", "door-sliding-open"), + ("doorbell", "doorbell"), + ("doorbell-video", "doorbell-video"), + ("dot-net", "dot-net"), + ("dots-circle", "dots-circle"), + ("dots-grid", "dots-grid"), + ("dots-hexagon", "dots-hexagon"), + ("dots-horizontal", "dots-horizontal"), + ("dots-horizontal-circle", "dots-horizontal-circle"), + ("dots-horizontal-circle-outline", "dots-horizontal-circle-outline"), + ("dots-square", "dots-square"), + ("dots-triangle", "dots-triangle"), + ("dots-vertical", "dots-vertical"), + ("dots-vertical-circle", "dots-vertical-circle"), + ("dots-vertical-circle-outline", "dots-vertical-circle-outline"), + ("douban", "douban"), + ("download", "download"), + ("download-box", "download-box"), + ("download-box-outline", "download-box-outline"), + ("download-circle", "download-circle"), + ("download-circle-outline", "download-circle-outline"), + ("download-lock", "download-lock"), + ("download-lock-outline", "download-lock-outline"), + ("download-multiple", "download-multiple"), + ("download-network", "download-network"), + ("download-network-outline", "download-network-outline"), + ("download-off", "download-off"), + ("download-off-outline", "download-off-outline"), + ("download-outline", "download-outline"), + ("drag", "drag"), + ("drag-horizontal", "drag-horizontal"), + ("drag-horizontal-variant", "drag-horizontal-variant"), + ("drag-variant", "drag-variant"), + ("drag-vertical", "drag-vertical"), + ("drag-vertical-variant", "drag-vertical-variant"), + ("drama-masks", "drama-masks"), + ("draw", "draw"), + ("draw-pen", "draw-pen"), + ("drawing", "drawing"), + ("drawing-box", "drawing-box"), + ("dresser", "dresser"), + ("dresser-outline", "dresser-outline"), + ("dribbble", "dribbble"), + ("dribbble-box", "dribbble-box"), + ("drone", "drone"), + ("dropbox", "dropbox"), + ("drupal", "drupal"), + ("duck", "duck"), + ("dumbbell", "dumbbell"), + ("dump-truck", "dump-truck"), + ("ear-hearing", "ear-hearing"), + ("ear-hearing-loop", "ear-hearing-loop"), + ("ear-hearing-off", "ear-hearing-off"), + ("earbuds", "earbuds"), + ("earbuds-off", "earbuds-off"), + ("earbuds-off-outline", "earbuds-off-outline"), + ("earbuds-outline", "earbuds-outline"), + ("earth", "earth"), + ("earth-arrow-right", "earth-arrow-right"), + ("earth-box", "earth-box"), + ("earth-box-minus", "earth-box-minus"), + ("earth-box-off", "earth-box-off"), + ("earth-box-plus", "earth-box-plus"), + ("earth-box-remove", "earth-box-remove"), + ("earth-minus", "earth-minus"), + ("earth-off", "earth-off"), + ("earth-plus", "earth-plus"), + ("earth-remove", "earth-remove"), + ("ebay", "ebay"), + ("egg", "egg"), + ("egg-easter", "egg-easter"), + ("egg-fried", "egg-fried"), + ("egg-off", "egg-off"), + ("egg-off-outline", "egg-off-outline"), + ("egg-outline", "egg-outline"), + ("eiffel-tower", "eiffel-tower"), + ("eight-track", "eight-track"), + ("eject", "eject"), + ("eject-circle", "eject-circle"), + ("eject-circle-outline", "eject-circle-outline"), + ("eject-outline", "eject-outline"), + ("electric-switch", "electric-switch"), + ("electric-switch-closed", "electric-switch-closed"), + ("electron-framework", "electron-framework"), + ("elephant", "elephant"), + ("elevation-decline", "elevation-decline"), + ("elevation-rise", "elevation-rise"), + ("elevator", "elevator"), + ("elevator-down", "elevator-down"), + ("elevator-passenger", "elevator-passenger"), + ("elevator-passenger-off", "elevator-passenger-off"), + ("elevator-passenger-off-outline", "elevator-passenger-off-outline"), + ("elevator-passenger-outline", "elevator-passenger-outline"), + ("elevator-up", "elevator-up"), + ("ellipse", "ellipse"), + ("ellipse-outline", "ellipse-outline"), + ("email", "email"), + ("email-alert", "email-alert"), + ("email-alert-outline", "email-alert-outline"), + ("email-arrow-left", "email-arrow-left"), + ("email-arrow-left-outline", "email-arrow-left-outline"), + ("email-arrow-right", "email-arrow-right"), + ("email-arrow-right-outline", "email-arrow-right-outline"), + ("email-box", "email-box"), + ("email-check", "email-check"), + ("email-check-outline", "email-check-outline"), + ("email-edit", "email-edit"), + ("email-edit-outline", "email-edit-outline"), + ("email-fast", "email-fast"), + ("email-fast-outline", "email-fast-outline"), + ("email-lock", "email-lock"), + ("email-lock-outline", "email-lock-outline"), + ("email-mark-as-unread", "email-mark-as-unread"), + ("email-minus", "email-minus"), + ("email-minus-outline", "email-minus-outline"), + ("email-multiple", "email-multiple"), + ("email-multiple-outline", "email-multiple-outline"), + ("email-newsletter", "email-newsletter"), + ("email-off", "email-off"), + ("email-off-outline", "email-off-outline"), + ("email-open", "email-open"), + ("email-open-multiple", "email-open-multiple"), + ("email-open-multiple-outline", "email-open-multiple-outline"), + ("email-open-outline", "email-open-outline"), + ("email-outline", "email-outline"), + ("email-plus", "email-plus"), + ("email-plus-outline", "email-plus-outline"), + ("email-remove", "email-remove"), + ("email-remove-outline", "email-remove-outline"), + ("email-seal", "email-seal"), + ("email-seal-outline", "email-seal-outline"), + ("email-search", "email-search"), + ("email-search-outline", "email-search-outline"), + ("email-sync", "email-sync"), + ("email-sync-outline", "email-sync-outline"), + ("email-variant", "email-variant"), + ("ember", "ember"), + ("emby", "emby"), + ("emoticon", "emoticon"), + ("emoticon-angry", "emoticon-angry"), + ("emoticon-angry-outline", "emoticon-angry-outline"), + ("emoticon-confused", "emoticon-confused"), + ("emoticon-confused-outline", "emoticon-confused-outline"), + ("emoticon-cool", "emoticon-cool"), + ("emoticon-cool-outline", "emoticon-cool-outline"), + ("emoticon-cry", "emoticon-cry"), + ("emoticon-cry-outline", "emoticon-cry-outline"), + ("emoticon-dead", "emoticon-dead"), + ("emoticon-dead-outline", "emoticon-dead-outline"), + ("emoticon-devil", "emoticon-devil"), + ("emoticon-devil-outline", "emoticon-devil-outline"), + ("emoticon-excited", "emoticon-excited"), + ("emoticon-excited-outline", "emoticon-excited-outline"), + ("emoticon-frown", "emoticon-frown"), + ("emoticon-frown-outline", "emoticon-frown-outline"), + ("emoticon-happy", "emoticon-happy"), + ("emoticon-happy-outline", "emoticon-happy-outline"), + ("emoticon-kiss", "emoticon-kiss"), + ("emoticon-kiss-outline", "emoticon-kiss-outline"), + ("emoticon-lol", "emoticon-lol"), + ("emoticon-lol-outline", "emoticon-lol-outline"), + ("emoticon-neutral", "emoticon-neutral"), + ("emoticon-neutral-outline", "emoticon-neutral-outline"), + ("emoticon-outline", "emoticon-outline"), + ("emoticon-poop", "emoticon-poop"), + ("emoticon-poop-outline", "emoticon-poop-outline"), + ("emoticon-sad", "emoticon-sad"), + ("emoticon-sad-outline", "emoticon-sad-outline"), + ("emoticon-sick", "emoticon-sick"), + ("emoticon-sick-outline", "emoticon-sick-outline"), + ("emoticon-tongue", "emoticon-tongue"), + ("emoticon-tongue-outline", "emoticon-tongue-outline"), + ("emoticon-wink", "emoticon-wink"), + ("emoticon-wink-outline", "emoticon-wink-outline"), + ("engine", "engine"), + ("engine-off", "engine-off"), + ("engine-off-outline", "engine-off-outline"), + ("engine-outline", "engine-outline"), + ("epsilon", "epsilon"), + ("equal", "equal"), + ("equal-box", "equal-box"), + ("equalizer", "equalizer"), + ("equalizer-outline", "equalizer-outline"), + ("eraser", "eraser"), + ("eraser-variant", "eraser-variant"), + ("escalator", "escalator"), + ("escalator-box", "escalator-box"), + ("escalator-down", "escalator-down"), + ("escalator-up", "escalator-up"), + ("eslint", "eslint"), + ("et", "et"), + ("ethereum", "ethereum"), + ("ethernet", "ethernet"), + ("ethernet-cable", "ethernet-cable"), + ("ethernet-cable-off", "ethernet-cable-off"), + ("etsy", "etsy"), + ("ev-plug-ccs1", "ev-plug-ccs1"), + ("ev-plug-ccs2", "ev-plug-ccs2"), + ("ev-plug-chademo", "ev-plug-chademo"), + ("ev-plug-tesla", "ev-plug-tesla"), + ("ev-plug-type1", "ev-plug-type1"), + ("ev-plug-type2", "ev-plug-type2"), + ("ev-station", "ev-station"), + ("eventbrite", "eventbrite"), + ("evernote", "evernote"), + ("excavator", "excavator"), + ("exclamation", "exclamation"), + ("exclamation-thick", "exclamation-thick"), + ("exit-run", "exit-run"), + ("exit-to-app", "exit-to-app"), + ("expand-all", "expand-all"), + ("expand-all-outline", "expand-all-outline"), + ("expansion-card", "expansion-card"), + ("expansion-card-variant", "expansion-card-variant"), + ("exponent", "exponent"), + ("exponent-box", "exponent-box"), + ("export", "export"), + ("export-variant", "export-variant"), + ("eye", "eye"), + ("eye-arrow-left", "eye-arrow-left"), + ("eye-arrow-left-outline", "eye-arrow-left-outline"), + ("eye-arrow-right", "eye-arrow-right"), + ("eye-arrow-right-outline", "eye-arrow-right-outline"), + ("eye-check", "eye-check"), + ("eye-check-outline", "eye-check-outline"), + ("eye-circle", "eye-circle"), + ("eye-circle-outline", "eye-circle-outline"), + ("eye-lock", "eye-lock"), + ("eye-lock-open", "eye-lock-open"), + ("eye-lock-open-outline", "eye-lock-open-outline"), + ("eye-lock-outline", "eye-lock-outline"), + ("eye-minus", "eye-minus"), + ("eye-minus-outline", "eye-minus-outline"), + ("eye-off", "eye-off"), + ("eye-off-outline", "eye-off-outline"), + ("eye-outline", "eye-outline"), + ("eye-plus", "eye-plus"), + ("eye-plus-outline", "eye-plus-outline"), + ("eye-refresh", "eye-refresh"), + ("eye-refresh-outline", "eye-refresh-outline"), + ("eye-remove", "eye-remove"), + ("eye-remove-outline", "eye-remove-outline"), + ("eye-settings", "eye-settings"), + ("eye-settings-outline", "eye-settings-outline"), + ("eyedropper", "eyedropper"), + ("eyedropper-minus", "eyedropper-minus"), + ("eyedropper-off", "eyedropper-off"), + ("eyedropper-plus", "eyedropper-plus"), + ("eyedropper-remove", "eyedropper-remove"), + ("eyedropper-variant", "eyedropper-variant"), + ("face-agent", "face-agent"), + ("face-man", "face-man"), + ("face-man-outline", "face-man-outline"), + ("face-man-profile", "face-man-profile"), + ("face-man-shimmer", "face-man-shimmer"), + ("face-man-shimmer-outline", "face-man-shimmer-outline"), + ("face-mask", "face-mask"), + ("face-mask-outline", "face-mask-outline"), + ("face-recognition", "face-recognition"), + ("face-woman", "face-woman"), + ("face-woman-outline", "face-woman-outline"), + ("face-woman-profile", "face-woman-profile"), + ("face-woman-shimmer", "face-woman-shimmer"), + ("face-woman-shimmer-outline", "face-woman-shimmer-outline"), + ("facebook", "facebook"), + ("facebook-box", "facebook-box"), + ("facebook-gaming", "facebook-gaming"), + ("facebook-messenger", "facebook-messenger"), + ("facebook-workplace", "facebook-workplace"), + ("factory", "factory"), + ("family-tree", "family-tree"), + ("fan", "fan"), + ("fan-alert", "fan-alert"), + ("fan-auto", "fan-auto"), + ("fan-chevron-down", "fan-chevron-down"), + ("fan-chevron-up", "fan-chevron-up"), + ("fan-clock", "fan-clock"), + ("fan-minus", "fan-minus"), + ("fan-off", "fan-off"), + ("fan-plus", "fan-plus"), + ("fan-remove", "fan-remove"), + ("fan-speed-1", "fan-speed-1"), + ("fan-speed-2", "fan-speed-2"), + ("fan-speed-3", "fan-speed-3"), + ("fast-forward", "fast-forward"), + ("fast-forward-10", "fast-forward-10"), + ("fast-forward-15", "fast-forward-15"), + ("fast-forward-30", "fast-forward-30"), + ("fast-forward-45", "fast-forward-45"), + ("fast-forward-5", "fast-forward-5"), + ("fast-forward-60", "fast-forward-60"), + ("fast-forward-outline", "fast-forward-outline"), + ("faucet", "faucet"), + ("faucet-variant", "faucet-variant"), + ("fax", "fax"), + ("feather", "feather"), + ("feature-search", "feature-search"), + ("feature-search-outline", "feature-search-outline"), + ("fedora", "fedora"), + ("fence", "fence"), + ("fence-electric", "fence-electric"), + ("fencing", "fencing"), + ("ferris-wheel", "ferris-wheel"), + ("ferry", "ferry"), + ("file", "file"), + ("file-account", "file-account"), + ("file-account-outline", "file-account-outline"), + ("file-alert", "file-alert"), + ("file-alert-outline", "file-alert-outline"), + ("file-arrow-left-right", "file-arrow-left-right"), + ("file-arrow-left-right-outline", "file-arrow-left-right-outline"), + ("file-arrow-up-down", "file-arrow-up-down"), + ("file-arrow-up-down-outline", "file-arrow-up-down-outline"), + ("file-cabinet", "file-cabinet"), + ("file-cad", "file-cad"), + ("file-cad-box", "file-cad-box"), + ("file-cancel", "file-cancel"), + ("file-cancel-outline", "file-cancel-outline"), + ("file-certificate", "file-certificate"), + ("file-certificate-outline", "file-certificate-outline"), + ("file-chart", "file-chart"), + ("file-chart-check", "file-chart-check"), + ("file-chart-check-outline", "file-chart-check-outline"), + ("file-chart-outline", "file-chart-outline"), + ("file-check", "file-check"), + ("file-check-outline", "file-check-outline"), + ("file-clock", "file-clock"), + ("file-clock-outline", "file-clock-outline"), + ("file-cloud", "file-cloud"), + ("file-cloud-outline", "file-cloud-outline"), + ("file-code", "file-code"), + ("file-code-outline", "file-code-outline"), + ("file-cog", "file-cog"), + ("file-cog-outline", "file-cog-outline"), + ("file-compare", "file-compare"), + ("file-delimited", "file-delimited"), + ("file-delimited-outline", "file-delimited-outline"), + ("file-document", "file-document"), + ("file-document-alert", "file-document-alert"), + ("file-document-alert-outline", "file-document-alert-outline"), + ("file-document-arrow-right", "file-document-arrow-right"), + ("file-document-arrow-right-outline", "file-document-arrow-right-outline"), + ("file-document-check", "file-document-check"), + ("file-document-check-outline", "file-document-check-outline"), + ("file-document-edit", "file-document-edit"), + ("file-document-edit-outline", "file-document-edit-outline"), + ("file-document-minus", "file-document-minus"), + ("file-document-minus-outline", "file-document-minus-outline"), + ("file-document-multiple", "file-document-multiple"), + ("file-document-multiple-outline", "file-document-multiple-outline"), + ("file-document-outline", "file-document-outline"), + ("file-document-plus", "file-document-plus"), + ("file-document-plus-outline", "file-document-plus-outline"), + ("file-document-remove", "file-document-remove"), + ("file-document-remove-outline", "file-document-remove-outline"), + ("file-download", "file-download"), + ("file-download-outline", "file-download-outline"), + ("file-edit", "file-edit"), + ("file-edit-outline", "file-edit-outline"), + ("file-excel", "file-excel"), + ("file-excel-box", "file-excel-box"), + ("file-excel-box-outline", "file-excel-box-outline"), + ("file-excel-outline", "file-excel-outline"), + ("file-export", "file-export"), + ("file-export-outline", "file-export-outline"), + ("file-eye", "file-eye"), + ("file-eye-outline", "file-eye-outline"), + ("file-find", "file-find"), + ("file-find-outline", "file-find-outline"), + ("file-gif-box", "file-gif-box"), + ("file-hidden", "file-hidden"), + ("file-image", "file-image"), + ("file-image-box", "file-image-box"), + ("file-image-marker", "file-image-marker"), + ("file-image-marker-outline", "file-image-marker-outline"), + ("file-image-minus", "file-image-minus"), + ("file-image-minus-outline", "file-image-minus-outline"), + ("file-image-outline", "file-image-outline"), + ("file-image-plus", "file-image-plus"), + ("file-image-plus-outline", "file-image-plus-outline"), + ("file-image-remove", "file-image-remove"), + ("file-image-remove-outline", "file-image-remove-outline"), + ("file-import", "file-import"), + ("file-import-outline", "file-import-outline"), + ("file-jpg-box", "file-jpg-box"), + ("file-key", "file-key"), + ("file-key-outline", "file-key-outline"), + ("file-link", "file-link"), + ("file-link-outline", "file-link-outline"), + ("file-lock", "file-lock"), + ("file-lock-open", "file-lock-open"), + ("file-lock-open-outline", "file-lock-open-outline"), + ("file-lock-outline", "file-lock-outline"), + ("file-marker", "file-marker"), + ("file-marker-outline", "file-marker-outline"), + ("file-minus", "file-minus"), + ("file-minus-outline", "file-minus-outline"), + ("file-move", "file-move"), + ("file-move-outline", "file-move-outline"), + ("file-multiple", "file-multiple"), + ("file-multiple-outline", "file-multiple-outline"), + ("file-music", "file-music"), + ("file-music-outline", "file-music-outline"), + ("file-outline", "file-outline"), + ("file-pdf", "file-pdf"), + ("file-pdf-box", "file-pdf-box"), + ("file-pdf-box-outline", "file-pdf-box-outline"), + ("file-pdf-outline", "file-pdf-outline"), + ("file-percent", "file-percent"), + ("file-percent-outline", "file-percent-outline"), + ("file-phone", "file-phone"), + ("file-phone-outline", "file-phone-outline"), + ("file-plus", "file-plus"), + ("file-plus-outline", "file-plus-outline"), + ("file-png-box", "file-png-box"), + ("file-powerpoint", "file-powerpoint"), + ("file-powerpoint-box", "file-powerpoint-box"), + ("file-powerpoint-box-outline", "file-powerpoint-box-outline"), + ("file-powerpoint-outline", "file-powerpoint-outline"), + ("file-presentation-box", "file-presentation-box"), + ("file-question", "file-question"), + ("file-question-outline", "file-question-outline"), + ("file-refresh", "file-refresh"), + ("file-refresh-outline", "file-refresh-outline"), + ("file-remove", "file-remove"), + ("file-remove-outline", "file-remove-outline"), + ("file-replace", "file-replace"), + ("file-replace-outline", "file-replace-outline"), + ("file-restore", "file-restore"), + ("file-restore-outline", "file-restore-outline"), + ("file-rotate-left", "file-rotate-left"), + ("file-rotate-left-outline", "file-rotate-left-outline"), + ("file-rotate-right", "file-rotate-right"), + ("file-rotate-right-outline", "file-rotate-right-outline"), + ("file-search", "file-search"), + ("file-search-outline", "file-search-outline"), + ("file-send", "file-send"), + ("file-send-outline", "file-send-outline"), + ("file-settings", "file-settings"), + ("file-settings-outline", "file-settings-outline"), + ("file-sign", "file-sign"), + ("file-star", "file-star"), + ("file-star-outline", "file-star-outline"), + ("file-swap", "file-swap"), + ("file-swap-outline", "file-swap-outline"), + ("file-sync", "file-sync"), + ("file-sync-outline", "file-sync-outline"), + ("file-table", "file-table"), + ("file-table-box", "file-table-box"), + ("file-table-box-multiple", "file-table-box-multiple"), + ("file-table-box-multiple-outline", "file-table-box-multiple-outline"), + ("file-table-box-outline", "file-table-box-outline"), + ("file-table-outline", "file-table-outline"), + ("file-tree", "file-tree"), + ("file-tree-outline", "file-tree-outline"), + ("file-undo", "file-undo"), + ("file-undo-outline", "file-undo-outline"), + ("file-upload", "file-upload"), + ("file-upload-outline", "file-upload-outline"), + ("file-video", "file-video"), + ("file-video-outline", "file-video-outline"), + ("file-word", "file-word"), + ("file-word-box", "file-word-box"), + ("file-word-box-outline", "file-word-box-outline"), + ("file-word-outline", "file-word-outline"), + ("file-xml", "file-xml"), + ("file-xml-box", "file-xml-box"), + ("fill", "fill"), + ("film", "film"), + ("filmstrip", "filmstrip"), + ("filmstrip-box", "filmstrip-box"), + ("filmstrip-box-multiple", "filmstrip-box-multiple"), + ("filmstrip-off", "filmstrip-off"), + ("filter", "filter"), + ("filter-check", "filter-check"), + ("filter-check-outline", "filter-check-outline"), + ("filter-cog", "filter-cog"), + ("filter-cog-outline", "filter-cog-outline"), + ("filter-menu", "filter-menu"), + ("filter-menu-outline", "filter-menu-outline"), + ("filter-minus", "filter-minus"), + ("filter-minus-outline", "filter-minus-outline"), + ("filter-multiple", "filter-multiple"), + ("filter-multiple-outline", "filter-multiple-outline"), + ("filter-off", "filter-off"), + ("filter-off-outline", "filter-off-outline"), + ("filter-outline", "filter-outline"), + ("filter-plus", "filter-plus"), + ("filter-plus-outline", "filter-plus-outline"), + ("filter-remove", "filter-remove"), + ("filter-remove-outline", "filter-remove-outline"), + ("filter-settings", "filter-settings"), + ("filter-settings-outline", "filter-settings-outline"), + ("filter-variant", "filter-variant"), + ("filter-variant-minus", "filter-variant-minus"), + ("filter-variant-plus", "filter-variant-plus"), + ("filter-variant-remove", "filter-variant-remove"), + ("finance", "finance"), + ("find-replace", "find-replace"), + ("fingerprint", "fingerprint"), + ("fingerprint-off", "fingerprint-off"), + ("fire", "fire"), + ("fire-alert", "fire-alert"), + ("fire-circle", "fire-circle"), + ("fire-extinguisher", "fire-extinguisher"), + ("fire-hydrant", "fire-hydrant"), + ("fire-hydrant-alert", "fire-hydrant-alert"), + ("fire-hydrant-off", "fire-hydrant-off"), + ("fire-off", "fire-off"), + ("fire-truck", "fire-truck"), + ("firebase", "firebase"), + ("firefox", "firefox"), + ("fireplace", "fireplace"), + ("fireplace-off", "fireplace-off"), + ("firewire", "firewire"), + ("firework", "firework"), + ("firework-off", "firework-off"), + ("fish", "fish"), + ("fish-off", "fish-off"), + ("fishbowl", "fishbowl"), + ("fishbowl-outline", "fishbowl-outline"), + ("fit-to-page", "fit-to-page"), + ("fit-to-page-outline", "fit-to-page-outline"), + ("fit-to-screen", "fit-to-screen"), + ("fit-to-screen-outline", "fit-to-screen-outline"), + ("flag", "flag"), + ("flag-checkered", "flag-checkered"), + ("flag-checkered-variant", "flag-checkered-variant"), + ("flag-minus", "flag-minus"), + ("flag-minus-outline", "flag-minus-outline"), + ("flag-off", "flag-off"), + ("flag-off-outline", "flag-off-outline"), + ("flag-outline", "flag-outline"), + ("flag-outline-variant", "flag-outline-variant"), + ("flag-plus", "flag-plus"), + ("flag-plus-outline", "flag-plus-outline"), + ("flag-remove", "flag-remove"), + ("flag-remove-outline", "flag-remove-outline"), + ("flag-triangle", "flag-triangle"), + ("flag-variant", "flag-variant"), + ("flag-variant-minus", "flag-variant-minus"), + ("flag-variant-minus-outline", "flag-variant-minus-outline"), + ("flag-variant-off", "flag-variant-off"), + ("flag-variant-off-outline", "flag-variant-off-outline"), + ("flag-variant-outline", "flag-variant-outline"), + ("flag-variant-plus", "flag-variant-plus"), + ("flag-variant-plus-outline", "flag-variant-plus-outline"), + ("flag-variant-remove", "flag-variant-remove"), + ("flag-variant-remove-outline", "flag-variant-remove-outline"), + ("flare", "flare"), + ("flash", "flash"), + ("flash-alert", "flash-alert"), + ("flash-alert-outline", "flash-alert-outline"), + ("flash-auto", "flash-auto"), + ("flash-off", "flash-off"), + ("flash-off-outline", "flash-off-outline"), + ("flash-outline", "flash-outline"), + ("flash-red-eye", "flash-red-eye"), + ("flash-triangle", "flash-triangle"), + ("flash-triangle-outline", "flash-triangle-outline"), + ("flashlight", "flashlight"), + ("flashlight-off", "flashlight-off"), + ("flask", "flask"), + ("flask-empty", "flask-empty"), + ("flask-empty-minus", "flask-empty-minus"), + ("flask-empty-minus-outline", "flask-empty-minus-outline"), + ("flask-empty-off", "flask-empty-off"), + ("flask-empty-off-outline", "flask-empty-off-outline"), + ("flask-empty-outline", "flask-empty-outline"), + ("flask-empty-plus", "flask-empty-plus"), + ("flask-empty-plus-outline", "flask-empty-plus-outline"), + ("flask-empty-remove", "flask-empty-remove"), + ("flask-empty-remove-outline", "flask-empty-remove-outline"), + ("flask-minus", "flask-minus"), + ("flask-minus-outline", "flask-minus-outline"), + ("flask-off", "flask-off"), + ("flask-off-outline", "flask-off-outline"), + ("flask-outline", "flask-outline"), + ("flask-plus", "flask-plus"), + ("flask-plus-outline", "flask-plus-outline"), + ("flask-remove", "flask-remove"), + ("flask-remove-outline", "flask-remove-outline"), + ("flask-round-bottom", "flask-round-bottom"), + ("flask-round-bottom-empty", "flask-round-bottom-empty"), + ("flask-round-bottom-empty-outline", "flask-round-bottom-empty-outline"), + ("flask-round-bottom-outline", "flask-round-bottom-outline"), + ("flattr", "flattr"), + ("fleur-de-lis", "fleur-de-lis"), + ("flickr", "flickr"), + ("flickr-after", "flickr-after"), + ("flickr-before", "flickr-before"), + ("flip-horizontal", "flip-horizontal"), + ("flip-to-back", "flip-to-back"), + ("flip-to-front", "flip-to-front"), + ("flip-vertical", "flip-vertical"), + ("floor-1", "floor-1"), + ("floor-2", "floor-2"), + ("floor-3", "floor-3"), + ("floor-a", "floor-a"), + ("floor-b", "floor-b"), + ("floor-g", "floor-g"), + ("floor-l", "floor-l"), + ("floor-lamp", "floor-lamp"), + ("floor-lamp-dual", "floor-lamp-dual"), + ("floor-lamp-dual-outline", "floor-lamp-dual-outline"), + ("floor-lamp-outline", "floor-lamp-outline"), + ("floor-lamp-torchiere", "floor-lamp-torchiere"), + ("floor-lamp-torchiere-outline", "floor-lamp-torchiere-outline"), + ("floor-lamp-torchiere-variant", "floor-lamp-torchiere-variant"), + ( + "floor-lamp-torchiere-variant-outline", + "floor-lamp-torchiere-variant-outline", + ), + ("floor-plan", "floor-plan"), + ("floppy", "floppy"), + ("floppy-variant", "floppy-variant"), + ("flower", "flower"), + ("flower-outline", "flower-outline"), + ("flower-pollen", "flower-pollen"), + ("flower-pollen-outline", "flower-pollen-outline"), + ("flower-poppy", "flower-poppy"), + ("flower-tulip", "flower-tulip"), + ("flower-tulip-outline", "flower-tulip-outline"), + ("focus-auto", "focus-auto"), + ("focus-field", "focus-field"), + ("focus-field-horizontal", "focus-field-horizontal"), + ("focus-field-vertical", "focus-field-vertical"), + ("folder", "folder"), + ("folder-account", "folder-account"), + ("folder-account-outline", "folder-account-outline"), + ("folder-alert", "folder-alert"), + ("folder-alert-outline", "folder-alert-outline"), + ("folder-arrow-down", "folder-arrow-down"), + ("folder-arrow-down-outline", "folder-arrow-down-outline"), + ("folder-arrow-left", "folder-arrow-left"), + ("folder-arrow-left-outline", "folder-arrow-left-outline"), + ("folder-arrow-left-right", "folder-arrow-left-right"), + ("folder-arrow-left-right-outline", "folder-arrow-left-right-outline"), + ("folder-arrow-right", "folder-arrow-right"), + ("folder-arrow-right-outline", "folder-arrow-right-outline"), + ("folder-arrow-up", "folder-arrow-up"), + ("folder-arrow-up-down", "folder-arrow-up-down"), + ("folder-arrow-up-down-outline", "folder-arrow-up-down-outline"), + ("folder-arrow-up-outline", "folder-arrow-up-outline"), + ("folder-cancel", "folder-cancel"), + ("folder-cancel-outline", "folder-cancel-outline"), + ("folder-check", "folder-check"), + ("folder-check-outline", "folder-check-outline"), + ("folder-clock", "folder-clock"), + ("folder-clock-outline", "folder-clock-outline"), + ("folder-cog", "folder-cog"), + ("folder-cog-outline", "folder-cog-outline"), + ("folder-download", "folder-download"), + ("folder-download-outline", "folder-download-outline"), + ("folder-edit", "folder-edit"), + ("folder-edit-outline", "folder-edit-outline"), + ("folder-eye", "folder-eye"), + ("folder-eye-outline", "folder-eye-outline"), + ("folder-file", "folder-file"), + ("folder-file-outline", "folder-file-outline"), + ("folder-google-drive", "folder-google-drive"), + ("folder-heart", "folder-heart"), + ("folder-heart-outline", "folder-heart-outline"), + ("folder-hidden", "folder-hidden"), + ("folder-home", "folder-home"), + ("folder-home-outline", "folder-home-outline"), + ("folder-image", "folder-image"), + ("folder-information", "folder-information"), + ("folder-information-outline", "folder-information-outline"), + ("folder-key", "folder-key"), + ("folder-key-network", "folder-key-network"), + ("folder-key-network-outline", "folder-key-network-outline"), + ("folder-key-outline", "folder-key-outline"), + ("folder-lock", "folder-lock"), + ("folder-lock-open", "folder-lock-open"), + ("folder-lock-open-outline", "folder-lock-open-outline"), + ("folder-lock-outline", "folder-lock-outline"), + ("folder-marker", "folder-marker"), + ("folder-marker-outline", "folder-marker-outline"), + ("folder-minus", "folder-minus"), + ("folder-minus-outline", "folder-minus-outline"), + ("folder-move", "folder-move"), + ("folder-move-outline", "folder-move-outline"), + ("folder-multiple", "folder-multiple"), + ("folder-multiple-image", "folder-multiple-image"), + ("folder-multiple-outline", "folder-multiple-outline"), + ("folder-multiple-plus", "folder-multiple-plus"), + ("folder-multiple-plus-outline", "folder-multiple-plus-outline"), + ("folder-music", "folder-music"), + ("folder-music-outline", "folder-music-outline"), + ("folder-network", "folder-network"), + ("folder-network-outline", "folder-network-outline"), + ("folder-off", "folder-off"), + ("folder-off-outline", "folder-off-outline"), + ("folder-open", "folder-open"), + ("folder-open-outline", "folder-open-outline"), + ("folder-outline", "folder-outline"), + ("folder-outline-lock", "folder-outline-lock"), + ("folder-play", "folder-play"), + ("folder-play-outline", "folder-play-outline"), + ("folder-plus", "folder-plus"), + ("folder-plus-outline", "folder-plus-outline"), + ("folder-pound", "folder-pound"), + ("folder-pound-outline", "folder-pound-outline"), + ("folder-question", "folder-question"), + ("folder-question-outline", "folder-question-outline"), + ("folder-refresh", "folder-refresh"), + ("folder-refresh-outline", "folder-refresh-outline"), + ("folder-remove", "folder-remove"), + ("folder-remove-outline", "folder-remove-outline"), + ("folder-search", "folder-search"), + ("folder-search-outline", "folder-search-outline"), + ("folder-settings", "folder-settings"), + ("folder-settings-outline", "folder-settings-outline"), + ("folder-star", "folder-star"), + ("folder-star-multiple", "folder-star-multiple"), + ("folder-star-multiple-outline", "folder-star-multiple-outline"), + ("folder-star-outline", "folder-star-outline"), + ("folder-swap", "folder-swap"), + ("folder-swap-outline", "folder-swap-outline"), + ("folder-sync", "folder-sync"), + ("folder-sync-outline", "folder-sync-outline"), + ("folder-table", "folder-table"), + ("folder-table-outline", "folder-table-outline"), + ("folder-text", "folder-text"), + ("folder-text-outline", "folder-text-outline"), + ("folder-upload", "folder-upload"), + ("folder-upload-outline", "folder-upload-outline"), + ("folder-wrench", "folder-wrench"), + ("folder-wrench-outline", "folder-wrench-outline"), + ("folder-zip", "folder-zip"), + ("folder-zip-outline", "folder-zip-outline"), + ("font-awesome", "font-awesome"), + ("food", "food"), + ("food-apple", "food-apple"), + ("food-apple-outline", "food-apple-outline"), + ("food-croissant", "food-croissant"), + ("food-drumstick", "food-drumstick"), + ("food-drumstick-off", "food-drumstick-off"), + ("food-drumstick-off-outline", "food-drumstick-off-outline"), + ("food-drumstick-outline", "food-drumstick-outline"), + ("food-fork-drink", "food-fork-drink"), + ("food-halal", "food-halal"), + ("food-hot-dog", "food-hot-dog"), + ("food-kosher", "food-kosher"), + ("food-off", "food-off"), + ("food-off-outline", "food-off-outline"), + ("food-outline", "food-outline"), + ("food-steak", "food-steak"), + ("food-steak-off", "food-steak-off"), + ("food-takeout-box", "food-takeout-box"), + ("food-takeout-box-outline", "food-takeout-box-outline"), + ("food-turkey", "food-turkey"), + ("food-variant", "food-variant"), + ("food-variant-off", "food-variant-off"), + ("foot-print", "foot-print"), + ("football", "football"), + ("football-australian", "football-australian"), + ("football-helmet", "football-helmet"), + ("footer", "footer"), + ("forest", "forest"), + ("forklift", "forklift"), + ("form-dropdown", "form-dropdown"), + ("form-select", "form-select"), + ("form-textarea", "form-textarea"), + ("form-textbox", "form-textbox"), + ("form-textbox-lock", "form-textbox-lock"), + ("form-textbox-password", "form-textbox-password"), + ("format-align-bottom", "format-align-bottom"), + ("format-align-center", "format-align-center"), + ("format-align-justify", "format-align-justify"), + ("format-align-left", "format-align-left"), + ("format-align-middle", "format-align-middle"), + ("format-align-right", "format-align-right"), + ("format-align-top", "format-align-top"), + ("format-annotation-minus", "format-annotation-minus"), + ("format-annotation-plus", "format-annotation-plus"), + ("format-bold", "format-bold"), + ("format-clear", "format-clear"), + ("format-color", "format-color"), + ("format-color-fill", "format-color-fill"), + ("format-color-highlight", "format-color-highlight"), + ("format-color-marker-cancel", "format-color-marker-cancel"), + ("format-color-text", "format-color-text"), + ("format-columns", "format-columns"), + ("format-float-center", "format-float-center"), + ("format-float-left", "format-float-left"), + ("format-float-none", "format-float-none"), + ("format-float-right", "format-float-right"), + ("format-font", "format-font"), + ("format-font-size-decrease", "format-font-size-decrease"), + ("format-font-size-increase", "format-font-size-increase"), + ("format-header-1", "format-header-1"), + ("format-header-2", "format-header-2"), + ("format-header-3", "format-header-3"), + ("format-header-4", "format-header-4"), + ("format-header-5", "format-header-5"), + ("format-header-6", "format-header-6"), + ("format-header-decrease", "format-header-decrease"), + ("format-header-down", "format-header-down"), + ("format-header-equal", "format-header-equal"), + ("format-header-increase", "format-header-increase"), + ("format-header-pound", "format-header-pound"), + ("format-header-up", "format-header-up"), + ("format-horizontal-align-center", "format-horizontal-align-center"), + ("format-horizontal-align-left", "format-horizontal-align-left"), + ("format-horizontal-align-right", "format-horizontal-align-right"), + ("format-indent-decrease", "format-indent-decrease"), + ("format-indent-increase", "format-indent-increase"), + ("format-italic", "format-italic"), + ("format-letter-case", "format-letter-case"), + ("format-letter-case-lower", "format-letter-case-lower"), + ("format-letter-case-upper", "format-letter-case-upper"), + ("format-letter-ends-with", "format-letter-ends-with"), + ("format-letter-matches", "format-letter-matches"), + ("format-letter-spacing", "format-letter-spacing"), + ("format-letter-spacing-variant", "format-letter-spacing-variant"), + ("format-letter-starts-with", "format-letter-starts-with"), + ("format-line-height", "format-line-height"), + ("format-line-spacing", "format-line-spacing"), + ("format-line-style", "format-line-style"), + ("format-line-weight", "format-line-weight"), + ("format-list-bulleted", "format-list-bulleted"), + ("format-list-bulleted-square", "format-list-bulleted-square"), + ("format-list-bulleted-triangle", "format-list-bulleted-triangle"), + ("format-list-bulleted-type", "format-list-bulleted-type"), + ("format-list-checkbox", "format-list-checkbox"), + ("format-list-checks", "format-list-checks"), + ("format-list-group", "format-list-group"), + ("format-list-group-plus", "format-list-group-plus"), + ("format-list-numbered", "format-list-numbered"), + ("format-list-numbered-rtl", "format-list-numbered-rtl"), + ("format-list-text", "format-list-text"), + ("format-list-triangle", "format-list-triangle"), + ("format-overline", "format-overline"), + ("format-page-break", "format-page-break"), + ("format-page-split", "format-page-split"), + ("format-paint", "format-paint"), + ("format-paragraph", "format-paragraph"), + ("format-paragraph-spacing", "format-paragraph-spacing"), + ("format-pilcrow", "format-pilcrow"), + ("format-pilcrow-arrow-left", "format-pilcrow-arrow-left"), + ("format-pilcrow-arrow-right", "format-pilcrow-arrow-right"), + ("format-quote-close", "format-quote-close"), + ("format-quote-close-outline", "format-quote-close-outline"), + ("format-quote-open", "format-quote-open"), + ("format-quote-open-outline", "format-quote-open-outline"), + ("format-rotate-90", "format-rotate-90"), + ("format-section", "format-section"), + ("format-size", "format-size"), + ("format-strikethrough", "format-strikethrough"), + ("format-strikethrough-variant", "format-strikethrough-variant"), + ("format-subscript", "format-subscript"), + ("format-superscript", "format-superscript"), + ("format-text", "format-text"), + ("format-text-rotation-angle-down", "format-text-rotation-angle-down"), + ("format-text-rotation-angle-up", "format-text-rotation-angle-up"), + ("format-text-rotation-down", "format-text-rotation-down"), + ("format-text-rotation-down-vertical", "format-text-rotation-down-vertical"), + ("format-text-rotation-none", "format-text-rotation-none"), + ("format-text-rotation-up", "format-text-rotation-up"), + ("format-text-rotation-vertical", "format-text-rotation-vertical"), + ("format-text-variant", "format-text-variant"), + ("format-text-variant-outline", "format-text-variant-outline"), + ("format-text-wrapping-clip", "format-text-wrapping-clip"), + ("format-text-wrapping-overflow", "format-text-wrapping-overflow"), + ("format-text-wrapping-wrap", "format-text-wrapping-wrap"), + ("format-textbox", "format-textbox"), + ("format-title", "format-title"), + ("format-underline", "format-underline"), + ("format-underline-wavy", "format-underline-wavy"), + ("format-vertical-align-bottom", "format-vertical-align-bottom"), + ("format-vertical-align-center", "format-vertical-align-center"), + ("format-vertical-align-top", "format-vertical-align-top"), + ("format-wrap-inline", "format-wrap-inline"), + ("format-wrap-square", "format-wrap-square"), + ("format-wrap-tight", "format-wrap-tight"), + ("format-wrap-top-bottom", "format-wrap-top-bottom"), + ("forum", "forum"), + ("forum-minus", "forum-minus"), + ("forum-minus-outline", "forum-minus-outline"), + ("forum-outline", "forum-outline"), + ("forum-plus", "forum-plus"), + ("forum-plus-outline", "forum-plus-outline"), + ("forum-remove", "forum-remove"), + ("forum-remove-outline", "forum-remove-outline"), + ("forward", "forward"), + ("forwardburger", "forwardburger"), + ("fountain", "fountain"), + ("fountain-pen", "fountain-pen"), + ("fountain-pen-tip", "fountain-pen-tip"), + ("foursquare", "foursquare"), + ("fraction-one-half", "fraction-one-half"), + ("freebsd", "freebsd"), + ("french-fries", "french-fries"), + ("frequently-asked-questions", "frequently-asked-questions"), + ("fridge", "fridge"), + ("fridge-alert", "fridge-alert"), + ("fridge-alert-outline", "fridge-alert-outline"), + ("fridge-bottom", "fridge-bottom"), + ("fridge-industrial", "fridge-industrial"), + ("fridge-industrial-alert", "fridge-industrial-alert"), + ("fridge-industrial-alert-outline", "fridge-industrial-alert-outline"), + ("fridge-industrial-off", "fridge-industrial-off"), + ("fridge-industrial-off-outline", "fridge-industrial-off-outline"), + ("fridge-industrial-outline", "fridge-industrial-outline"), + ("fridge-off", "fridge-off"), + ("fridge-off-outline", "fridge-off-outline"), + ("fridge-outline", "fridge-outline"), + ("fridge-top", "fridge-top"), + ("fridge-variant", "fridge-variant"), + ("fridge-variant-alert", "fridge-variant-alert"), + ("fridge-variant-alert-outline", "fridge-variant-alert-outline"), + ("fridge-variant-off", "fridge-variant-off"), + ("fridge-variant-off-outline", "fridge-variant-off-outline"), + ("fridge-variant-outline", "fridge-variant-outline"), + ("fruit-cherries", "fruit-cherries"), + ("fruit-cherries-off", "fruit-cherries-off"), + ("fruit-citrus", "fruit-citrus"), + ("fruit-citrus-off", "fruit-citrus-off"), + ("fruit-grapes", "fruit-grapes"), + ("fruit-grapes-outline", "fruit-grapes-outline"), + ("fruit-pear", "fruit-pear"), + ("fruit-pineapple", "fruit-pineapple"), + ("fruit-watermelon", "fruit-watermelon"), + ("fuel", "fuel"), + ("fuel-cell", "fuel-cell"), + ("fullscreen", "fullscreen"), + ("fullscreen-exit", "fullscreen-exit"), + ("function", "function"), + ("function-variant", "function-variant"), + ("furigana-horizontal", "furigana-horizontal"), + ("furigana-vertical", "furigana-vertical"), + ("fuse", "fuse"), + ("fuse-alert", "fuse-alert"), + ("fuse-blade", "fuse-blade"), + ("fuse-off", "fuse-off"), + ("gamepad", "gamepad"), + ("gamepad-circle", "gamepad-circle"), + ("gamepad-circle-down", "gamepad-circle-down"), + ("gamepad-circle-left", "gamepad-circle-left"), + ("gamepad-circle-outline", "gamepad-circle-outline"), + ("gamepad-circle-right", "gamepad-circle-right"), + ("gamepad-circle-up", "gamepad-circle-up"), + ("gamepad-down", "gamepad-down"), + ("gamepad-left", "gamepad-left"), + ("gamepad-outline", "gamepad-outline"), + ("gamepad-right", "gamepad-right"), + ("gamepad-round", "gamepad-round"), + ("gamepad-round-down", "gamepad-round-down"), + ("gamepad-round-left", "gamepad-round-left"), + ("gamepad-round-outline", "gamepad-round-outline"), + ("gamepad-round-right", "gamepad-round-right"), + ("gamepad-round-up", "gamepad-round-up"), + ("gamepad-square", "gamepad-square"), + ("gamepad-square-outline", "gamepad-square-outline"), + ("gamepad-up", "gamepad-up"), + ("gamepad-variant", "gamepad-variant"), + ("gamepad-variant-outline", "gamepad-variant-outline"), + ("gamma", "gamma"), + ("gantry-crane", "gantry-crane"), + ("garage", "garage"), + ("garage-alert", "garage-alert"), + ("garage-alert-variant", "garage-alert-variant"), + ("garage-lock", "garage-lock"), + ("garage-open", "garage-open"), + ("garage-open-variant", "garage-open-variant"), + ("garage-variant", "garage-variant"), + ("garage-variant-lock", "garage-variant-lock"), + ("gas-burner", "gas-burner"), + ("gas-cylinder", "gas-cylinder"), + ("gas-station", "gas-station"), + ("gas-station-off", "gas-station-off"), + ("gas-station-off-outline", "gas-station-off-outline"), + ("gas-station-outline", "gas-station-outline"), + ("gate", "gate"), + ("gate-alert", "gate-alert"), + ("gate-and", "gate-and"), + ("gate-arrow-left", "gate-arrow-left"), + ("gate-arrow-right", "gate-arrow-right"), + ("gate-buffer", "gate-buffer"), + ("gate-nand", "gate-nand"), + ("gate-nor", "gate-nor"), + ("gate-not", "gate-not"), + ("gate-open", "gate-open"), + ("gate-or", "gate-or"), + ("gate-xnor", "gate-xnor"), + ("gate-xor", "gate-xor"), + ("gatsby", "gatsby"), + ("gauge", "gauge"), + ("gauge-empty", "gauge-empty"), + ("gauge-full", "gauge-full"), + ("gauge-low", "gauge-low"), + ("gavel", "gavel"), + ("gender-female", "gender-female"), + ("gender-male", "gender-male"), + ("gender-male-female", "gender-male-female"), + ("gender-male-female-variant", "gender-male-female-variant"), + ("gender-non-binary", "gender-non-binary"), + ("gender-transgender", "gender-transgender"), + ("gentoo", "gentoo"), + ("gesture", "gesture"), + ("gesture-double-tap", "gesture-double-tap"), + ("gesture-pinch", "gesture-pinch"), + ("gesture-spread", "gesture-spread"), + ("gesture-swipe", "gesture-swipe"), + ("gesture-swipe-down", "gesture-swipe-down"), + ("gesture-swipe-horizontal", "gesture-swipe-horizontal"), + ("gesture-swipe-left", "gesture-swipe-left"), + ("gesture-swipe-right", "gesture-swipe-right"), + ("gesture-swipe-up", "gesture-swipe-up"), + ("gesture-swipe-vertical", "gesture-swipe-vertical"), + ("gesture-tap", "gesture-tap"), + ("gesture-tap-box", "gesture-tap-box"), + ("gesture-tap-button", "gesture-tap-button"), + ("gesture-tap-hold", "gesture-tap-hold"), + ("gesture-two-double-tap", "gesture-two-double-tap"), + ("gesture-two-tap", "gesture-two-tap"), + ("ghost", "ghost"), + ("ghost-off", "ghost-off"), + ("ghost-off-outline", "ghost-off-outline"), + ("ghost-outline", "ghost-outline"), + ("gif", "gif"), + ("gift", "gift"), + ("gift-off", "gift-off"), + ("gift-off-outline", "gift-off-outline"), + ("gift-open", "gift-open"), + ("gift-open-outline", "gift-open-outline"), + ("gift-outline", "gift-outline"), + ("git", "git"), + ("github", "github"), + ("github-box", "github-box"), + ("github-face", "github-face"), + ("gitlab", "gitlab"), + ("glass-cocktail", "glass-cocktail"), + ("glass-cocktail-off", "glass-cocktail-off"), + ("glass-flute", "glass-flute"), + ("glass-fragile", "glass-fragile"), + ("glass-mug", "glass-mug"), + ("glass-mug-off", "glass-mug-off"), + ("glass-mug-variant", "glass-mug-variant"), + ("glass-mug-variant-off", "glass-mug-variant-off"), + ("glass-pint-outline", "glass-pint-outline"), + ("glass-stange", "glass-stange"), + ("glass-tulip", "glass-tulip"), + ("glass-wine", "glass-wine"), + ("glassdoor", "glassdoor"), + ("glasses", "glasses"), + ("globe-light", "globe-light"), + ("globe-light-outline", "globe-light-outline"), + ("globe-model", "globe-model"), + ("gmail", "gmail"), + ("gnome", "gnome"), + ("go-kart", "go-kart"), + ("go-kart-track", "go-kart-track"), + ("gog", "gog"), + ("gold", "gold"), + ("golf", "golf"), + ("golf-cart", "golf-cart"), + ("golf-tee", "golf-tee"), + ("gondola", "gondola"), + ("goodreads", "goodreads"), + ("google", "google"), + ("google-ads", "google-ads"), + ("google-allo", "google-allo"), + ("google-analytics", "google-analytics"), + ("google-assistant", "google-assistant"), + ("google-cardboard", "google-cardboard"), + ("google-chrome", "google-chrome"), + ("google-circles", "google-circles"), + ("google-circles-communities", "google-circles-communities"), + ("google-circles-extended", "google-circles-extended"), + ("google-circles-group", "google-circles-group"), + ("google-classroom", "google-classroom"), + ("google-cloud", "google-cloud"), + ("google-downasaur", "google-downasaur"), + ("google-drive", "google-drive"), + ("google-earth", "google-earth"), + ("google-fit", "google-fit"), + ("google-glass", "google-glass"), + ("google-hangouts", "google-hangouts"), + ("google-home", "google-home"), + ("google-keep", "google-keep"), + ("google-lens", "google-lens"), + ("google-maps", "google-maps"), + ("google-my-business", "google-my-business"), + ("google-nearby", "google-nearby"), + ("google-pages", "google-pages"), + ("google-photos", "google-photos"), + ("google-physical-web", "google-physical-web"), + ("google-play", "google-play"), + ("google-plus", "google-plus"), + ("google-plus-box", "google-plus-box"), + ("google-podcast", "google-podcast"), + ("google-spreadsheet", "google-spreadsheet"), + ("google-street-view", "google-street-view"), + ("google-translate", "google-translate"), + ("google-wallet", "google-wallet"), + ("gradient-horizontal", "gradient-horizontal"), + ("gradient-vertical", "gradient-vertical"), + ("grain", "grain"), + ("graph", "graph"), + ("graph-outline", "graph-outline"), + ("graphql", "graphql"), + ("grass", "grass"), + ("grave-stone", "grave-stone"), + ("grease-pencil", "grease-pencil"), + ("greater-than", "greater-than"), + ("greater-than-or-equal", "greater-than-or-equal"), + ("greenhouse", "greenhouse"), + ("grid", "grid"), + ("grid-large", "grid-large"), + ("grid-off", "grid-off"), + ("grill", "grill"), + ("grill-outline", "grill-outline"), + ("group", "group"), + ("guitar-acoustic", "guitar-acoustic"), + ("guitar-electric", "guitar-electric"), + ("guitar-pick", "guitar-pick"), + ("guitar-pick-outline", "guitar-pick-outline"), + ("guy-fawkes-mask", "guy-fawkes-mask"), + ("gymnastics", "gymnastics"), + ("hail", "hail"), + ("hair-dryer", "hair-dryer"), + ("hair-dryer-outline", "hair-dryer-outline"), + ("halloween", "halloween"), + ("hamburger", "hamburger"), + ("hamburger-check", "hamburger-check"), + ("hamburger-minus", "hamburger-minus"), + ("hamburger-off", "hamburger-off"), + ("hamburger-plus", "hamburger-plus"), + ("hamburger-remove", "hamburger-remove"), + ("hammer", "hammer"), + ("hammer-screwdriver", "hammer-screwdriver"), + ("hammer-sickle", "hammer-sickle"), + ("hammer-wrench", "hammer-wrench"), + ("hand-back-left", "hand-back-left"), + ("hand-back-left-off", "hand-back-left-off"), + ("hand-back-left-off-outline", "hand-back-left-off-outline"), + ("hand-back-left-outline", "hand-back-left-outline"), + ("hand-back-right", "hand-back-right"), + ("hand-back-right-off", "hand-back-right-off"), + ("hand-back-right-off-outline", "hand-back-right-off-outline"), + ("hand-back-right-outline", "hand-back-right-outline"), + ("hand-clap", "hand-clap"), + ("hand-clap-off", "hand-clap-off"), + ("hand-coin", "hand-coin"), + ("hand-coin-outline", "hand-coin-outline"), + ("hand-cycle", "hand-cycle"), + ("hand-extended", "hand-extended"), + ("hand-extended-outline", "hand-extended-outline"), + ("hand-front-left", "hand-front-left"), + ("hand-front-left-outline", "hand-front-left-outline"), + ("hand-front-right", "hand-front-right"), + ("hand-front-right-outline", "hand-front-right-outline"), + ("hand-heart", "hand-heart"), + ("hand-heart-outline", "hand-heart-outline"), + ("hand-left", "hand-left"), + ("hand-okay", "hand-okay"), + ("hand-peace", "hand-peace"), + ("hand-peace-variant", "hand-peace-variant"), + ("hand-pointing-down", "hand-pointing-down"), + ("hand-pointing-left", "hand-pointing-left"), + ("hand-pointing-right", "hand-pointing-right"), + ("hand-pointing-up", "hand-pointing-up"), + ("hand-right", "hand-right"), + ("hand-saw", "hand-saw"), + ("hand-wash", "hand-wash"), + ("hand-wash-outline", "hand-wash-outline"), + ("hand-water", "hand-water"), + ("hand-wave", "hand-wave"), + ("hand-wave-outline", "hand-wave-outline"), + ("handball", "handball"), + ("handcuffs", "handcuffs"), + ("hands-pray", "hands-pray"), + ("handshake", "handshake"), + ("handshake-outline", "handshake-outline"), + ("hanger", "hanger"), + ("hangouts", "hangouts"), + ("hard-hat", "hard-hat"), + ("harddisk", "harddisk"), + ("harddisk-plus", "harddisk-plus"), + ("harddisk-remove", "harddisk-remove"), + ("hat-fedora", "hat-fedora"), + ("hazard-lights", "hazard-lights"), + ("hdmi-port", "hdmi-port"), + ("hdr", "hdr"), + ("hdr-off", "hdr-off"), + ("head", "head"), + ("head-alert", "head-alert"), + ("head-alert-outline", "head-alert-outline"), + ("head-check", "head-check"), + ("head-check-outline", "head-check-outline"), + ("head-cog", "head-cog"), + ("head-cog-outline", "head-cog-outline"), + ("head-dots-horizontal", "head-dots-horizontal"), + ("head-dots-horizontal-outline", "head-dots-horizontal-outline"), + ("head-flash", "head-flash"), + ("head-flash-outline", "head-flash-outline"), + ("head-heart", "head-heart"), + ("head-heart-outline", "head-heart-outline"), + ("head-lightbulb", "head-lightbulb"), + ("head-lightbulb-outline", "head-lightbulb-outline"), + ("head-minus", "head-minus"), + ("head-minus-outline", "head-minus-outline"), + ("head-outline", "head-outline"), + ("head-plus", "head-plus"), + ("head-plus-outline", "head-plus-outline"), + ("head-question", "head-question"), + ("head-question-outline", "head-question-outline"), + ("head-remove", "head-remove"), + ("head-remove-outline", "head-remove-outline"), + ("head-snowflake", "head-snowflake"), + ("head-snowflake-outline", "head-snowflake-outline"), + ("head-sync", "head-sync"), + ("head-sync-outline", "head-sync-outline"), + ("headphones", "headphones"), + ("headphones-bluetooth", "headphones-bluetooth"), + ("headphones-box", "headphones-box"), + ("headphones-off", "headphones-off"), + ("headphones-settings", "headphones-settings"), + ("headset", "headset"), + ("headset-dock", "headset-dock"), + ("headset-off", "headset-off"), + ("heart", "heart"), + ("heart-box", "heart-box"), + ("heart-box-outline", "heart-box-outline"), + ("heart-broken", "heart-broken"), + ("heart-broken-outline", "heart-broken-outline"), + ("heart-circle", "heart-circle"), + ("heart-circle-outline", "heart-circle-outline"), + ("heart-cog", "heart-cog"), + ("heart-cog-outline", "heart-cog-outline"), + ("heart-flash", "heart-flash"), + ("heart-half", "heart-half"), + ("heart-half-full", "heart-half-full"), + ("heart-half-outline", "heart-half-outline"), + ("heart-minus", "heart-minus"), + ("heart-minus-outline", "heart-minus-outline"), + ("heart-multiple", "heart-multiple"), + ("heart-multiple-outline", "heart-multiple-outline"), + ("heart-off", "heart-off"), + ("heart-off-outline", "heart-off-outline"), + ("heart-outline", "heart-outline"), + ("heart-plus", "heart-plus"), + ("heart-plus-outline", "heart-plus-outline"), + ("heart-pulse", "heart-pulse"), + ("heart-remove", "heart-remove"), + ("heart-remove-outline", "heart-remove-outline"), + ("heart-settings", "heart-settings"), + ("heart-settings-outline", "heart-settings-outline"), + ("heat-pump", "heat-pump"), + ("heat-pump-outline", "heat-pump-outline"), + ("heat-wave", "heat-wave"), + ("heating-coil", "heating-coil"), + ("helicopter", "helicopter"), + ("help", "help"), + ("help-box", "help-box"), + ("help-box-multiple", "help-box-multiple"), + ("help-box-multiple-outline", "help-box-multiple-outline"), + ("help-box-outline", "help-box-outline"), + ("help-circle", "help-circle"), + ("help-circle-outline", "help-circle-outline"), + ("help-network", "help-network"), + ("help-network-outline", "help-network-outline"), + ("help-rhombus", "help-rhombus"), + ("help-rhombus-outline", "help-rhombus-outline"), + ("hexadecimal", "hexadecimal"), + ("hexagon", "hexagon"), + ("hexagon-multiple", "hexagon-multiple"), + ("hexagon-multiple-outline", "hexagon-multiple-outline"), + ("hexagon-outline", "hexagon-outline"), + ("hexagon-slice-1", "hexagon-slice-1"), + ("hexagon-slice-2", "hexagon-slice-2"), + ("hexagon-slice-3", "hexagon-slice-3"), + ("hexagon-slice-4", "hexagon-slice-4"), + ("hexagon-slice-5", "hexagon-slice-5"), + ("hexagon-slice-6", "hexagon-slice-6"), + ("hexagram", "hexagram"), + ("hexagram-outline", "hexagram-outline"), + ("high-definition", "high-definition"), + ("high-definition-box", "high-definition-box"), + ("highway", "highway"), + ("hiking", "hiking"), + ("history", "history"), + ("hockey-puck", "hockey-puck"), + ("hockey-sticks", "hockey-sticks"), + ("hololens", "hololens"), + ("home", "home"), + ("home-account", "home-account"), + ("home-alert", "home-alert"), + ("home-alert-outline", "home-alert-outline"), + ("home-analytics", "home-analytics"), + ("home-assistant", "home-assistant"), + ("home-automation", "home-automation"), + ("home-battery", "home-battery"), + ("home-battery-outline", "home-battery-outline"), + ("home-circle", "home-circle"), + ("home-circle-outline", "home-circle-outline"), + ("home-city", "home-city"), + ("home-city-outline", "home-city-outline"), + ("home-clock", "home-clock"), + ("home-clock-outline", "home-clock-outline"), + ("home-currency-usd", "home-currency-usd"), + ("home-edit", "home-edit"), + ("home-edit-outline", "home-edit-outline"), + ("home-export-outline", "home-export-outline"), + ("home-flood", "home-flood"), + ("home-floor-0", "home-floor-0"), + ("home-floor-1", "home-floor-1"), + ("home-floor-2", "home-floor-2"), + ("home-floor-3", "home-floor-3"), + ("home-floor-a", "home-floor-a"), + ("home-floor-b", "home-floor-b"), + ("home-floor-g", "home-floor-g"), + ("home-floor-l", "home-floor-l"), + ("home-floor-negative-1", "home-floor-negative-1"), + ("home-group", "home-group"), + ("home-group-minus", "home-group-minus"), + ("home-group-plus", "home-group-plus"), + ("home-group-remove", "home-group-remove"), + ("home-heart", "home-heart"), + ("home-import-outline", "home-import-outline"), + ("home-lightbulb", "home-lightbulb"), + ("home-lightbulb-outline", "home-lightbulb-outline"), + ("home-lightning-bolt", "home-lightning-bolt"), + ("home-lightning-bolt-outline", "home-lightning-bolt-outline"), + ("home-lock", "home-lock"), + ("home-lock-open", "home-lock-open"), + ("home-map-marker", "home-map-marker"), + ("home-minus", "home-minus"), + ("home-minus-outline", "home-minus-outline"), + ("home-modern", "home-modern"), + ("home-off", "home-off"), + ("home-off-outline", "home-off-outline"), + ("home-outline", "home-outline"), + ("home-plus", "home-plus"), + ("home-plus-outline", "home-plus-outline"), + ("home-remove", "home-remove"), + ("home-remove-outline", "home-remove-outline"), + ("home-roof", "home-roof"), + ("home-search", "home-search"), + ("home-search-outline", "home-search-outline"), + ("home-silo", "home-silo"), + ("home-silo-outline", "home-silo-outline"), + ("home-switch", "home-switch"), + ("home-switch-outline", "home-switch-outline"), + ("home-thermometer", "home-thermometer"), + ("home-thermometer-outline", "home-thermometer-outline"), + ("home-variant", "home-variant"), + ("home-variant-outline", "home-variant-outline"), + ("hook", "hook"), + ("hook-off", "hook-off"), + ("hoop-house", "hoop-house"), + ("hops", "hops"), + ("horizontal-rotate-clockwise", "horizontal-rotate-clockwise"), + ("horizontal-rotate-counterclockwise", "horizontal-rotate-counterclockwise"), + ("horse", "horse"), + ("horse-human", "horse-human"), + ("horse-variant", "horse-variant"), + ("horse-variant-fast", "horse-variant-fast"), + ("horseshoe", "horseshoe"), + ("hospital", "hospital"), + ("hospital-box", "hospital-box"), + ("hospital-box-outline", "hospital-box-outline"), + ("hospital-building", "hospital-building"), + ("hospital-marker", "hospital-marker"), + ("hot-tub", "hot-tub"), + ("hours-24", "hours-24"), + ("houzz", "houzz"), + ("houzz-box", "houzz-box"), + ("hubspot", "hubspot"), + ("hulu", "hulu"), + ("human", "human"), + ("human-baby-changing-table", "human-baby-changing-table"), + ("human-cane", "human-cane"), + ("human-capacity-decrease", "human-capacity-decrease"), + ("human-capacity-increase", "human-capacity-increase"), + ("human-child", "human-child"), + ("human-dolly", "human-dolly"), + ("human-edit", "human-edit"), + ("human-female", "human-female"), + ("human-female-boy", "human-female-boy"), + ("human-female-dance", "human-female-dance"), + ("human-female-female", "human-female-female"), + ("human-female-girl", "human-female-girl"), + ("human-greeting", "human-greeting"), + ("human-greeting-proximity", "human-greeting-proximity"), + ("human-greeting-variant", "human-greeting-variant"), + ("human-handsdown", "human-handsdown"), + ("human-handsup", "human-handsup"), + ("human-male", "human-male"), + ("human-male-board", "human-male-board"), + ("human-male-board-poll", "human-male-board-poll"), + ("human-male-boy", "human-male-boy"), + ("human-male-child", "human-male-child"), + ("human-male-female", "human-male-female"), + ("human-male-female-child", "human-male-female-child"), + ("human-male-girl", "human-male-girl"), + ("human-male-height", "human-male-height"), + ("human-male-height-variant", "human-male-height-variant"), + ("human-male-male", "human-male-male"), + ("human-non-binary", "human-non-binary"), + ("human-pregnant", "human-pregnant"), + ("human-queue", "human-queue"), + ("human-scooter", "human-scooter"), + ("human-walker", "human-walker"), + ("human-wheelchair", "human-wheelchair"), + ("human-white-cane", "human-white-cane"), + ("humble-bundle", "humble-bundle"), + ("hurricane", "hurricane"), + ("hvac", "hvac"), + ("hvac-off", "hvac-off"), + ("hydraulic-oil-level", "hydraulic-oil-level"), + ("hydraulic-oil-temperature", "hydraulic-oil-temperature"), + ("hydro-power", "hydro-power"), + ("hydrogen-station", "hydrogen-station"), + ("ice-cream", "ice-cream"), + ("ice-cream-off", "ice-cream-off"), + ("ice-pop", "ice-pop"), + ("id-card", "id-card"), + ("identifier", "identifier"), + ("ideogram-cjk", "ideogram-cjk"), + ("ideogram-cjk-variant", "ideogram-cjk-variant"), + ("image", "image"), + ("image-album", "image-album"), + ("image-area", "image-area"), + ("image-area-close", "image-area-close"), + ("image-auto-adjust", "image-auto-adjust"), + ("image-broken", "image-broken"), + ("image-broken-variant", "image-broken-variant"), + ("image-check", "image-check"), + ("image-check-outline", "image-check-outline"), + ("image-edit", "image-edit"), + ("image-edit-outline", "image-edit-outline"), + ("image-filter-black-white", "image-filter-black-white"), + ("image-filter-center-focus", "image-filter-center-focus"), + ("image-filter-center-focus-strong", "image-filter-center-focus-strong"), + ( + "image-filter-center-focus-strong-outline", + "image-filter-center-focus-strong-outline", + ), + ("image-filter-center-focus-weak", "image-filter-center-focus-weak"), + ("image-filter-drama", "image-filter-drama"), + ("image-filter-drama-outline", "image-filter-drama-outline"), + ("image-filter-frames", "image-filter-frames"), + ("image-filter-hdr", "image-filter-hdr"), + ("image-filter-none", "image-filter-none"), + ("image-filter-tilt-shift", "image-filter-tilt-shift"), + ("image-filter-vintage", "image-filter-vintage"), + ("image-frame", "image-frame"), + ("image-lock", "image-lock"), + ("image-lock-outline", "image-lock-outline"), + ("image-marker", "image-marker"), + ("image-marker-outline", "image-marker-outline"), + ("image-minus", "image-minus"), + ("image-minus-outline", "image-minus-outline"), + ("image-move", "image-move"), + ("image-multiple", "image-multiple"), + ("image-multiple-outline", "image-multiple-outline"), + ("image-off", "image-off"), + ("image-off-outline", "image-off-outline"), + ("image-outline", "image-outline"), + ("image-plus", "image-plus"), + ("image-plus-outline", "image-plus-outline"), + ("image-refresh", "image-refresh"), + ("image-refresh-outline", "image-refresh-outline"), + ("image-remove", "image-remove"), + ("image-remove-outline", "image-remove-outline"), + ("image-search", "image-search"), + ("image-search-outline", "image-search-outline"), + ("image-size-select-actual", "image-size-select-actual"), + ("image-size-select-large", "image-size-select-large"), + ("image-size-select-small", "image-size-select-small"), + ("image-sync", "image-sync"), + ("image-sync-outline", "image-sync-outline"), + ("image-text", "image-text"), + ("import", "import"), + ("inbox", "inbox"), + ("inbox-arrow-down", "inbox-arrow-down"), + ("inbox-arrow-down-outline", "inbox-arrow-down-outline"), + ("inbox-arrow-up", "inbox-arrow-up"), + ("inbox-arrow-up-outline", "inbox-arrow-up-outline"), + ("inbox-full", "inbox-full"), + ("inbox-full-outline", "inbox-full-outline"), + ("inbox-multiple", "inbox-multiple"), + ("inbox-multiple-outline", "inbox-multiple-outline"), + ("inbox-outline", "inbox-outline"), + ("inbox-remove", "inbox-remove"), + ("inbox-remove-outline", "inbox-remove-outline"), + ("incognito", "incognito"), + ("incognito-circle", "incognito-circle"), + ("incognito-circle-off", "incognito-circle-off"), + ("incognito-off", "incognito-off"), + ("indent", "indent"), + ("induction", "induction"), + ("infinity", "infinity"), + ("information", "information"), + ("information-off", "information-off"), + ("information-off-outline", "information-off-outline"), + ("information-outline", "information-outline"), + ("information-variant", "information-variant"), + ("instagram", "instagram"), + ("instapaper", "instapaper"), + ("instrument-triangle", "instrument-triangle"), + ("integrated-circuit-chip", "integrated-circuit-chip"), + ("invert-colors", "invert-colors"), + ("invert-colors-off", "invert-colors-off"), + ("iobroker", "iobroker"), + ("ip", "ip"), + ("ip-network", "ip-network"), + ("ip-network-outline", "ip-network-outline"), + ("ip-outline", "ip-outline"), + ("ipod", "ipod"), + ("iron", "iron"), + ("iron-board", "iron-board"), + ("iron-outline", "iron-outline"), + ("island", "island"), + ("itunes", "itunes"), + ("iv-bag", "iv-bag"), + ("jabber", "jabber"), + ("jeepney", "jeepney"), + ("jellyfish", "jellyfish"), + ("jellyfish-outline", "jellyfish-outline"), + ("jira", "jira"), + ("jquery", "jquery"), + ("jsfiddle", "jsfiddle"), + ("jump-rope", "jump-rope"), + ("kabaddi", "kabaddi"), + ("kangaroo", "kangaroo"), + ("karate", "karate"), + ("kayaking", "kayaking"), + ("keg", "keg"), + ("kettle", "kettle"), + ("kettle-alert", "kettle-alert"), + ("kettle-alert-outline", "kettle-alert-outline"), + ("kettle-off", "kettle-off"), + ("kettle-off-outline", "kettle-off-outline"), + ("kettle-outline", "kettle-outline"), + ("kettle-pour-over", "kettle-pour-over"), + ("kettle-steam", "kettle-steam"), + ("kettle-steam-outline", "kettle-steam-outline"), + ("kettlebell", "kettlebell"), + ("key", "key"), + ("key-alert", "key-alert"), + ("key-alert-outline", "key-alert-outline"), + ("key-arrow-right", "key-arrow-right"), + ("key-chain", "key-chain"), + ("key-chain-variant", "key-chain-variant"), + ("key-change", "key-change"), + ("key-link", "key-link"), + ("key-minus", "key-minus"), + ("key-outline", "key-outline"), + ("key-plus", "key-plus"), + ("key-remove", "key-remove"), + ("key-star", "key-star"), + ("key-variant", "key-variant"), + ("key-wireless", "key-wireless"), + ("keyboard", "keyboard"), + ("keyboard-backspace", "keyboard-backspace"), + ("keyboard-caps", "keyboard-caps"), + ("keyboard-close", "keyboard-close"), + ("keyboard-close-outline", "keyboard-close-outline"), + ("keyboard-esc", "keyboard-esc"), + ("keyboard-f1", "keyboard-f1"), + ("keyboard-f10", "keyboard-f10"), + ("keyboard-f11", "keyboard-f11"), + ("keyboard-f12", "keyboard-f12"), + ("keyboard-f2", "keyboard-f2"), + ("keyboard-f3", "keyboard-f3"), + ("keyboard-f4", "keyboard-f4"), + ("keyboard-f5", "keyboard-f5"), + ("keyboard-f6", "keyboard-f6"), + ("keyboard-f7", "keyboard-f7"), + ("keyboard-f8", "keyboard-f8"), + ("keyboard-f9", "keyboard-f9"), + ("keyboard-off", "keyboard-off"), + ("keyboard-off-outline", "keyboard-off-outline"), + ("keyboard-outline", "keyboard-outline"), + ("keyboard-return", "keyboard-return"), + ("keyboard-settings", "keyboard-settings"), + ("keyboard-settings-outline", "keyboard-settings-outline"), + ("keyboard-space", "keyboard-space"), + ("keyboard-tab", "keyboard-tab"), + ("keyboard-tab-reverse", "keyboard-tab-reverse"), + ("keyboard-variant", "keyboard-variant"), + ("khanda", "khanda"), + ("kickstarter", "kickstarter"), + ("kite", "kite"), + ("kite-outline", "kite-outline"), + ("kitesurfing", "kitesurfing"), + ("klingon", "klingon"), + ("knife", "knife"), + ("knife-military", "knife-military"), + ("knob", "knob"), + ("koala", "koala"), + ("kodi", "kodi"), + ("kubernetes", "kubernetes"), + ("label", "label"), + ("label-multiple", "label-multiple"), + ("label-multiple-outline", "label-multiple-outline"), + ("label-off", "label-off"), + ("label-off-outline", "label-off-outline"), + ("label-outline", "label-outline"), + ("label-percent", "label-percent"), + ("label-percent-outline", "label-percent-outline"), + ("label-variant", "label-variant"), + ("label-variant-outline", "label-variant-outline"), + ("ladder", "ladder"), + ("ladybug", "ladybug"), + ("lambda", "lambda"), + ("lamp", "lamp"), + ("lamp-outline", "lamp-outline"), + ("lamps", "lamps"), + ("lamps-outline", "lamps-outline"), + ("lan", "lan"), + ("lan-check", "lan-check"), + ("lan-connect", "lan-connect"), + ("lan-disconnect", "lan-disconnect"), + ("lan-pending", "lan-pending"), + ("land-fields", "land-fields"), + ("land-plots", "land-plots"), + ("land-plots-circle", "land-plots-circle"), + ("land-plots-circle-variant", "land-plots-circle-variant"), + ("land-rows-horizontal", "land-rows-horizontal"), + ("land-rows-vertical", "land-rows-vertical"), + ("landslide", "landslide"), + ("landslide-outline", "landslide-outline"), + ("language-c", "language-c"), + ("language-cpp", "language-cpp"), + ("language-csharp", "language-csharp"), + ("language-css3", "language-css3"), + ("language-fortran", "language-fortran"), + ("language-go", "language-go"), + ("language-haskell", "language-haskell"), + ("language-html5", "language-html5"), + ("language-java", "language-java"), + ("language-javascript", "language-javascript"), + ("language-jsx", "language-jsx"), + ("language-kotlin", "language-kotlin"), + ("language-lua", "language-lua"), + ("language-markdown", "language-markdown"), + ("language-markdown-outline", "language-markdown-outline"), + ("language-php", "language-php"), + ("language-python", "language-python"), + ("language-python-text", "language-python-text"), + ("language-r", "language-r"), + ("language-ruby", "language-ruby"), + ("language-ruby-on-rails", "language-ruby-on-rails"), + ("language-rust", "language-rust"), + ("language-swift", "language-swift"), + ("language-typescript", "language-typescript"), + ("language-xaml", "language-xaml"), + ("laptop", "laptop"), + ("laptop-account", "laptop-account"), + ("laptop-chromebook", "laptop-chromebook"), + ("laptop-mac", "laptop-mac"), + ("laptop-off", "laptop-off"), + ("laptop-windows", "laptop-windows"), + ("laravel", "laravel"), + ("laser-pointer", "laser-pointer"), + ("lasso", "lasso"), + ("lastfm", "lastfm"), + ("lastpass", "lastpass"), + ("latitude", "latitude"), + ("launch", "launch"), + ("lava-lamp", "lava-lamp"), + ("layers", "layers"), + ("layers-edit", "layers-edit"), + ("layers-minus", "layers-minus"), + ("layers-off", "layers-off"), + ("layers-off-outline", "layers-off-outline"), + ("layers-outline", "layers-outline"), + ("layers-plus", "layers-plus"), + ("layers-remove", "layers-remove"), + ("layers-search", "layers-search"), + ("layers-search-outline", "layers-search-outline"), + ("layers-triple", "layers-triple"), + ("layers-triple-outline", "layers-triple-outline"), + ("lead-pencil", "lead-pencil"), + ("leaf", "leaf"), + ("leaf-circle", "leaf-circle"), + ("leaf-circle-outline", "leaf-circle-outline"), + ("leaf-maple", "leaf-maple"), + ("leaf-maple-off", "leaf-maple-off"), + ("leaf-off", "leaf-off"), + ("leak", "leak"), + ("leak-off", "leak-off"), + ("lectern", "lectern"), + ("led-off", "led-off"), + ("led-on", "led-on"), + ("led-outline", "led-outline"), + ("led-strip", "led-strip"), + ("led-strip-variant", "led-strip-variant"), + ("led-strip-variant-off", "led-strip-variant-off"), + ("led-variant-off", "led-variant-off"), + ("led-variant-on", "led-variant-on"), + ("led-variant-outline", "led-variant-outline"), + ("leek", "leek"), + ("less-than", "less-than"), + ("less-than-or-equal", "less-than-or-equal"), + ("library", "library"), + ("library-books", "library-books"), + ("library-outline", "library-outline"), + ("library-shelves", "library-shelves"), + ("license", "license"), + ("lifebuoy", "lifebuoy"), + ("light-flood-down", "light-flood-down"), + ("light-flood-up", "light-flood-up"), + ("light-recessed", "light-recessed"), + ("light-switch", "light-switch"), + ("light-switch-off", "light-switch-off"), + ("lightbulb", "lightbulb"), + ("lightbulb-alert", "lightbulb-alert"), + ("lightbulb-alert-outline", "lightbulb-alert-outline"), + ("lightbulb-auto", "lightbulb-auto"), + ("lightbulb-auto-outline", "lightbulb-auto-outline"), + ("lightbulb-cfl", "lightbulb-cfl"), + ("lightbulb-cfl-off", "lightbulb-cfl-off"), + ("lightbulb-cfl-spiral", "lightbulb-cfl-spiral"), + ("lightbulb-cfl-spiral-off", "lightbulb-cfl-spiral-off"), + ("lightbulb-fluorescent-tube", "lightbulb-fluorescent-tube"), + ("lightbulb-fluorescent-tube-outline", "lightbulb-fluorescent-tube-outline"), + ("lightbulb-group", "lightbulb-group"), + ("lightbulb-group-off", "lightbulb-group-off"), + ("lightbulb-group-off-outline", "lightbulb-group-off-outline"), + ("lightbulb-group-outline", "lightbulb-group-outline"), + ("lightbulb-multiple", "lightbulb-multiple"), + ("lightbulb-multiple-off", "lightbulb-multiple-off"), + ("lightbulb-multiple-off-outline", "lightbulb-multiple-off-outline"), + ("lightbulb-multiple-outline", "lightbulb-multiple-outline"), + ("lightbulb-night", "lightbulb-night"), + ("lightbulb-night-outline", "lightbulb-night-outline"), + ("lightbulb-off", "lightbulb-off"), + ("lightbulb-off-outline", "lightbulb-off-outline"), + ("lightbulb-on", "lightbulb-on"), + ("lightbulb-on-10", "lightbulb-on-10"), + ("lightbulb-on-20", "lightbulb-on-20"), + ("lightbulb-on-30", "lightbulb-on-30"), + ("lightbulb-on-40", "lightbulb-on-40"), + ("lightbulb-on-50", "lightbulb-on-50"), + ("lightbulb-on-60", "lightbulb-on-60"), + ("lightbulb-on-70", "lightbulb-on-70"), + ("lightbulb-on-80", "lightbulb-on-80"), + ("lightbulb-on-90", "lightbulb-on-90"), + ("lightbulb-on-outline", "lightbulb-on-outline"), + ("lightbulb-outline", "lightbulb-outline"), + ("lightbulb-question", "lightbulb-question"), + ("lightbulb-question-outline", "lightbulb-question-outline"), + ("lightbulb-spot", "lightbulb-spot"), + ("lightbulb-spot-off", "lightbulb-spot-off"), + ("lightbulb-variant", "lightbulb-variant"), + ("lightbulb-variant-outline", "lightbulb-variant-outline"), + ("lighthouse", "lighthouse"), + ("lighthouse-on", "lighthouse-on"), + ("lightning-bolt", "lightning-bolt"), + ("lightning-bolt-circle", "lightning-bolt-circle"), + ("lightning-bolt-outline", "lightning-bolt-outline"), + ("line-scan", "line-scan"), + ("lingerie", "lingerie"), + ("link", "link"), + ("link-box", "link-box"), + ("link-box-outline", "link-box-outline"), + ("link-box-variant", "link-box-variant"), + ("link-box-variant-outline", "link-box-variant-outline"), + ("link-lock", "link-lock"), + ("link-off", "link-off"), + ("link-plus", "link-plus"), + ("link-variant", "link-variant"), + ("link-variant-minus", "link-variant-minus"), + ("link-variant-off", "link-variant-off"), + ("link-variant-plus", "link-variant-plus"), + ("link-variant-remove", "link-variant-remove"), + ("linkedin", "linkedin"), + ("linode", "linode"), + ("linux", "linux"), + ("linux-mint", "linux-mint"), + ("lipstick", "lipstick"), + ("liquid-spot", "liquid-spot"), + ("liquor", "liquor"), + ("list-box", "list-box"), + ("list-box-outline", "list-box-outline"), + ("list-status", "list-status"), + ("litecoin", "litecoin"), + ("loading", "loading"), + ("location-enter", "location-enter"), + ("location-exit", "location-exit"), + ("lock", "lock"), + ("lock-alert", "lock-alert"), + ("lock-alert-outline", "lock-alert-outline"), + ("lock-check", "lock-check"), + ("lock-check-outline", "lock-check-outline"), + ("lock-clock", "lock-clock"), + ("lock-minus", "lock-minus"), + ("lock-minus-outline", "lock-minus-outline"), + ("lock-off", "lock-off"), + ("lock-off-outline", "lock-off-outline"), + ("lock-open", "lock-open"), + ("lock-open-alert", "lock-open-alert"), + ("lock-open-alert-outline", "lock-open-alert-outline"), + ("lock-open-check", "lock-open-check"), + ("lock-open-check-outline", "lock-open-check-outline"), + ("lock-open-minus", "lock-open-minus"), + ("lock-open-minus-outline", "lock-open-minus-outline"), + ("lock-open-outline", "lock-open-outline"), + ("lock-open-plus", "lock-open-plus"), + ("lock-open-plus-outline", "lock-open-plus-outline"), + ("lock-open-remove", "lock-open-remove"), + ("lock-open-remove-outline", "lock-open-remove-outline"), + ("lock-open-variant", "lock-open-variant"), + ("lock-open-variant-outline", "lock-open-variant-outline"), + ("lock-outline", "lock-outline"), + ("lock-pattern", "lock-pattern"), + ("lock-percent", "lock-percent"), + ("lock-percent-open", "lock-percent-open"), + ("lock-percent-open-outline", "lock-percent-open-outline"), + ("lock-percent-open-variant", "lock-percent-open-variant"), + ("lock-percent-open-variant-outline", "lock-percent-open-variant-outline"), + ("lock-percent-outline", "lock-percent-outline"), + ("lock-plus", "lock-plus"), + ("lock-plus-outline", "lock-plus-outline"), + ("lock-question", "lock-question"), + ("lock-remove", "lock-remove"), + ("lock-remove-outline", "lock-remove-outline"), + ("lock-reset", "lock-reset"), + ("lock-smart", "lock-smart"), + ("locker", "locker"), + ("locker-multiple", "locker-multiple"), + ("login", "login"), + ("login-variant", "login-variant"), + ("logout", "logout"), + ("logout-variant", "logout-variant"), + ("longitude", "longitude"), + ("looks", "looks"), + ("lotion", "lotion"), + ("lotion-outline", "lotion-outline"), + ("lotion-plus", "lotion-plus"), + ("lotion-plus-outline", "lotion-plus-outline"), + ("loupe", "loupe"), + ("lumx", "lumx"), + ("lungs", "lungs"), + ("lyft", "lyft"), + ("mace", "mace"), + ("magazine-pistol", "magazine-pistol"), + ("magazine-rifle", "magazine-rifle"), + ("magic-staff", "magic-staff"), + ("magnet", "magnet"), + ("magnet-on", "magnet-on"), + ("magnify", "magnify"), + ("magnify-close", "magnify-close"), + ("magnify-expand", "magnify-expand"), + ("magnify-minus", "magnify-minus"), + ("magnify-minus-cursor", "magnify-minus-cursor"), + ("magnify-minus-outline", "magnify-minus-outline"), + ("magnify-plus", "magnify-plus"), + ("magnify-plus-cursor", "magnify-plus-cursor"), + ("magnify-plus-outline", "magnify-plus-outline"), + ("magnify-remove-cursor", "magnify-remove-cursor"), + ("magnify-remove-outline", "magnify-remove-outline"), + ("magnify-scan", "magnify-scan"), + ("mail", "mail"), + ("mail-ru", "mail-ru"), + ("mailbox", "mailbox"), + ("mailbox-open", "mailbox-open"), + ("mailbox-open-outline", "mailbox-open-outline"), + ("mailbox-open-up", "mailbox-open-up"), + ("mailbox-open-up-outline", "mailbox-open-up-outline"), + ("mailbox-outline", "mailbox-outline"), + ("mailbox-up", "mailbox-up"), + ("mailbox-up-outline", "mailbox-up-outline"), + ("manjaro", "manjaro"), + ("map", "map"), + ("map-check", "map-check"), + ("map-check-outline", "map-check-outline"), + ("map-clock", "map-clock"), + ("map-clock-outline", "map-clock-outline"), + ("map-legend", "map-legend"), + ("map-marker", "map-marker"), + ("map-marker-account", "map-marker-account"), + ("map-marker-account-outline", "map-marker-account-outline"), + ("map-marker-alert", "map-marker-alert"), + ("map-marker-alert-outline", "map-marker-alert-outline"), + ("map-marker-check", "map-marker-check"), + ("map-marker-check-outline", "map-marker-check-outline"), + ("map-marker-circle", "map-marker-circle"), + ("map-marker-distance", "map-marker-distance"), + ("map-marker-down", "map-marker-down"), + ("map-marker-left", "map-marker-left"), + ("map-marker-left-outline", "map-marker-left-outline"), + ("map-marker-minus", "map-marker-minus"), + ("map-marker-minus-outline", "map-marker-minus-outline"), + ("map-marker-multiple", "map-marker-multiple"), + ("map-marker-multiple-outline", "map-marker-multiple-outline"), + ("map-marker-off", "map-marker-off"), + ("map-marker-off-outline", "map-marker-off-outline"), + ("map-marker-outline", "map-marker-outline"), + ("map-marker-path", "map-marker-path"), + ("map-marker-plus", "map-marker-plus"), + ("map-marker-plus-outline", "map-marker-plus-outline"), + ("map-marker-question", "map-marker-question"), + ("map-marker-question-outline", "map-marker-question-outline"), + ("map-marker-radius", "map-marker-radius"), + ("map-marker-radius-outline", "map-marker-radius-outline"), + ("map-marker-remove", "map-marker-remove"), + ("map-marker-remove-outline", "map-marker-remove-outline"), + ("map-marker-remove-variant", "map-marker-remove-variant"), + ("map-marker-right", "map-marker-right"), + ("map-marker-right-outline", "map-marker-right-outline"), + ("map-marker-star", "map-marker-star"), + ("map-marker-star-outline", "map-marker-star-outline"), + ("map-marker-up", "map-marker-up"), + ("map-minus", "map-minus"), + ("map-outline", "map-outline"), + ("map-plus", "map-plus"), + ("map-search", "map-search"), + ("map-search-outline", "map-search-outline"), + ("mapbox", "mapbox"), + ("margin", "margin"), + ("marker", "marker"), + ("marker-cancel", "marker-cancel"), + ("marker-check", "marker-check"), + ("mastodon", "mastodon"), + ("mastodon-variant", "mastodon-variant"), + ("material-design", "material-design"), + ("material-ui", "material-ui"), + ("math-compass", "math-compass"), + ("math-cos", "math-cos"), + ("math-integral", "math-integral"), + ("math-integral-box", "math-integral-box"), + ("math-log", "math-log"), + ("math-norm", "math-norm"), + ("math-norm-box", "math-norm-box"), + ("math-sin", "math-sin"), + ("math-tan", "math-tan"), + ("matrix", "matrix"), + ("maxcdn", "maxcdn"), + ("medal", "medal"), + ("medal-outline", "medal-outline"), + ("medical-bag", "medical-bag"), + ("medical-cotton-swab", "medical-cotton-swab"), + ("medication", "medication"), + ("medication-outline", "medication-outline"), + ("meditation", "meditation"), + ("medium", "medium"), + ("meetup", "meetup"), + ("memory", "memory"), + ("menorah", "menorah"), + ("menorah-fire", "menorah-fire"), + ("menu", "menu"), + ("menu-close", "menu-close"), + ("menu-down", "menu-down"), + ("menu-down-outline", "menu-down-outline"), + ("menu-left", "menu-left"), + ("menu-left-outline", "menu-left-outline"), + ("menu-open", "menu-open"), + ("menu-right", "menu-right"), + ("menu-right-outline", "menu-right-outline"), + ("menu-swap", "menu-swap"), + ("menu-swap-outline", "menu-swap-outline"), + ("menu-up", "menu-up"), + ("menu-up-outline", "menu-up-outline"), + ("merge", "merge"), + ("message", "message"), + ("message-alert", "message-alert"), + ("message-alert-outline", "message-alert-outline"), + ("message-arrow-left", "message-arrow-left"), + ("message-arrow-left-outline", "message-arrow-left-outline"), + ("message-arrow-right", "message-arrow-right"), + ("message-arrow-right-outline", "message-arrow-right-outline"), + ("message-badge", "message-badge"), + ("message-badge-outline", "message-badge-outline"), + ("message-bookmark", "message-bookmark"), + ("message-bookmark-outline", "message-bookmark-outline"), + ("message-bulleted", "message-bulleted"), + ("message-bulleted-off", "message-bulleted-off"), + ("message-check", "message-check"), + ("message-check-outline", "message-check-outline"), + ("message-cog", "message-cog"), + ("message-cog-outline", "message-cog-outline"), + ("message-draw", "message-draw"), + ("message-fast", "message-fast"), + ("message-fast-outline", "message-fast-outline"), + ("message-flash", "message-flash"), + ("message-flash-outline", "message-flash-outline"), + ("message-image", "message-image"), + ("message-image-outline", "message-image-outline"), + ("message-lock", "message-lock"), + ("message-lock-outline", "message-lock-outline"), + ("message-minus", "message-minus"), + ("message-minus-outline", "message-minus-outline"), + ("message-off", "message-off"), + ("message-off-outline", "message-off-outline"), + ("message-outline", "message-outline"), + ("message-plus", "message-plus"), + ("message-plus-outline", "message-plus-outline"), + ("message-processing", "message-processing"), + ("message-processing-outline", "message-processing-outline"), + ("message-question", "message-question"), + ("message-question-outline", "message-question-outline"), + ("message-reply", "message-reply"), + ("message-reply-outline", "message-reply-outline"), + ("message-reply-text", "message-reply-text"), + ("message-reply-text-outline", "message-reply-text-outline"), + ("message-settings", "message-settings"), + ("message-settings-outline", "message-settings-outline"), + ("message-star", "message-star"), + ("message-star-outline", "message-star-outline"), + ("message-text", "message-text"), + ("message-text-clock", "message-text-clock"), + ("message-text-clock-outline", "message-text-clock-outline"), + ("message-text-fast", "message-text-fast"), + ("message-text-fast-outline", "message-text-fast-outline"), + ("message-text-lock", "message-text-lock"), + ("message-text-lock-outline", "message-text-lock-outline"), + ("message-text-outline", "message-text-outline"), + ("message-video", "message-video"), + ("meteor", "meteor"), + ("meter-electric", "meter-electric"), + ("meter-electric-outline", "meter-electric-outline"), + ("meter-gas", "meter-gas"), + ("meter-gas-outline", "meter-gas-outline"), + ("metronome", "metronome"), + ("metronome-tick", "metronome-tick"), + ("micro-sd", "micro-sd"), + ("microphone", "microphone"), + ("microphone-message", "microphone-message"), + ("microphone-message-off", "microphone-message-off"), + ("microphone-minus", "microphone-minus"), + ("microphone-off", "microphone-off"), + ("microphone-outline", "microphone-outline"), + ("microphone-plus", "microphone-plus"), + ("microphone-question", "microphone-question"), + ("microphone-question-outline", "microphone-question-outline"), + ("microphone-settings", "microphone-settings"), + ("microphone-variant", "microphone-variant"), + ("microphone-variant-off", "microphone-variant-off"), + ("microscope", "microscope"), + ("microsoft", "microsoft"), + ("microsoft-access", "microsoft-access"), + ("microsoft-azure", "microsoft-azure"), + ("microsoft-azure-devops", "microsoft-azure-devops"), + ("microsoft-bing", "microsoft-bing"), + ("microsoft-dynamics-365", "microsoft-dynamics-365"), + ("microsoft-edge", "microsoft-edge"), + ("microsoft-edge-legacy", "microsoft-edge-legacy"), + ("microsoft-excel", "microsoft-excel"), + ("microsoft-internet-explorer", "microsoft-internet-explorer"), + ("microsoft-office", "microsoft-office"), + ("microsoft-onedrive", "microsoft-onedrive"), + ("microsoft-onenote", "microsoft-onenote"), + ("microsoft-outlook", "microsoft-outlook"), + ("microsoft-powerpoint", "microsoft-powerpoint"), + ("microsoft-sharepoint", "microsoft-sharepoint"), + ("microsoft-teams", "microsoft-teams"), + ("microsoft-visual-studio", "microsoft-visual-studio"), + ("microsoft-visual-studio-code", "microsoft-visual-studio-code"), + ("microsoft-windows", "microsoft-windows"), + ("microsoft-windows-classic", "microsoft-windows-classic"), + ("microsoft-word", "microsoft-word"), + ("microsoft-xbox", "microsoft-xbox"), + ("microsoft-xbox-controller", "microsoft-xbox-controller"), + ( + "microsoft-xbox-controller-battery-alert", + "microsoft-xbox-controller-battery-alert", + ), + ( + "microsoft-xbox-controller-battery-charging", + "microsoft-xbox-controller-battery-charging", + ), + ( + "microsoft-xbox-controller-battery-empty", + "microsoft-xbox-controller-battery-empty", + ), + ( + "microsoft-xbox-controller-battery-full", + "microsoft-xbox-controller-battery-full", + ), + ( + "microsoft-xbox-controller-battery-low", + "microsoft-xbox-controller-battery-low", + ), + ( + "microsoft-xbox-controller-battery-medium", + "microsoft-xbox-controller-battery-medium", + ), + ( + "microsoft-xbox-controller-battery-unknown", + "microsoft-xbox-controller-battery-unknown", + ), + ("microsoft-xbox-controller-menu", "microsoft-xbox-controller-menu"), + ("microsoft-xbox-controller-off", "microsoft-xbox-controller-off"), + ("microsoft-xbox-controller-view", "microsoft-xbox-controller-view"), + ("microsoft-yammer", "microsoft-yammer"), + ("microwave", "microwave"), + ("microwave-off", "microwave-off"), + ("middleware", "middleware"), + ("middleware-outline", "middleware-outline"), + ("midi", "midi"), + ("midi-input", "midi-input"), + ("midi-port", "midi-port"), + ("mine", "mine"), + ("minecraft", "minecraft"), + ("mini-sd", "mini-sd"), + ("minidisc", "minidisc"), + ("minus", "minus"), + ("minus-box", "minus-box"), + ("minus-box-multiple", "minus-box-multiple"), + ("minus-box-multiple-outline", "minus-box-multiple-outline"), + ("minus-box-outline", "minus-box-outline"), + ("minus-circle", "minus-circle"), + ("minus-circle-multiple", "minus-circle-multiple"), + ("minus-circle-multiple-outline", "minus-circle-multiple-outline"), + ("minus-circle-off", "minus-circle-off"), + ("minus-circle-off-outline", "minus-circle-off-outline"), + ("minus-circle-outline", "minus-circle-outline"), + ("minus-network", "minus-network"), + ("minus-network-outline", "minus-network-outline"), + ("minus-thick", "minus-thick"), + ("mirror", "mirror"), + ("mirror-rectangle", "mirror-rectangle"), + ("mirror-variant", "mirror-variant"), + ("mixcloud", "mixcloud"), + ("mixed-martial-arts", "mixed-martial-arts"), + ("mixed-reality", "mixed-reality"), + ("mixer", "mixer"), + ("molecule", "molecule"), + ("molecule-co", "molecule-co"), + ("molecule-co2", "molecule-co2"), + ("monitor", "monitor"), + ("monitor-account", "monitor-account"), + ("monitor-arrow-down", "monitor-arrow-down"), + ("monitor-arrow-down-variant", "monitor-arrow-down-variant"), + ("monitor-cellphone", "monitor-cellphone"), + ("monitor-cellphone-star", "monitor-cellphone-star"), + ("monitor-dashboard", "monitor-dashboard"), + ("monitor-edit", "monitor-edit"), + ("monitor-eye", "monitor-eye"), + ("monitor-lock", "monitor-lock"), + ("monitor-multiple", "monitor-multiple"), + ("monitor-off", "monitor-off"), + ("monitor-screenshot", "monitor-screenshot"), + ("monitor-share", "monitor-share"), + ("monitor-shimmer", "monitor-shimmer"), + ("monitor-small", "monitor-small"), + ("monitor-speaker", "monitor-speaker"), + ("monitor-speaker-off", "monitor-speaker-off"), + ("monitor-star", "monitor-star"), + ("moon-first-quarter", "moon-first-quarter"), + ("moon-full", "moon-full"), + ("moon-last-quarter", "moon-last-quarter"), + ("moon-new", "moon-new"), + ("moon-waning-crescent", "moon-waning-crescent"), + ("moon-waning-gibbous", "moon-waning-gibbous"), + ("moon-waxing-crescent", "moon-waxing-crescent"), + ("moon-waxing-gibbous", "moon-waxing-gibbous"), + ("moped", "moped"), + ("moped-electric", "moped-electric"), + ("moped-electric-outline", "moped-electric-outline"), + ("moped-outline", "moped-outline"), + ("more", "more"), + ("mortar-pestle", "mortar-pestle"), + ("mortar-pestle-plus", "mortar-pestle-plus"), + ("mosque", "mosque"), + ("mosque-outline", "mosque-outline"), + ("mother-heart", "mother-heart"), + ("mother-nurse", "mother-nurse"), + ("motion", "motion"), + ("motion-outline", "motion-outline"), + ("motion-pause", "motion-pause"), + ("motion-pause-outline", "motion-pause-outline"), + ("motion-play", "motion-play"), + ("motion-play-outline", "motion-play-outline"), + ("motion-sensor", "motion-sensor"), + ("motion-sensor-off", "motion-sensor-off"), + ("motorbike", "motorbike"), + ("motorbike-electric", "motorbike-electric"), + ("motorbike-off", "motorbike-off"), + ("mouse", "mouse"), + ("mouse-bluetooth", "mouse-bluetooth"), + ("mouse-move-down", "mouse-move-down"), + ("mouse-move-up", "mouse-move-up"), + ("mouse-move-vertical", "mouse-move-vertical"), + ("mouse-off", "mouse-off"), + ("mouse-variant", "mouse-variant"), + ("mouse-variant-off", "mouse-variant-off"), + ("move-resize", "move-resize"), + ("move-resize-variant", "move-resize-variant"), + ("movie", "movie"), + ("movie-check", "movie-check"), + ("movie-check-outline", "movie-check-outline"), + ("movie-cog", "movie-cog"), + ("movie-cog-outline", "movie-cog-outline"), + ("movie-edit", "movie-edit"), + ("movie-edit-outline", "movie-edit-outline"), + ("movie-filter", "movie-filter"), + ("movie-filter-outline", "movie-filter-outline"), + ("movie-minus", "movie-minus"), + ("movie-minus-outline", "movie-minus-outline"), + ("movie-off", "movie-off"), + ("movie-off-outline", "movie-off-outline"), + ("movie-open", "movie-open"), + ("movie-open-check", "movie-open-check"), + ("movie-open-check-outline", "movie-open-check-outline"), + ("movie-open-cog", "movie-open-cog"), + ("movie-open-cog-outline", "movie-open-cog-outline"), + ("movie-open-edit", "movie-open-edit"), + ("movie-open-edit-outline", "movie-open-edit-outline"), + ("movie-open-minus", "movie-open-minus"), + ("movie-open-minus-outline", "movie-open-minus-outline"), + ("movie-open-off", "movie-open-off"), + ("movie-open-off-outline", "movie-open-off-outline"), + ("movie-open-outline", "movie-open-outline"), + ("movie-open-play", "movie-open-play"), + ("movie-open-play-outline", "movie-open-play-outline"), + ("movie-open-plus", "movie-open-plus"), + ("movie-open-plus-outline", "movie-open-plus-outline"), + ("movie-open-remove", "movie-open-remove"), + ("movie-open-remove-outline", "movie-open-remove-outline"), + ("movie-open-settings", "movie-open-settings"), + ("movie-open-settings-outline", "movie-open-settings-outline"), + ("movie-open-star", "movie-open-star"), + ("movie-open-star-outline", "movie-open-star-outline"), + ("movie-outline", "movie-outline"), + ("movie-play", "movie-play"), + ("movie-play-outline", "movie-play-outline"), + ("movie-plus", "movie-plus"), + ("movie-plus-outline", "movie-plus-outline"), + ("movie-remove", "movie-remove"), + ("movie-remove-outline", "movie-remove-outline"), + ("movie-roll", "movie-roll"), + ("movie-search", "movie-search"), + ("movie-search-outline", "movie-search-outline"), + ("movie-settings", "movie-settings"), + ("movie-settings-outline", "movie-settings-outline"), + ("movie-star", "movie-star"), + ("movie-star-outline", "movie-star-outline"), + ("mower", "mower"), + ("mower-bag", "mower-bag"), + ("mower-bag-on", "mower-bag-on"), + ("mower-on", "mower-on"), + ("muffin", "muffin"), + ("multicast", "multicast"), + ("multimedia", "multimedia"), + ("multiplication", "multiplication"), + ("multiplication-box", "multiplication-box"), + ("mushroom", "mushroom"), + ("mushroom-off", "mushroom-off"), + ("mushroom-off-outline", "mushroom-off-outline"), + ("mushroom-outline", "mushroom-outline"), + ("music", "music"), + ("music-accidental-double-flat", "music-accidental-double-flat"), + ("music-accidental-double-sharp", "music-accidental-double-sharp"), + ("music-accidental-flat", "music-accidental-flat"), + ("music-accidental-natural", "music-accidental-natural"), + ("music-accidental-sharp", "music-accidental-sharp"), + ("music-box", "music-box"), + ("music-box-multiple", "music-box-multiple"), + ("music-box-multiple-outline", "music-box-multiple-outline"), + ("music-box-outline", "music-box-outline"), + ("music-circle", "music-circle"), + ("music-circle-outline", "music-circle-outline"), + ("music-clef-alto", "music-clef-alto"), + ("music-clef-bass", "music-clef-bass"), + ("music-clef-treble", "music-clef-treble"), + ("music-note", "music-note"), + ("music-note-bluetooth", "music-note-bluetooth"), + ("music-note-bluetooth-off", "music-note-bluetooth-off"), + ("music-note-eighth", "music-note-eighth"), + ("music-note-eighth-dotted", "music-note-eighth-dotted"), + ("music-note-half", "music-note-half"), + ("music-note-half-dotted", "music-note-half-dotted"), + ("music-note-minus", "music-note-minus"), + ("music-note-off", "music-note-off"), + ("music-note-off-outline", "music-note-off-outline"), + ("music-note-outline", "music-note-outline"), + ("music-note-plus", "music-note-plus"), + ("music-note-quarter", "music-note-quarter"), + ("music-note-quarter-dotted", "music-note-quarter-dotted"), + ("music-note-sixteenth", "music-note-sixteenth"), + ("music-note-sixteenth-dotted", "music-note-sixteenth-dotted"), + ("music-note-whole", "music-note-whole"), + ("music-note-whole-dotted", "music-note-whole-dotted"), + ("music-off", "music-off"), + ("music-rest-eighth", "music-rest-eighth"), + ("music-rest-half", "music-rest-half"), + ("music-rest-quarter", "music-rest-quarter"), + ("music-rest-sixteenth", "music-rest-sixteenth"), + ("music-rest-whole", "music-rest-whole"), + ("mustache", "mustache"), + ("nail", "nail"), + ("nas", "nas"), + ("nativescript", "nativescript"), + ("nature", "nature"), + ("nature-people", "nature-people"), + ("navigation", "navigation"), + ("navigation-outline", "navigation-outline"), + ("navigation-variant", "navigation-variant"), + ("navigation-variant-outline", "navigation-variant-outline"), + ("near-me", "near-me"), + ("necklace", "necklace"), + ("needle", "needle"), + ("needle-off", "needle-off"), + ("nest-thermostat", "nest-thermostat"), + ("netflix", "netflix"), + ("network", "network"), + ("network-off", "network-off"), + ("network-off-outline", "network-off-outline"), + ("network-outline", "network-outline"), + ("network-pos", "network-pos"), + ("network-strength-1", "network-strength-1"), + ("network-strength-1-alert", "network-strength-1-alert"), + ("network-strength-2", "network-strength-2"), + ("network-strength-2-alert", "network-strength-2-alert"), + ("network-strength-3", "network-strength-3"), + ("network-strength-3-alert", "network-strength-3-alert"), + ("network-strength-4", "network-strength-4"), + ("network-strength-4-alert", "network-strength-4-alert"), + ("network-strength-4-cog", "network-strength-4-cog"), + ("network-strength-alert", "network-strength-alert"), + ("network-strength-alert-outline", "network-strength-alert-outline"), + ("network-strength-off", "network-strength-off"), + ("network-strength-off-outline", "network-strength-off-outline"), + ("network-strength-outline", "network-strength-outline"), + ("new-box", "new-box"), + ("newspaper", "newspaper"), + ("newspaper-check", "newspaper-check"), + ("newspaper-minus", "newspaper-minus"), + ("newspaper-plus", "newspaper-plus"), + ("newspaper-remove", "newspaper-remove"), + ("newspaper-variant", "newspaper-variant"), + ("newspaper-variant-multiple", "newspaper-variant-multiple"), + ("newspaper-variant-multiple-outline", "newspaper-variant-multiple-outline"), + ("newspaper-variant-outline", "newspaper-variant-outline"), + ("nfc", "nfc"), + ("nfc-off", "nfc-off"), + ("nfc-search-variant", "nfc-search-variant"), + ("nfc-tap", "nfc-tap"), + ("nfc-variant", "nfc-variant"), + ("nfc-variant-off", "nfc-variant-off"), + ("ninja", "ninja"), + ("nintendo-game-boy", "nintendo-game-boy"), + ("nintendo-switch", "nintendo-switch"), + ("nintendo-wii", "nintendo-wii"), + ("nintendo-wiiu", "nintendo-wiiu"), + ("nix", "nix"), + ("nodejs", "nodejs"), + ("noodles", "noodles"), + ("not-equal", "not-equal"), + ("not-equal-variant", "not-equal-variant"), + ("note", "note"), + ("note-alert", "note-alert"), + ("note-alert-outline", "note-alert-outline"), + ("note-check", "note-check"), + ("note-check-outline", "note-check-outline"), + ("note-edit", "note-edit"), + ("note-edit-outline", "note-edit-outline"), + ("note-minus", "note-minus"), + ("note-minus-outline", "note-minus-outline"), + ("note-multiple", "note-multiple"), + ("note-multiple-outline", "note-multiple-outline"), + ("note-off", "note-off"), + ("note-off-outline", "note-off-outline"), + ("note-outline", "note-outline"), + ("note-plus", "note-plus"), + ("note-plus-outline", "note-plus-outline"), + ("note-remove", "note-remove"), + ("note-remove-outline", "note-remove-outline"), + ("note-search", "note-search"), + ("note-search-outline", "note-search-outline"), + ("note-text", "note-text"), + ("note-text-outline", "note-text-outline"), + ("notebook", "notebook"), + ("notebook-check", "notebook-check"), + ("notebook-check-outline", "notebook-check-outline"), + ("notebook-edit", "notebook-edit"), + ("notebook-edit-outline", "notebook-edit-outline"), + ("notebook-heart", "notebook-heart"), + ("notebook-heart-outline", "notebook-heart-outline"), + ("notebook-minus", "notebook-minus"), + ("notebook-minus-outline", "notebook-minus-outline"), + ("notebook-multiple", "notebook-multiple"), + ("notebook-outline", "notebook-outline"), + ("notebook-plus", "notebook-plus"), + ("notebook-plus-outline", "notebook-plus-outline"), + ("notebook-remove", "notebook-remove"), + ("notebook-remove-outline", "notebook-remove-outline"), + ("notification-clear-all", "notification-clear-all"), + ("npm", "npm"), + ("npm-variant", "npm-variant"), + ("npm-variant-outline", "npm-variant-outline"), + ("nuke", "nuke"), + ("null", "null"), + ("numeric", "numeric"), + ("numeric-0", "numeric-0"), + ("numeric-0-box", "numeric-0-box"), + ("numeric-0-box-multiple", "numeric-0-box-multiple"), + ("numeric-0-box-multiple-outline", "numeric-0-box-multiple-outline"), + ("numeric-0-box-outline", "numeric-0-box-outline"), + ("numeric-0-circle", "numeric-0-circle"), + ("numeric-0-circle-outline", "numeric-0-circle-outline"), + ("numeric-1", "numeric-1"), + ("numeric-1-box", "numeric-1-box"), + ("numeric-1-box-multiple", "numeric-1-box-multiple"), + ("numeric-1-box-multiple-outline", "numeric-1-box-multiple-outline"), + ("numeric-1-box-outline", "numeric-1-box-outline"), + ("numeric-1-circle", "numeric-1-circle"), + ("numeric-1-circle-outline", "numeric-1-circle-outline"), + ("numeric-10", "numeric-10"), + ("numeric-10-box", "numeric-10-box"), + ("numeric-10-box-multiple", "numeric-10-box-multiple"), + ("numeric-10-box-multiple-outline", "numeric-10-box-multiple-outline"), + ("numeric-10-box-outline", "numeric-10-box-outline"), + ("numeric-10-circle", "numeric-10-circle"), + ("numeric-10-circle-outline", "numeric-10-circle-outline"), + ("numeric-2", "numeric-2"), + ("numeric-2-box", "numeric-2-box"), + ("numeric-2-box-multiple", "numeric-2-box-multiple"), + ("numeric-2-box-multiple-outline", "numeric-2-box-multiple-outline"), + ("numeric-2-box-outline", "numeric-2-box-outline"), + ("numeric-2-circle", "numeric-2-circle"), + ("numeric-2-circle-outline", "numeric-2-circle-outline"), + ("numeric-3", "numeric-3"), + ("numeric-3-box", "numeric-3-box"), + ("numeric-3-box-multiple", "numeric-3-box-multiple"), + ("numeric-3-box-multiple-outline", "numeric-3-box-multiple-outline"), + ("numeric-3-box-outline", "numeric-3-box-outline"), + ("numeric-3-circle", "numeric-3-circle"), + ("numeric-3-circle-outline", "numeric-3-circle-outline"), + ("numeric-4", "numeric-4"), + ("numeric-4-box", "numeric-4-box"), + ("numeric-4-box-multiple", "numeric-4-box-multiple"), + ("numeric-4-box-multiple-outline", "numeric-4-box-multiple-outline"), + ("numeric-4-box-outline", "numeric-4-box-outline"), + ("numeric-4-circle", "numeric-4-circle"), + ("numeric-4-circle-outline", "numeric-4-circle-outline"), + ("numeric-5", "numeric-5"), + ("numeric-5-box", "numeric-5-box"), + ("numeric-5-box-multiple", "numeric-5-box-multiple"), + ("numeric-5-box-multiple-outline", "numeric-5-box-multiple-outline"), + ("numeric-5-box-outline", "numeric-5-box-outline"), + ("numeric-5-circle", "numeric-5-circle"), + ("numeric-5-circle-outline", "numeric-5-circle-outline"), + ("numeric-6", "numeric-6"), + ("numeric-6-box", "numeric-6-box"), + ("numeric-6-box-multiple", "numeric-6-box-multiple"), + ("numeric-6-box-multiple-outline", "numeric-6-box-multiple-outline"), + ("numeric-6-box-outline", "numeric-6-box-outline"), + ("numeric-6-circle", "numeric-6-circle"), + ("numeric-6-circle-outline", "numeric-6-circle-outline"), + ("numeric-7", "numeric-7"), + ("numeric-7-box", "numeric-7-box"), + ("numeric-7-box-multiple", "numeric-7-box-multiple"), + ("numeric-7-box-multiple-outline", "numeric-7-box-multiple-outline"), + ("numeric-7-box-outline", "numeric-7-box-outline"), + ("numeric-7-circle", "numeric-7-circle"), + ("numeric-7-circle-outline", "numeric-7-circle-outline"), + ("numeric-8", "numeric-8"), + ("numeric-8-box", "numeric-8-box"), + ("numeric-8-box-multiple", "numeric-8-box-multiple"), + ("numeric-8-box-multiple-outline", "numeric-8-box-multiple-outline"), + ("numeric-8-box-outline", "numeric-8-box-outline"), + ("numeric-8-circle", "numeric-8-circle"), + ("numeric-8-circle-outline", "numeric-8-circle-outline"), + ("numeric-9", "numeric-9"), + ("numeric-9-box", "numeric-9-box"), + ("numeric-9-box-multiple", "numeric-9-box-multiple"), + ("numeric-9-box-multiple-outline", "numeric-9-box-multiple-outline"), + ("numeric-9-box-outline", "numeric-9-box-outline"), + ("numeric-9-circle", "numeric-9-circle"), + ("numeric-9-circle-outline", "numeric-9-circle-outline"), + ("numeric-9-plus", "numeric-9-plus"), + ("numeric-9-plus-box", "numeric-9-plus-box"), + ("numeric-9-plus-box-multiple", "numeric-9-plus-box-multiple"), + ("numeric-9-plus-box-multiple-outline", "numeric-9-plus-box-multiple-outline"), + ("numeric-9-plus-box-outline", "numeric-9-plus-box-outline"), + ("numeric-9-plus-circle", "numeric-9-plus-circle"), + ("numeric-9-plus-circle-outline", "numeric-9-plus-circle-outline"), + ("numeric-negative-1", "numeric-negative-1"), + ("numeric-off", "numeric-off"), + ("numeric-positive-1", "numeric-positive-1"), + ("nut", "nut"), + ("nutrition", "nutrition"), + ("nuxt", "nuxt"), + ("oar", "oar"), + ("ocarina", "ocarina"), + ("oci", "oci"), + ("ocr", "ocr"), + ("octagon", "octagon"), + ("octagon-outline", "octagon-outline"), + ("octagram", "octagram"), + ("octagram-outline", "octagram-outline"), + ("octahedron", "octahedron"), + ("octahedron-off", "octahedron-off"), + ("odnoklassniki", "odnoklassniki"), + ("offer", "offer"), + ("office-building", "office-building"), + ("office-building-cog", "office-building-cog"), + ("office-building-cog-outline", "office-building-cog-outline"), + ("office-building-marker", "office-building-marker"), + ("office-building-marker-outline", "office-building-marker-outline"), + ("office-building-minus", "office-building-minus"), + ("office-building-minus-outline", "office-building-minus-outline"), + ("office-building-outline", "office-building-outline"), + ("office-building-plus", "office-building-plus"), + ("office-building-plus-outline", "office-building-plus-outline"), + ("office-building-remove", "office-building-remove"), + ("office-building-remove-outline", "office-building-remove-outline"), + ("oil", "oil"), + ("oil-lamp", "oil-lamp"), + ("oil-level", "oil-level"), + ("oil-temperature", "oil-temperature"), + ("om", "om"), + ("omega", "omega"), + ("one-up", "one-up"), + ("onedrive", "onedrive"), + ("onenote", "onenote"), + ("onepassword", "onepassword"), + ("opacity", "opacity"), + ("open-in-app", "open-in-app"), + ("open-in-new", "open-in-new"), + ("open-source-initiative", "open-source-initiative"), + ("openid", "openid"), + ("opera", "opera"), + ("orbit", "orbit"), + ("orbit-variant", "orbit-variant"), + ("order-alphabetical-ascending", "order-alphabetical-ascending"), + ("order-alphabetical-descending", "order-alphabetical-descending"), + ("order-bool-ascending", "order-bool-ascending"), + ("order-bool-ascending-variant", "order-bool-ascending-variant"), + ("order-bool-descending", "order-bool-descending"), + ("order-bool-descending-variant", "order-bool-descending-variant"), + ("order-numeric-ascending", "order-numeric-ascending"), + ("order-numeric-descending", "order-numeric-descending"), + ("origin", "origin"), + ("ornament", "ornament"), + ("ornament-variant", "ornament-variant"), + ("outbox", "outbox"), + ("outdent", "outdent"), + ("outdoor-lamp", "outdoor-lamp"), + ("outlook", "outlook"), + ("overscan", "overscan"), + ("owl", "owl"), + ("pac-man", "pac-man"), + ("package", "package"), + ("package-check", "package-check"), + ("package-down", "package-down"), + ("package-up", "package-up"), + ("package-variant", "package-variant"), + ("package-variant-closed", "package-variant-closed"), + ("package-variant-closed-check", "package-variant-closed-check"), + ("package-variant-closed-minus", "package-variant-closed-minus"), + ("package-variant-closed-plus", "package-variant-closed-plus"), + ("package-variant-closed-remove", "package-variant-closed-remove"), + ("package-variant-minus", "package-variant-minus"), + ("package-variant-plus", "package-variant-plus"), + ("package-variant-remove", "package-variant-remove"), + ("page-first", "page-first"), + ("page-last", "page-last"), + ("page-layout-body", "page-layout-body"), + ("page-layout-footer", "page-layout-footer"), + ("page-layout-header", "page-layout-header"), + ("page-layout-header-footer", "page-layout-header-footer"), + ("page-layout-sidebar-left", "page-layout-sidebar-left"), + ("page-layout-sidebar-right", "page-layout-sidebar-right"), + ("page-next", "page-next"), + ("page-next-outline", "page-next-outline"), + ("page-previous", "page-previous"), + ("page-previous-outline", "page-previous-outline"), + ("pail", "pail"), + ("pail-minus", "pail-minus"), + ("pail-minus-outline", "pail-minus-outline"), + ("pail-off", "pail-off"), + ("pail-off-outline", "pail-off-outline"), + ("pail-outline", "pail-outline"), + ("pail-plus", "pail-plus"), + ("pail-plus-outline", "pail-plus-outline"), + ("pail-remove", "pail-remove"), + ("pail-remove-outline", "pail-remove-outline"), + ("palette", "palette"), + ("palette-advanced", "palette-advanced"), + ("palette-outline", "palette-outline"), + ("palette-swatch", "palette-swatch"), + ("palette-swatch-outline", "palette-swatch-outline"), + ("palette-swatch-variant", "palette-swatch-variant"), + ("palm-tree", "palm-tree"), + ("pan", "pan"), + ("pan-bottom-left", "pan-bottom-left"), + ("pan-bottom-right", "pan-bottom-right"), + ("pan-down", "pan-down"), + ("pan-horizontal", "pan-horizontal"), + ("pan-left", "pan-left"), + ("pan-right", "pan-right"), + ("pan-top-left", "pan-top-left"), + ("pan-top-right", "pan-top-right"), + ("pan-up", "pan-up"), + ("pan-vertical", "pan-vertical"), + ("panda", "panda"), + ("pandora", "pandora"), + ("panorama", "panorama"), + ("panorama-fisheye", "panorama-fisheye"), + ("panorama-horizontal", "panorama-horizontal"), + ("panorama-horizontal-outline", "panorama-horizontal-outline"), + ("panorama-outline", "panorama-outline"), + ("panorama-sphere", "panorama-sphere"), + ("panorama-sphere-outline", "panorama-sphere-outline"), + ("panorama-variant", "panorama-variant"), + ("panorama-variant-outline", "panorama-variant-outline"), + ("panorama-vertical", "panorama-vertical"), + ("panorama-vertical-outline", "panorama-vertical-outline"), + ("panorama-wide-angle", "panorama-wide-angle"), + ("panorama-wide-angle-outline", "panorama-wide-angle-outline"), + ("paper-cut-vertical", "paper-cut-vertical"), + ("paper-roll", "paper-roll"), + ("paper-roll-outline", "paper-roll-outline"), + ("paperclip", "paperclip"), + ("paperclip-check", "paperclip-check"), + ("paperclip-lock", "paperclip-lock"), + ("paperclip-minus", "paperclip-minus"), + ("paperclip-off", "paperclip-off"), + ("paperclip-plus", "paperclip-plus"), + ("paperclip-remove", "paperclip-remove"), + ("parachute", "parachute"), + ("parachute-outline", "parachute-outline"), + ("paragliding", "paragliding"), + ("parking", "parking"), + ("party-popper", "party-popper"), + ("passport", "passport"), + ("passport-biometric", "passport-biometric"), + ("pasta", "pasta"), + ("patio-heater", "patio-heater"), + ("patreon", "patreon"), + ("pause", "pause"), + ("pause-box", "pause-box"), + ("pause-box-outline", "pause-box-outline"), + ("pause-circle", "pause-circle"), + ("pause-circle-outline", "pause-circle-outline"), + ("pause-octagon", "pause-octagon"), + ("pause-octagon-outline", "pause-octagon-outline"), + ("paw", "paw"), + ("paw-off", "paw-off"), + ("paw-off-outline", "paw-off-outline"), + ("paw-outline", "paw-outline"), + ("paypal", "paypal"), + ("peace", "peace"), + ("peanut", "peanut"), + ("peanut-off", "peanut-off"), + ("peanut-off-outline", "peanut-off-outline"), + ("peanut-outline", "peanut-outline"), + ("pen", "pen"), + ("pen-lock", "pen-lock"), + ("pen-minus", "pen-minus"), + ("pen-off", "pen-off"), + ("pen-plus", "pen-plus"), + ("pen-remove", "pen-remove"), + ("pencil", "pencil"), + ("pencil-box", "pencil-box"), + ("pencil-box-multiple", "pencil-box-multiple"), + ("pencil-box-multiple-outline", "pencil-box-multiple-outline"), + ("pencil-box-outline", "pencil-box-outline"), + ("pencil-circle", "pencil-circle"), + ("pencil-circle-outline", "pencil-circle-outline"), + ("pencil-lock", "pencil-lock"), + ("pencil-lock-outline", "pencil-lock-outline"), + ("pencil-minus", "pencil-minus"), + ("pencil-minus-outline", "pencil-minus-outline"), + ("pencil-off", "pencil-off"), + ("pencil-off-outline", "pencil-off-outline"), + ("pencil-outline", "pencil-outline"), + ("pencil-plus", "pencil-plus"), + ("pencil-plus-outline", "pencil-plus-outline"), + ("pencil-remove", "pencil-remove"), + ("pencil-remove-outline", "pencil-remove-outline"), + ("pencil-ruler", "pencil-ruler"), + ("pencil-ruler-outline", "pencil-ruler-outline"), + ("penguin", "penguin"), + ("pentagon", "pentagon"), + ("pentagon-outline", "pentagon-outline"), + ("pentagram", "pentagram"), + ("percent", "percent"), + ("percent-box", "percent-box"), + ("percent-box-outline", "percent-box-outline"), + ("percent-circle", "percent-circle"), + ("percent-circle-outline", "percent-circle-outline"), + ("percent-outline", "percent-outline"), + ("periodic-table", "periodic-table"), + ("periscope", "periscope"), + ("perspective-less", "perspective-less"), + ("perspective-more", "perspective-more"), + ("ph", "ph"), + ("phone", "phone"), + ("phone-alert", "phone-alert"), + ("phone-alert-outline", "phone-alert-outline"), + ("phone-bluetooth", "phone-bluetooth"), + ("phone-bluetooth-outline", "phone-bluetooth-outline"), + ("phone-cancel", "phone-cancel"), + ("phone-cancel-outline", "phone-cancel-outline"), + ("phone-check", "phone-check"), + ("phone-check-outline", "phone-check-outline"), + ("phone-classic", "phone-classic"), + ("phone-classic-off", "phone-classic-off"), + ("phone-clock", "phone-clock"), + ("phone-dial", "phone-dial"), + ("phone-dial-outline", "phone-dial-outline"), + ("phone-forward", "phone-forward"), + ("phone-forward-outline", "phone-forward-outline"), + ("phone-hangup", "phone-hangup"), + ("phone-hangup-outline", "phone-hangup-outline"), + ("phone-in-talk", "phone-in-talk"), + ("phone-in-talk-outline", "phone-in-talk-outline"), + ("phone-incoming", "phone-incoming"), + ("phone-incoming-outgoing", "phone-incoming-outgoing"), + ("phone-incoming-outgoing-outline", "phone-incoming-outgoing-outline"), + ("phone-incoming-outline", "phone-incoming-outline"), + ("phone-lock", "phone-lock"), + ("phone-lock-outline", "phone-lock-outline"), + ("phone-log", "phone-log"), + ("phone-log-outline", "phone-log-outline"), + ("phone-message", "phone-message"), + ("phone-message-outline", "phone-message-outline"), + ("phone-minus", "phone-minus"), + ("phone-minus-outline", "phone-minus-outline"), + ("phone-missed", "phone-missed"), + ("phone-missed-outline", "phone-missed-outline"), + ("phone-off", "phone-off"), + ("phone-off-outline", "phone-off-outline"), + ("phone-outgoing", "phone-outgoing"), + ("phone-outgoing-outline", "phone-outgoing-outline"), + ("phone-outline", "phone-outline"), + ("phone-paused", "phone-paused"), + ("phone-paused-outline", "phone-paused-outline"), + ("phone-plus", "phone-plus"), + ("phone-plus-outline", "phone-plus-outline"), + ("phone-refresh", "phone-refresh"), + ("phone-refresh-outline", "phone-refresh-outline"), + ("phone-remove", "phone-remove"), + ("phone-remove-outline", "phone-remove-outline"), + ("phone-return", "phone-return"), + ("phone-return-outline", "phone-return-outline"), + ("phone-ring", "phone-ring"), + ("phone-ring-outline", "phone-ring-outline"), + ("phone-rotate-landscape", "phone-rotate-landscape"), + ("phone-rotate-portrait", "phone-rotate-portrait"), + ("phone-settings", "phone-settings"), + ("phone-settings-outline", "phone-settings-outline"), + ("phone-sync", "phone-sync"), + ("phone-sync-outline", "phone-sync-outline"), + ("phone-voip", "phone-voip"), + ("pi", "pi"), + ("pi-box", "pi-box"), + ("pi-hole", "pi-hole"), + ("piano", "piano"), + ("piano-off", "piano-off"), + ("pickaxe", "pickaxe"), + ("picture-in-picture-bottom-right", "picture-in-picture-bottom-right"), + ( + "picture-in-picture-bottom-right-outline", + "picture-in-picture-bottom-right-outline", + ), + ("picture-in-picture-top-right", "picture-in-picture-top-right"), + ( + "picture-in-picture-top-right-outline", + "picture-in-picture-top-right-outline", + ), + ("pier", "pier"), + ("pier-crane", "pier-crane"), + ("pig", "pig"), + ("pig-variant", "pig-variant"), + ("pig-variant-outline", "pig-variant-outline"), + ("piggy-bank", "piggy-bank"), + ("piggy-bank-outline", "piggy-bank-outline"), + ("pill", "pill"), + ("pill-multiple", "pill-multiple"), + ("pill-off", "pill-off"), + ("pillar", "pillar"), + ("pin", "pin"), + ("pin-off", "pin-off"), + ("pin-off-outline", "pin-off-outline"), + ("pin-outline", "pin-outline"), + ("pine-tree", "pine-tree"), + ("pine-tree-box", "pine-tree-box"), + ("pine-tree-fire", "pine-tree-fire"), + ("pinterest", "pinterest"), + ("pinterest-box", "pinterest-box"), + ("pinwheel", "pinwheel"), + ("pinwheel-outline", "pinwheel-outline"), + ("pipe", "pipe"), + ("pipe-disconnected", "pipe-disconnected"), + ("pipe-leak", "pipe-leak"), + ("pipe-valve", "pipe-valve"), + ("pipe-wrench", "pipe-wrench"), + ("pirate", "pirate"), + ("pistol", "pistol"), + ("piston", "piston"), + ("pitchfork", "pitchfork"), + ("pizza", "pizza"), + ("plane-car", "plane-car"), + ("plane-train", "plane-train"), + ("play", "play"), + ("play-box", "play-box"), + ("play-box-lock", "play-box-lock"), + ("play-box-lock-open", "play-box-lock-open"), + ("play-box-lock-open-outline", "play-box-lock-open-outline"), + ("play-box-lock-outline", "play-box-lock-outline"), + ("play-box-multiple", "play-box-multiple"), + ("play-box-multiple-outline", "play-box-multiple-outline"), + ("play-box-outline", "play-box-outline"), + ("play-circle", "play-circle"), + ("play-circle-outline", "play-circle-outline"), + ("play-network", "play-network"), + ("play-network-outline", "play-network-outline"), + ("play-outline", "play-outline"), + ("play-pause", "play-pause"), + ("play-protected-content", "play-protected-content"), + ("play-speed", "play-speed"), + ("playlist-check", "playlist-check"), + ("playlist-edit", "playlist-edit"), + ("playlist-minus", "playlist-minus"), + ("playlist-music", "playlist-music"), + ("playlist-music-outline", "playlist-music-outline"), + ("playlist-play", "playlist-play"), + ("playlist-plus", "playlist-plus"), + ("playlist-remove", "playlist-remove"), + ("playlist-star", "playlist-star"), + ("plex", "plex"), + ("pliers", "pliers"), + ("plus", "plus"), + ("plus-box", "plus-box"), + ("plus-box-multiple", "plus-box-multiple"), + ("plus-box-multiple-outline", "plus-box-multiple-outline"), + ("plus-box-outline", "plus-box-outline"), + ("plus-circle", "plus-circle"), + ("plus-circle-multiple", "plus-circle-multiple"), + ("plus-circle-multiple-outline", "plus-circle-multiple-outline"), + ("plus-circle-outline", "plus-circle-outline"), + ("plus-lock", "plus-lock"), + ("plus-lock-open", "plus-lock-open"), + ("plus-minus", "plus-minus"), + ("plus-minus-box", "plus-minus-box"), + ("plus-minus-variant", "plus-minus-variant"), + ("plus-network", "plus-network"), + ("plus-network-outline", "plus-network-outline"), + ("plus-outline", "plus-outline"), + ("plus-thick", "plus-thick"), + ("pocket", "pocket"), + ("podcast", "podcast"), + ("podium", "podium"), + ("podium-bronze", "podium-bronze"), + ("podium-gold", "podium-gold"), + ("podium-silver", "podium-silver"), + ("point-of-sale", "point-of-sale"), + ("pokeball", "pokeball"), + ("pokemon-go", "pokemon-go"), + ("poker-chip", "poker-chip"), + ("polaroid", "polaroid"), + ("police-badge", "police-badge"), + ("police-badge-outline", "police-badge-outline"), + ("police-station", "police-station"), + ("poll", "poll"), + ("polo", "polo"), + ("polymer", "polymer"), + ("pool", "pool"), + ("pool-thermometer", "pool-thermometer"), + ("popcorn", "popcorn"), + ("post", "post"), + ("post-lamp", "post-lamp"), + ("post-outline", "post-outline"), + ("postage-stamp", "postage-stamp"), + ("pot", "pot"), + ("pot-mix", "pot-mix"), + ("pot-mix-outline", "pot-mix-outline"), + ("pot-outline", "pot-outline"), + ("pot-steam", "pot-steam"), + ("pot-steam-outline", "pot-steam-outline"), + ("pound", "pound"), + ("pound-box", "pound-box"), + ("pound-box-outline", "pound-box-outline"), + ("power", "power"), + ("power-cycle", "power-cycle"), + ("power-off", "power-off"), + ("power-on", "power-on"), + ("power-plug", "power-plug"), + ("power-plug-off", "power-plug-off"), + ("power-plug-off-outline", "power-plug-off-outline"), + ("power-plug-outline", "power-plug-outline"), + ("power-settings", "power-settings"), + ("power-sleep", "power-sleep"), + ("power-socket", "power-socket"), + ("power-socket-au", "power-socket-au"), + ("power-socket-ch", "power-socket-ch"), + ("power-socket-de", "power-socket-de"), + ("power-socket-eu", "power-socket-eu"), + ("power-socket-fr", "power-socket-fr"), + ("power-socket-it", "power-socket-it"), + ("power-socket-jp", "power-socket-jp"), + ("power-socket-uk", "power-socket-uk"), + ("power-socket-us", "power-socket-us"), + ("power-standby", "power-standby"), + ("powershell", "powershell"), + ("prescription", "prescription"), + ("presentation", "presentation"), + ("presentation-play", "presentation-play"), + ("pretzel", "pretzel"), + ("prezi", "prezi"), + ("printer", "printer"), + ("printer-3d", "printer-3d"), + ("printer-3d-nozzle", "printer-3d-nozzle"), + ("printer-3d-nozzle-alert", "printer-3d-nozzle-alert"), + ("printer-3d-nozzle-alert-outline", "printer-3d-nozzle-alert-outline"), + ("printer-3d-nozzle-heat", "printer-3d-nozzle-heat"), + ("printer-3d-nozzle-heat-outline", "printer-3d-nozzle-heat-outline"), + ("printer-3d-nozzle-off", "printer-3d-nozzle-off"), + ("printer-3d-nozzle-off-outline", "printer-3d-nozzle-off-outline"), + ("printer-3d-nozzle-outline", "printer-3d-nozzle-outline"), + ("printer-3d-off", "printer-3d-off"), + ("printer-alert", "printer-alert"), + ("printer-check", "printer-check"), + ("printer-eye", "printer-eye"), + ("printer-off", "printer-off"), + ("printer-off-outline", "printer-off-outline"), + ("printer-outline", "printer-outline"), + ("printer-pos", "printer-pos"), + ("printer-pos-alert", "printer-pos-alert"), + ("printer-pos-alert-outline", "printer-pos-alert-outline"), + ("printer-pos-cancel", "printer-pos-cancel"), + ("printer-pos-cancel-outline", "printer-pos-cancel-outline"), + ("printer-pos-check", "printer-pos-check"), + ("printer-pos-check-outline", "printer-pos-check-outline"), + ("printer-pos-cog", "printer-pos-cog"), + ("printer-pos-cog-outline", "printer-pos-cog-outline"), + ("printer-pos-edit", "printer-pos-edit"), + ("printer-pos-edit-outline", "printer-pos-edit-outline"), + ("printer-pos-minus", "printer-pos-minus"), + ("printer-pos-minus-outline", "printer-pos-minus-outline"), + ("printer-pos-network", "printer-pos-network"), + ("printer-pos-network-outline", "printer-pos-network-outline"), + ("printer-pos-off", "printer-pos-off"), + ("printer-pos-off-outline", "printer-pos-off-outline"), + ("printer-pos-outline", "printer-pos-outline"), + ("printer-pos-pause", "printer-pos-pause"), + ("printer-pos-pause-outline", "printer-pos-pause-outline"), + ("printer-pos-play", "printer-pos-play"), + ("printer-pos-play-outline", "printer-pos-play-outline"), + ("printer-pos-plus", "printer-pos-plus"), + ("printer-pos-plus-outline", "printer-pos-plus-outline"), + ("printer-pos-refresh", "printer-pos-refresh"), + ("printer-pos-refresh-outline", "printer-pos-refresh-outline"), + ("printer-pos-remove", "printer-pos-remove"), + ("printer-pos-remove-outline", "printer-pos-remove-outline"), + ("printer-pos-star", "printer-pos-star"), + ("printer-pos-star-outline", "printer-pos-star-outline"), + ("printer-pos-stop", "printer-pos-stop"), + ("printer-pos-stop-outline", "printer-pos-stop-outline"), + ("printer-pos-sync", "printer-pos-sync"), + ("printer-pos-sync-outline", "printer-pos-sync-outline"), + ("printer-pos-wrench", "printer-pos-wrench"), + ("printer-pos-wrench-outline", "printer-pos-wrench-outline"), + ("printer-search", "printer-search"), + ("printer-settings", "printer-settings"), + ("printer-wireless", "printer-wireless"), + ("priority-high", "priority-high"), + ("priority-low", "priority-low"), + ("professional-hexagon", "professional-hexagon"), + ("progress-alert", "progress-alert"), + ("progress-check", "progress-check"), + ("progress-clock", "progress-clock"), + ("progress-close", "progress-close"), + ("progress-download", "progress-download"), + ("progress-helper", "progress-helper"), + ("progress-pencil", "progress-pencil"), + ("progress-question", "progress-question"), + ("progress-star", "progress-star"), + ("progress-upload", "progress-upload"), + ("progress-wrench", "progress-wrench"), + ("projector", "projector"), + ("projector-off", "projector-off"), + ("projector-screen", "projector-screen"), + ("projector-screen-off", "projector-screen-off"), + ("projector-screen-off-outline", "projector-screen-off-outline"), + ("projector-screen-outline", "projector-screen-outline"), + ("projector-screen-variant", "projector-screen-variant"), + ("projector-screen-variant-off", "projector-screen-variant-off"), + ( + "projector-screen-variant-off-outline", + "projector-screen-variant-off-outline", + ), + ("projector-screen-variant-outline", "projector-screen-variant-outline"), + ("propane-tank", "propane-tank"), + ("propane-tank-outline", "propane-tank-outline"), + ("protocol", "protocol"), + ("publish", "publish"), + ("publish-off", "publish-off"), + ("pulse", "pulse"), + ("pump", "pump"), + ("pump-off", "pump-off"), + ("pumpkin", "pumpkin"), + ("purse", "purse"), + ("purse-outline", "purse-outline"), + ("puzzle", "puzzle"), + ("puzzle-check", "puzzle-check"), + ("puzzle-check-outline", "puzzle-check-outline"), + ("puzzle-edit", "puzzle-edit"), + ("puzzle-edit-outline", "puzzle-edit-outline"), + ("puzzle-heart", "puzzle-heart"), + ("puzzle-heart-outline", "puzzle-heart-outline"), + ("puzzle-minus", "puzzle-minus"), + ("puzzle-minus-outline", "puzzle-minus-outline"), + ("puzzle-outline", "puzzle-outline"), + ("puzzle-plus", "puzzle-plus"), + ("puzzle-plus-outline", "puzzle-plus-outline"), + ("puzzle-remove", "puzzle-remove"), + ("puzzle-remove-outline", "puzzle-remove-outline"), + ("puzzle-star", "puzzle-star"), + ("puzzle-star-outline", "puzzle-star-outline"), + ("pyramid", "pyramid"), + ("pyramid-off", "pyramid-off"), + ("qi", "qi"), + ("qqchat", "qqchat"), + ("qrcode", "qrcode"), + ("qrcode-edit", "qrcode-edit"), + ("qrcode-minus", "qrcode-minus"), + ("qrcode-plus", "qrcode-plus"), + ("qrcode-remove", "qrcode-remove"), + ("qrcode-scan", "qrcode-scan"), + ("quadcopter", "quadcopter"), + ("quality-high", "quality-high"), + ("quality-low", "quality-low"), + ("quality-medium", "quality-medium"), + ("quick-reply", "quick-reply"), + ("quicktime", "quicktime"), + ("quora", "quora"), + ("rabbit", "rabbit"), + ("rabbit-variant", "rabbit-variant"), + ("rabbit-variant-outline", "rabbit-variant-outline"), + ("racing-helmet", "racing-helmet"), + ("racquetball", "racquetball"), + ("radar", "radar"), + ("radiator", "radiator"), + ("radiator-disabled", "radiator-disabled"), + ("radiator-off", "radiator-off"), + ("radio", "radio"), + ("radio-am", "radio-am"), + ("radio-fm", "radio-fm"), + ("radio-handheld", "radio-handheld"), + ("radio-off", "radio-off"), + ("radio-tower", "radio-tower"), + ("radioactive", "radioactive"), + ("radioactive-circle", "radioactive-circle"), + ("radioactive-circle-outline", "radioactive-circle-outline"), + ("radioactive-off", "radioactive-off"), + ("radiobox-blank", "radiobox-blank"), + ("radiobox-marked", "radiobox-marked"), + ("radiology-box", "radiology-box"), + ("radiology-box-outline", "radiology-box-outline"), + ("radius", "radius"), + ("radius-outline", "radius-outline"), + ("railroad-light", "railroad-light"), + ("rake", "rake"), + ("raspberry-pi", "raspberry-pi"), + ("raw", "raw"), + ("raw-off", "raw-off"), + ("ray-end", "ray-end"), + ("ray-end-arrow", "ray-end-arrow"), + ("ray-start", "ray-start"), + ("ray-start-arrow", "ray-start-arrow"), + ("ray-start-end", "ray-start-end"), + ("ray-start-vertex-end", "ray-start-vertex-end"), + ("ray-vertex", "ray-vertex"), + ("razor-double-edge", "razor-double-edge"), + ("razor-single-edge", "razor-single-edge"), + ("rdio", "rdio"), + ("react", "react"), + ("read", "read"), + ("receipt", "receipt"), + ("receipt-outline", "receipt-outline"), + ("receipt-text", "receipt-text"), + ("receipt-text-check", "receipt-text-check"), + ("receipt-text-check-outline", "receipt-text-check-outline"), + ("receipt-text-minus", "receipt-text-minus"), + ("receipt-text-minus-outline", "receipt-text-minus-outline"), + ("receipt-text-outline", "receipt-text-outline"), + ("receipt-text-plus", "receipt-text-plus"), + ("receipt-text-plus-outline", "receipt-text-plus-outline"), + ("receipt-text-remove", "receipt-text-remove"), + ("receipt-text-remove-outline", "receipt-text-remove-outline"), + ("record", "record"), + ("record-circle", "record-circle"), + ("record-circle-outline", "record-circle-outline"), + ("record-player", "record-player"), + ("record-rec", "record-rec"), + ("rectangle", "rectangle"), + ("rectangle-outline", "rectangle-outline"), + ("recycle", "recycle"), + ("recycle-variant", "recycle-variant"), + ("reddit", "reddit"), + ("redhat", "redhat"), + ("redo", "redo"), + ("redo-variant", "redo-variant"), + ("reflect-horizontal", "reflect-horizontal"), + ("reflect-vertical", "reflect-vertical"), + ("refresh", "refresh"), + ("refresh-auto", "refresh-auto"), + ("refresh-circle", "refresh-circle"), + ("regex", "regex"), + ("registered-trademark", "registered-trademark"), + ("reiterate", "reiterate"), + ("relation-many-to-many", "relation-many-to-many"), + ("relation-many-to-one", "relation-many-to-one"), + ("relation-many-to-one-or-many", "relation-many-to-one-or-many"), + ("relation-many-to-only-one", "relation-many-to-only-one"), + ("relation-many-to-zero-or-many", "relation-many-to-zero-or-many"), + ("relation-many-to-zero-or-one", "relation-many-to-zero-or-one"), + ("relation-one-or-many-to-many", "relation-one-or-many-to-many"), + ("relation-one-or-many-to-one", "relation-one-or-many-to-one"), + ("relation-one-or-many-to-one-or-many", "relation-one-or-many-to-one-or-many"), + ("relation-one-or-many-to-only-one", "relation-one-or-many-to-only-one"), + ( + "relation-one-or-many-to-zero-or-many", + "relation-one-or-many-to-zero-or-many", + ), + ("relation-one-or-many-to-zero-or-one", "relation-one-or-many-to-zero-or-one"), + ("relation-one-to-many", "relation-one-to-many"), + ("relation-one-to-one", "relation-one-to-one"), + ("relation-one-to-one-or-many", "relation-one-to-one-or-many"), + ("relation-one-to-only-one", "relation-one-to-only-one"), + ("relation-one-to-zero-or-many", "relation-one-to-zero-or-many"), + ("relation-one-to-zero-or-one", "relation-one-to-zero-or-one"), + ("relation-only-one-to-many", "relation-only-one-to-many"), + ("relation-only-one-to-one", "relation-only-one-to-one"), + ("relation-only-one-to-one-or-many", "relation-only-one-to-one-or-many"), + ("relation-only-one-to-only-one", "relation-only-one-to-only-one"), + ("relation-only-one-to-zero-or-many", "relation-only-one-to-zero-or-many"), + ("relation-only-one-to-zero-or-one", "relation-only-one-to-zero-or-one"), + ("relation-zero-or-many-to-many", "relation-zero-or-many-to-many"), + ("relation-zero-or-many-to-one", "relation-zero-or-many-to-one"), + ( + "relation-zero-or-many-to-one-or-many", + "relation-zero-or-many-to-one-or-many", + ), + ("relation-zero-or-many-to-only-one", "relation-zero-or-many-to-only-one"), + ( + "relation-zero-or-many-to-zero-or-many", + "relation-zero-or-many-to-zero-or-many", + ), + ( + "relation-zero-or-many-to-zero-or-one", + "relation-zero-or-many-to-zero-or-one", + ), + ("relation-zero-or-one-to-many", "relation-zero-or-one-to-many"), + ("relation-zero-or-one-to-one", "relation-zero-or-one-to-one"), + ("relation-zero-or-one-to-one-or-many", "relation-zero-or-one-to-one-or-many"), + ("relation-zero-or-one-to-only-one", "relation-zero-or-one-to-only-one"), + ( + "relation-zero-or-one-to-zero-or-many", + "relation-zero-or-one-to-zero-or-many", + ), + ("relation-zero-or-one-to-zero-or-one", "relation-zero-or-one-to-zero-or-one"), + ("relative-scale", "relative-scale"), + ("reload", "reload"), + ("reload-alert", "reload-alert"), + ("reminder", "reminder"), + ("remote", "remote"), + ("remote-desktop", "remote-desktop"), + ("remote-off", "remote-off"), + ("remote-tv", "remote-tv"), + ("remote-tv-off", "remote-tv-off"), + ("rename", "rename"), + ("rename-box", "rename-box"), + ("rename-box-outline", "rename-box-outline"), + ("rename-outline", "rename-outline"), + ("reorder-horizontal", "reorder-horizontal"), + ("reorder-vertical", "reorder-vertical"), + ("repeat", "repeat"), + ("repeat-off", "repeat-off"), + ("repeat-once", "repeat-once"), + ("repeat-variant", "repeat-variant"), + ("replay", "replay"), + ("reply", "reply"), + ("reply-all", "reply-all"), + ("reply-all-outline", "reply-all-outline"), + ("reply-circle", "reply-circle"), + ("reply-outline", "reply-outline"), + ("reproduction", "reproduction"), + ("resistor", "resistor"), + ("resistor-nodes", "resistor-nodes"), + ("resize", "resize"), + ("resize-bottom-right", "resize-bottom-right"), + ("responsive", "responsive"), + ("restart", "restart"), + ("restart-alert", "restart-alert"), + ("restart-off", "restart-off"), + ("restore", "restore"), + ("restore-alert", "restore-alert"), + ("rewind", "rewind"), + ("rewind-10", "rewind-10"), + ("rewind-15", "rewind-15"), + ("rewind-30", "rewind-30"), + ("rewind-45", "rewind-45"), + ("rewind-5", "rewind-5"), + ("rewind-60", "rewind-60"), + ("rewind-outline", "rewind-outline"), + ("rhombus", "rhombus"), + ("rhombus-medium", "rhombus-medium"), + ("rhombus-medium-outline", "rhombus-medium-outline"), + ("rhombus-outline", "rhombus-outline"), + ("rhombus-split", "rhombus-split"), + ("rhombus-split-outline", "rhombus-split-outline"), + ("ribbon", "ribbon"), + ("rice", "rice"), + ("rickshaw", "rickshaw"), + ("rickshaw-electric", "rickshaw-electric"), + ("ring", "ring"), + ("rivet", "rivet"), + ("road", "road"), + ("road-variant", "road-variant"), + ("robber", "robber"), + ("robot", "robot"), + ("robot-angry", "robot-angry"), + ("robot-angry-outline", "robot-angry-outline"), + ("robot-confused", "robot-confused"), + ("robot-confused-outline", "robot-confused-outline"), + ("robot-dead", "robot-dead"), + ("robot-dead-outline", "robot-dead-outline"), + ("robot-excited", "robot-excited"), + ("robot-excited-outline", "robot-excited-outline"), + ("robot-happy", "robot-happy"), + ("robot-happy-outline", "robot-happy-outline"), + ("robot-industrial", "robot-industrial"), + ("robot-industrial-outline", "robot-industrial-outline"), + ("robot-love", "robot-love"), + ("robot-love-outline", "robot-love-outline"), + ("robot-mower", "robot-mower"), + ("robot-mower-outline", "robot-mower-outline"), + ("robot-off", "robot-off"), + ("robot-off-outline", "robot-off-outline"), + ("robot-outline", "robot-outline"), + ("robot-vacuum", "robot-vacuum"), + ("robot-vacuum-alert", "robot-vacuum-alert"), + ("robot-vacuum-off", "robot-vacuum-off"), + ("robot-vacuum-variant", "robot-vacuum-variant"), + ("robot-vacuum-variant-alert", "robot-vacuum-variant-alert"), + ("robot-vacuum-variant-off", "robot-vacuum-variant-off"), + ("rocket", "rocket"), + ("rocket-launch", "rocket-launch"), + ("rocket-launch-outline", "rocket-launch-outline"), + ("rocket-outline", "rocket-outline"), + ("rodent", "rodent"), + ("roller-shade", "roller-shade"), + ("roller-shade-closed", "roller-shade-closed"), + ("roller-skate", "roller-skate"), + ("roller-skate-off", "roller-skate-off"), + ("rollerblade", "rollerblade"), + ("rollerblade-off", "rollerblade-off"), + ("rollupjs", "rollupjs"), + ("rolodex", "rolodex"), + ("rolodex-outline", "rolodex-outline"), + ("roman-numeral-1", "roman-numeral-1"), + ("roman-numeral-10", "roman-numeral-10"), + ("roman-numeral-2", "roman-numeral-2"), + ("roman-numeral-3", "roman-numeral-3"), + ("roman-numeral-4", "roman-numeral-4"), + ("roman-numeral-5", "roman-numeral-5"), + ("roman-numeral-6", "roman-numeral-6"), + ("roman-numeral-7", "roman-numeral-7"), + ("roman-numeral-8", "roman-numeral-8"), + ("roman-numeral-9", "roman-numeral-9"), + ("room-service", "room-service"), + ("room-service-outline", "room-service-outline"), + ("rotate-360", "rotate-360"), + ("rotate-3d", "rotate-3d"), + ("rotate-3d-variant", "rotate-3d-variant"), + ("rotate-left", "rotate-left"), + ("rotate-left-variant", "rotate-left-variant"), + ("rotate-orbit", "rotate-orbit"), + ("rotate-right", "rotate-right"), + ("rotate-right-variant", "rotate-right-variant"), + ("rounded-corner", "rounded-corner"), + ("router", "router"), + ("router-network", "router-network"), + ("router-wireless", "router-wireless"), + ("router-wireless-off", "router-wireless-off"), + ("router-wireless-settings", "router-wireless-settings"), + ("routes", "routes"), + ("routes-clock", "routes-clock"), + ("rowing", "rowing"), + ("rss", "rss"), + ("rss-box", "rss-box"), + ("rss-off", "rss-off"), + ("rug", "rug"), + ("rugby", "rugby"), + ("ruler", "ruler"), + ("ruler-square", "ruler-square"), + ("ruler-square-compass", "ruler-square-compass"), + ("run", "run"), + ("run-fast", "run-fast"), + ("rv-truck", "rv-truck"), + ("sack", "sack"), + ("sack-percent", "sack-percent"), + ("safe", "safe"), + ("safe-square", "safe-square"), + ("safe-square-outline", "safe-square-outline"), + ("safety-goggles", "safety-goggles"), + ("safety-googles", "safety-googles"), + ("sail-boat", "sail-boat"), + ("sail-boat-sink", "sail-boat-sink"), + ("sale", "sale"), + ("sale-outline", "sale-outline"), + ("salesforce", "salesforce"), + ("sass", "sass"), + ("satellite", "satellite"), + ("satellite-uplink", "satellite-uplink"), + ("satellite-variant", "satellite-variant"), + ("sausage", "sausage"), + ("sausage-off", "sausage-off"), + ("saw-blade", "saw-blade"), + ("sawtooth-wave", "sawtooth-wave"), + ("saxophone", "saxophone"), + ("scale", "scale"), + ("scale-balance", "scale-balance"), + ("scale-bathroom", "scale-bathroom"), + ("scale-off", "scale-off"), + ("scale-unbalanced", "scale-unbalanced"), + ("scan-helper", "scan-helper"), + ("scanner", "scanner"), + ("scanner-off", "scanner-off"), + ("scatter-plot", "scatter-plot"), + ("scatter-plot-outline", "scatter-plot-outline"), + ("scent", "scent"), + ("scent-off", "scent-off"), + ("school", "school"), + ("school-outline", "school-outline"), + ("scissors-cutting", "scissors-cutting"), + ("scooter", "scooter"), + ("scooter-electric", "scooter-electric"), + ("scoreboard", "scoreboard"), + ("scoreboard-outline", "scoreboard-outline"), + ("screen-rotation", "screen-rotation"), + ("screen-rotation-lock", "screen-rotation-lock"), + ("screw-flat-top", "screw-flat-top"), + ("screw-lag", "screw-lag"), + ("screw-machine-flat-top", "screw-machine-flat-top"), + ("screw-machine-round-top", "screw-machine-round-top"), + ("screw-round-top", "screw-round-top"), + ("screwdriver", "screwdriver"), + ("script", "script"), + ("script-outline", "script-outline"), + ("script-text", "script-text"), + ("script-text-key", "script-text-key"), + ("script-text-key-outline", "script-text-key-outline"), + ("script-text-outline", "script-text-outline"), + ("script-text-play", "script-text-play"), + ("script-text-play-outline", "script-text-play-outline"), + ("sd", "sd"), + ("seal", "seal"), + ("seal-variant", "seal-variant"), + ("search-web", "search-web"), + ("seat", "seat"), + ("seat-flat", "seat-flat"), + ("seat-flat-angled", "seat-flat-angled"), + ("seat-individual-suite", "seat-individual-suite"), + ("seat-legroom-extra", "seat-legroom-extra"), + ("seat-legroom-normal", "seat-legroom-normal"), + ("seat-legroom-reduced", "seat-legroom-reduced"), + ("seat-outline", "seat-outline"), + ("seat-passenger", "seat-passenger"), + ("seat-recline-extra", "seat-recline-extra"), + ("seat-recline-normal", "seat-recline-normal"), + ("seatbelt", "seatbelt"), + ("security", "security"), + ("security-close", "security-close"), + ("security-network", "security-network"), + ("seed", "seed"), + ("seed-off", "seed-off"), + ("seed-off-outline", "seed-off-outline"), + ("seed-outline", "seed-outline"), + ("seed-plus", "seed-plus"), + ("seed-plus-outline", "seed-plus-outline"), + ("seesaw", "seesaw"), + ("segment", "segment"), + ("select", "select"), + ("select-all", "select-all"), + ("select-arrow-down", "select-arrow-down"), + ("select-arrow-up", "select-arrow-up"), + ("select-color", "select-color"), + ("select-compare", "select-compare"), + ("select-drag", "select-drag"), + ("select-group", "select-group"), + ("select-inverse", "select-inverse"), + ("select-marker", "select-marker"), + ("select-multiple", "select-multiple"), + ("select-multiple-marker", "select-multiple-marker"), + ("select-off", "select-off"), + ("select-place", "select-place"), + ("select-remove", "select-remove"), + ("select-search", "select-search"), + ("selection", "selection"), + ("selection-drag", "selection-drag"), + ("selection-ellipse", "selection-ellipse"), + ("selection-ellipse-arrow-inside", "selection-ellipse-arrow-inside"), + ("selection-ellipse-remove", "selection-ellipse-remove"), + ("selection-lasso", "selection-lasso"), + ("selection-marker", "selection-marker"), + ("selection-multiple", "selection-multiple"), + ("selection-multiple-marker", "selection-multiple-marker"), + ("selection-off", "selection-off"), + ("selection-remove", "selection-remove"), + ("selection-search", "selection-search"), + ("semantic-web", "semantic-web"), + ("send", "send"), + ("send-check", "send-check"), + ("send-check-outline", "send-check-outline"), + ("send-circle", "send-circle"), + ("send-circle-outline", "send-circle-outline"), + ("send-clock", "send-clock"), + ("send-clock-outline", "send-clock-outline"), + ("send-lock", "send-lock"), + ("send-lock-outline", "send-lock-outline"), + ("send-outline", "send-outline"), + ("serial-port", "serial-port"), + ("server", "server"), + ("server-minus", "server-minus"), + ("server-network", "server-network"), + ("server-network-off", "server-network-off"), + ("server-off", "server-off"), + ("server-plus", "server-plus"), + ("server-remove", "server-remove"), + ("server-security", "server-security"), + ("set-all", "set-all"), + ("set-center", "set-center"), + ("set-center-right", "set-center-right"), + ("set-left", "set-left"), + ("set-left-center", "set-left-center"), + ("set-left-right", "set-left-right"), + ("set-merge", "set-merge"), + ("set-none", "set-none"), + ("set-right", "set-right"), + ("set-split", "set-split"), + ("set-square", "set-square"), + ("set-top-box", "set-top-box"), + ("settings-helper", "settings-helper"), + ("shaker", "shaker"), + ("shaker-outline", "shaker-outline"), + ("shape", "shape"), + ("shape-circle-plus", "shape-circle-plus"), + ("shape-outline", "shape-outline"), + ("shape-oval-plus", "shape-oval-plus"), + ("shape-plus", "shape-plus"), + ("shape-polygon-plus", "shape-polygon-plus"), + ("shape-rectangle-plus", "shape-rectangle-plus"), + ("shape-square-plus", "shape-square-plus"), + ("shape-square-rounded-plus", "shape-square-rounded-plus"), + ("share", "share"), + ("share-all", "share-all"), + ("share-all-outline", "share-all-outline"), + ("share-circle", "share-circle"), + ("share-off", "share-off"), + ("share-off-outline", "share-off-outline"), + ("share-outline", "share-outline"), + ("share-variant", "share-variant"), + ("share-variant-outline", "share-variant-outline"), + ("shark", "shark"), + ("shark-fin", "shark-fin"), + ("shark-fin-outline", "shark-fin-outline"), + ("shark-off", "shark-off"), + ("sheep", "sheep"), + ("shield", "shield"), + ("shield-account", "shield-account"), + ("shield-account-outline", "shield-account-outline"), + ("shield-account-variant", "shield-account-variant"), + ("shield-account-variant-outline", "shield-account-variant-outline"), + ("shield-airplane", "shield-airplane"), + ("shield-airplane-outline", "shield-airplane-outline"), + ("shield-alert", "shield-alert"), + ("shield-alert-outline", "shield-alert-outline"), + ("shield-bug", "shield-bug"), + ("shield-bug-outline", "shield-bug-outline"), + ("shield-car", "shield-car"), + ("shield-check", "shield-check"), + ("shield-check-outline", "shield-check-outline"), + ("shield-cross", "shield-cross"), + ("shield-cross-outline", "shield-cross-outline"), + ("shield-crown", "shield-crown"), + ("shield-crown-outline", "shield-crown-outline"), + ("shield-edit", "shield-edit"), + ("shield-edit-outline", "shield-edit-outline"), + ("shield-half", "shield-half"), + ("shield-half-full", "shield-half-full"), + ("shield-home", "shield-home"), + ("shield-home-outline", "shield-home-outline"), + ("shield-key", "shield-key"), + ("shield-key-outline", "shield-key-outline"), + ("shield-link-variant", "shield-link-variant"), + ("shield-link-variant-outline", "shield-link-variant-outline"), + ("shield-lock", "shield-lock"), + ("shield-lock-open", "shield-lock-open"), + ("shield-lock-open-outline", "shield-lock-open-outline"), + ("shield-lock-outline", "shield-lock-outline"), + ("shield-moon", "shield-moon"), + ("shield-moon-outline", "shield-moon-outline"), + ("shield-off", "shield-off"), + ("shield-off-outline", "shield-off-outline"), + ("shield-outline", "shield-outline"), + ("shield-plus", "shield-plus"), + ("shield-plus-outline", "shield-plus-outline"), + ("shield-refresh", "shield-refresh"), + ("shield-refresh-outline", "shield-refresh-outline"), + ("shield-remove", "shield-remove"), + ("shield-remove-outline", "shield-remove-outline"), + ("shield-search", "shield-search"), + ("shield-star", "shield-star"), + ("shield-star-outline", "shield-star-outline"), + ("shield-sun", "shield-sun"), + ("shield-sun-outline", "shield-sun-outline"), + ("shield-sword", "shield-sword"), + ("shield-sword-outline", "shield-sword-outline"), + ("shield-sync", "shield-sync"), + ("shield-sync-outline", "shield-sync-outline"), + ("shimmer", "shimmer"), + ("ship-wheel", "ship-wheel"), + ("shipping-pallet", "shipping-pallet"), + ("shoe-ballet", "shoe-ballet"), + ("shoe-cleat", "shoe-cleat"), + ("shoe-formal", "shoe-formal"), + ("shoe-heel", "shoe-heel"), + ("shoe-print", "shoe-print"), + ("shoe-sneaker", "shoe-sneaker"), + ("shopify", "shopify"), + ("shopping", "shopping"), + ("shopping-music", "shopping-music"), + ("shopping-outline", "shopping-outline"), + ("shopping-search", "shopping-search"), + ("shopping-search-outline", "shopping-search-outline"), + ("shore", "shore"), + ("shovel", "shovel"), + ("shovel-off", "shovel-off"), + ("shower", "shower"), + ("shower-head", "shower-head"), + ("shredder", "shredder"), + ("shuffle", "shuffle"), + ("shuffle-disabled", "shuffle-disabled"), + ("shuffle-variant", "shuffle-variant"), + ("shuriken", "shuriken"), + ("sickle", "sickle"), + ("sigma", "sigma"), + ("sigma-lower", "sigma-lower"), + ("sign-caution", "sign-caution"), + ("sign-direction", "sign-direction"), + ("sign-direction-minus", "sign-direction-minus"), + ("sign-direction-plus", "sign-direction-plus"), + ("sign-direction-remove", "sign-direction-remove"), + ("sign-language", "sign-language"), + ("sign-language-outline", "sign-language-outline"), + ("sign-pole", "sign-pole"), + ("sign-real-estate", "sign-real-estate"), + ("sign-text", "sign-text"), + ("sign-yield", "sign-yield"), + ("signal", "signal"), + ("signal-2g", "signal-2g"), + ("signal-3g", "signal-3g"), + ("signal-4g", "signal-4g"), + ("signal-5g", "signal-5g"), + ("signal-cellular-1", "signal-cellular-1"), + ("signal-cellular-2", "signal-cellular-2"), + ("signal-cellular-3", "signal-cellular-3"), + ("signal-cellular-outline", "signal-cellular-outline"), + ("signal-distance-variant", "signal-distance-variant"), + ("signal-hspa", "signal-hspa"), + ("signal-hspa-plus", "signal-hspa-plus"), + ("signal-off", "signal-off"), + ("signal-variant", "signal-variant"), + ("signature", "signature"), + ("signature-freehand", "signature-freehand"), + ("signature-image", "signature-image"), + ("signature-text", "signature-text"), + ("silo", "silo"), + ("silo-outline", "silo-outline"), + ("silverware", "silverware"), + ("silverware-clean", "silverware-clean"), + ("silverware-fork", "silverware-fork"), + ("silverware-fork-knife", "silverware-fork-knife"), + ("silverware-spoon", "silverware-spoon"), + ("silverware-variant", "silverware-variant"), + ("sim", "sim"), + ("sim-alert", "sim-alert"), + ("sim-alert-outline", "sim-alert-outline"), + ("sim-off", "sim-off"), + ("sim-off-outline", "sim-off-outline"), + ("sim-outline", "sim-outline"), + ("simple-icons", "simple-icons"), + ("sina-weibo", "sina-weibo"), + ("sine-wave", "sine-wave"), + ("sitemap", "sitemap"), + ("sitemap-outline", "sitemap-outline"), + ("size-l", "size-l"), + ("size-m", "size-m"), + ("size-s", "size-s"), + ("size-xl", "size-xl"), + ("size-xs", "size-xs"), + ("size-xxl", "size-xxl"), + ("size-xxs", "size-xxs"), + ("size-xxxl", "size-xxxl"), + ("skate", "skate"), + ("skate-off", "skate-off"), + ("skateboard", "skateboard"), + ("skateboarding", "skateboarding"), + ("skew-less", "skew-less"), + ("skew-more", "skew-more"), + ("ski", "ski"), + ("ski-cross-country", "ski-cross-country"), + ("ski-water", "ski-water"), + ("skip-backward", "skip-backward"), + ("skip-backward-outline", "skip-backward-outline"), + ("skip-forward", "skip-forward"), + ("skip-forward-outline", "skip-forward-outline"), + ("skip-next", "skip-next"), + ("skip-next-circle", "skip-next-circle"), + ("skip-next-circle-outline", "skip-next-circle-outline"), + ("skip-next-outline", "skip-next-outline"), + ("skip-previous", "skip-previous"), + ("skip-previous-circle", "skip-previous-circle"), + ("skip-previous-circle-outline", "skip-previous-circle-outline"), + ("skip-previous-outline", "skip-previous-outline"), + ("skull", "skull"), + ("skull-crossbones", "skull-crossbones"), + ("skull-crossbones-outline", "skull-crossbones-outline"), + ("skull-outline", "skull-outline"), + ("skull-scan", "skull-scan"), + ("skull-scan-outline", "skull-scan-outline"), + ("skype", "skype"), + ("skype-business", "skype-business"), + ("slack", "slack"), + ("slackware", "slackware"), + ("slash-forward", "slash-forward"), + ("slash-forward-box", "slash-forward-box"), + ("sledding", "sledding"), + ("sleep", "sleep"), + ("sleep-off", "sleep-off"), + ("slide", "slide"), + ("slope-downhill", "slope-downhill"), + ("slope-uphill", "slope-uphill"), + ("slot-machine", "slot-machine"), + ("slot-machine-outline", "slot-machine-outline"), + ("smart-card", "smart-card"), + ("smart-card-off", "smart-card-off"), + ("smart-card-off-outline", "smart-card-off-outline"), + ("smart-card-outline", "smart-card-outline"), + ("smart-card-reader", "smart-card-reader"), + ("smart-card-reader-outline", "smart-card-reader-outline"), + ("smog", "smog"), + ("smoke", "smoke"), + ("smoke-detector", "smoke-detector"), + ("smoke-detector-alert", "smoke-detector-alert"), + ("smoke-detector-alert-outline", "smoke-detector-alert-outline"), + ("smoke-detector-off", "smoke-detector-off"), + ("smoke-detector-off-outline", "smoke-detector-off-outline"), + ("smoke-detector-outline", "smoke-detector-outline"), + ("smoke-detector-variant", "smoke-detector-variant"), + ("smoke-detector-variant-alert", "smoke-detector-variant-alert"), + ("smoke-detector-variant-off", "smoke-detector-variant-off"), + ("smoking", "smoking"), + ("smoking-off", "smoking-off"), + ("smoking-pipe", "smoking-pipe"), + ("smoking-pipe-off", "smoking-pipe-off"), + ("snail", "snail"), + ("snake", "snake"), + ("snapchat", "snapchat"), + ("snowboard", "snowboard"), + ("snowflake", "snowflake"), + ("snowflake-alert", "snowflake-alert"), + ("snowflake-check", "snowflake-check"), + ("snowflake-melt", "snowflake-melt"), + ("snowflake-off", "snowflake-off"), + ("snowflake-thermometer", "snowflake-thermometer"), + ("snowflake-variant", "snowflake-variant"), + ("snowman", "snowman"), + ("snowmobile", "snowmobile"), + ("snowshoeing", "snowshoeing"), + ("soccer", "soccer"), + ("soccer-field", "soccer-field"), + ("social-distance-2-meters", "social-distance-2-meters"), + ("social-distance-6-feet", "social-distance-6-feet"), + ("sofa", "sofa"), + ("sofa-outline", "sofa-outline"), + ("sofa-single", "sofa-single"), + ("sofa-single-outline", "sofa-single-outline"), + ("solar-panel", "solar-panel"), + ("solar-panel-large", "solar-panel-large"), + ("solar-power", "solar-power"), + ("solar-power-variant", "solar-power-variant"), + ("solar-power-variant-outline", "solar-power-variant-outline"), + ("soldering-iron", "soldering-iron"), + ("solid", "solid"), + ("sony-playstation", "sony-playstation"), + ("sort", "sort"), + ("sort-alphabetical-ascending", "sort-alphabetical-ascending"), + ("sort-alphabetical-ascending-variant", "sort-alphabetical-ascending-variant"), + ("sort-alphabetical-descending", "sort-alphabetical-descending"), + ( + "sort-alphabetical-descending-variant", + "sort-alphabetical-descending-variant", + ), + ("sort-alphabetical-variant", "sort-alphabetical-variant"), + ("sort-ascending", "sort-ascending"), + ("sort-bool-ascending", "sort-bool-ascending"), + ("sort-bool-ascending-variant", "sort-bool-ascending-variant"), + ("sort-bool-descending", "sort-bool-descending"), + ("sort-bool-descending-variant", "sort-bool-descending-variant"), + ("sort-calendar-ascending", "sort-calendar-ascending"), + ("sort-calendar-descending", "sort-calendar-descending"), + ("sort-clock-ascending", "sort-clock-ascending"), + ("sort-clock-ascending-outline", "sort-clock-ascending-outline"), + ("sort-clock-descending", "sort-clock-descending"), + ("sort-clock-descending-outline", "sort-clock-descending-outline"), + ("sort-descending", "sort-descending"), + ("sort-numeric-ascending", "sort-numeric-ascending"), + ("sort-numeric-ascending-variant", "sort-numeric-ascending-variant"), + ("sort-numeric-descending", "sort-numeric-descending"), + ("sort-numeric-descending-variant", "sort-numeric-descending-variant"), + ("sort-numeric-variant", "sort-numeric-variant"), + ("sort-reverse-variant", "sort-reverse-variant"), + ("sort-variant", "sort-variant"), + ("sort-variant-lock", "sort-variant-lock"), + ("sort-variant-lock-open", "sort-variant-lock-open"), + ("sort-variant-off", "sort-variant-off"), + ("sort-variant-remove", "sort-variant-remove"), + ("soundbar", "soundbar"), + ("soundcloud", "soundcloud"), + ("source-branch", "source-branch"), + ("source-branch-check", "source-branch-check"), + ("source-branch-minus", "source-branch-minus"), + ("source-branch-plus", "source-branch-plus"), + ("source-branch-refresh", "source-branch-refresh"), + ("source-branch-remove", "source-branch-remove"), + ("source-branch-sync", "source-branch-sync"), + ("source-commit", "source-commit"), + ("source-commit-end", "source-commit-end"), + ("source-commit-end-local", "source-commit-end-local"), + ("source-commit-local", "source-commit-local"), + ("source-commit-next-local", "source-commit-next-local"), + ("source-commit-start", "source-commit-start"), + ("source-commit-start-next-local", "source-commit-start-next-local"), + ("source-fork", "source-fork"), + ("source-merge", "source-merge"), + ("source-pull", "source-pull"), + ("source-repository", "source-repository"), + ("source-repository-multiple", "source-repository-multiple"), + ("soy-sauce", "soy-sauce"), + ("soy-sauce-off", "soy-sauce-off"), + ("spa", "spa"), + ("spa-outline", "spa-outline"), + ("space-invaders", "space-invaders"), + ("space-station", "space-station"), + ("spade", "spade"), + ("speaker", "speaker"), + ("speaker-bluetooth", "speaker-bluetooth"), + ("speaker-message", "speaker-message"), + ("speaker-multiple", "speaker-multiple"), + ("speaker-off", "speaker-off"), + ("speaker-pause", "speaker-pause"), + ("speaker-play", "speaker-play"), + ("speaker-stop", "speaker-stop"), + ("speaker-wireless", "speaker-wireless"), + ("spear", "spear"), + ("speedometer", "speedometer"), + ("speedometer-medium", "speedometer-medium"), + ("speedometer-slow", "speedometer-slow"), + ("spellcheck", "spellcheck"), + ("sphere", "sphere"), + ("sphere-off", "sphere-off"), + ("spider", "spider"), + ("spider-thread", "spider-thread"), + ("spider-web", "spider-web"), + ("spirit-level", "spirit-level"), + ("split-horizontal", "split-horizontal"), + ("split-vertical", "split-vertical"), + ("spoon-sugar", "spoon-sugar"), + ("spotify", "spotify"), + ("spotlight", "spotlight"), + ("spotlight-beam", "spotlight-beam"), + ("spray", "spray"), + ("spray-bottle", "spray-bottle"), + ("spreadsheet", "spreadsheet"), + ("sprinkler", "sprinkler"), + ("sprinkler-fire", "sprinkler-fire"), + ("sprinkler-variant", "sprinkler-variant"), + ("sprout", "sprout"), + ("sprout-outline", "sprout-outline"), + ("square", "square"), + ("square-circle", "square-circle"), + ("square-edit-outline", "square-edit-outline"), + ("square-inc", "square-inc"), + ("square-inc-cash", "square-inc-cash"), + ("square-medium", "square-medium"), + ("square-medium-outline", "square-medium-outline"), + ("square-off", "square-off"), + ("square-off-outline", "square-off-outline"), + ("square-opacity", "square-opacity"), + ("square-outline", "square-outline"), + ("square-root", "square-root"), + ("square-root-box", "square-root-box"), + ("square-rounded", "square-rounded"), + ("square-rounded-badge", "square-rounded-badge"), + ("square-rounded-badge-outline", "square-rounded-badge-outline"), + ("square-rounded-outline", "square-rounded-outline"), + ("square-small", "square-small"), + ("square-wave", "square-wave"), + ("squeegee", "squeegee"), + ("ssh", "ssh"), + ("stack-exchange", "stack-exchange"), + ("stack-overflow", "stack-overflow"), + ("stackpath", "stackpath"), + ("stadium", "stadium"), + ("stadium-outline", "stadium-outline"), + ("stadium-variant", "stadium-variant"), + ("stairs", "stairs"), + ("stairs-box", "stairs-box"), + ("stairs-down", "stairs-down"), + ("stairs-up", "stairs-up"), + ("stamper", "stamper"), + ("standard-definition", "standard-definition"), + ("star", "star"), + ("star-box", "star-box"), + ("star-box-multiple", "star-box-multiple"), + ("star-box-multiple-outline", "star-box-multiple-outline"), + ("star-box-outline", "star-box-outline"), + ("star-check", "star-check"), + ("star-check-outline", "star-check-outline"), + ("star-circle", "star-circle"), + ("star-circle-outline", "star-circle-outline"), + ("star-cog", "star-cog"), + ("star-cog-outline", "star-cog-outline"), + ("star-crescent", "star-crescent"), + ("star-david", "star-david"), + ("star-face", "star-face"), + ("star-four-points", "star-four-points"), + ("star-four-points-outline", "star-four-points-outline"), + ("star-half", "star-half"), + ("star-half-full", "star-half-full"), + ("star-minus", "star-minus"), + ("star-minus-outline", "star-minus-outline"), + ("star-off", "star-off"), + ("star-off-outline", "star-off-outline"), + ("star-outline", "star-outline"), + ("star-plus", "star-plus"), + ("star-plus-outline", "star-plus-outline"), + ("star-remove", "star-remove"), + ("star-remove-outline", "star-remove-outline"), + ("star-settings", "star-settings"), + ("star-settings-outline", "star-settings-outline"), + ("star-shooting", "star-shooting"), + ("star-shooting-outline", "star-shooting-outline"), + ("star-three-points", "star-three-points"), + ("star-three-points-outline", "star-three-points-outline"), + ("state-machine", "state-machine"), + ("steam", "steam"), + ("steam-box", "steam-box"), + ("steering", "steering"), + ("steering-off", "steering-off"), + ("step-backward", "step-backward"), + ("step-backward-2", "step-backward-2"), + ("step-forward", "step-forward"), + ("step-forward-2", "step-forward-2"), + ("stethoscope", "stethoscope"), + ("sticker", "sticker"), + ("sticker-alert", "sticker-alert"), + ("sticker-alert-outline", "sticker-alert-outline"), + ("sticker-check", "sticker-check"), + ("sticker-check-outline", "sticker-check-outline"), + ("sticker-circle-outline", "sticker-circle-outline"), + ("sticker-emoji", "sticker-emoji"), + ("sticker-minus", "sticker-minus"), + ("sticker-minus-outline", "sticker-minus-outline"), + ("sticker-outline", "sticker-outline"), + ("sticker-plus", "sticker-plus"), + ("sticker-plus-outline", "sticker-plus-outline"), + ("sticker-remove", "sticker-remove"), + ("sticker-remove-outline", "sticker-remove-outline"), + ("sticker-text", "sticker-text"), + ("sticker-text-outline", "sticker-text-outline"), + ("stocking", "stocking"), + ("stomach", "stomach"), + ("stool", "stool"), + ("stool-outline", "stool-outline"), + ("stop", "stop"), + ("stop-circle", "stop-circle"), + ("stop-circle-outline", "stop-circle-outline"), + ("storage-tank", "storage-tank"), + ("storage-tank-outline", "storage-tank-outline"), + ("store", "store"), + ("store-24-hour", "store-24-hour"), + ("store-alert", "store-alert"), + ("store-alert-outline", "store-alert-outline"), + ("store-check", "store-check"), + ("store-check-outline", "store-check-outline"), + ("store-clock", "store-clock"), + ("store-clock-outline", "store-clock-outline"), + ("store-cog", "store-cog"), + ("store-cog-outline", "store-cog-outline"), + ("store-edit", "store-edit"), + ("store-edit-outline", "store-edit-outline"), + ("store-marker", "store-marker"), + ("store-marker-outline", "store-marker-outline"), + ("store-minus", "store-minus"), + ("store-minus-outline", "store-minus-outline"), + ("store-off", "store-off"), + ("store-off-outline", "store-off-outline"), + ("store-outline", "store-outline"), + ("store-plus", "store-plus"), + ("store-plus-outline", "store-plus-outline"), + ("store-remove", "store-remove"), + ("store-remove-outline", "store-remove-outline"), + ("store-search", "store-search"), + ("store-search-outline", "store-search-outline"), + ("store-settings", "store-settings"), + ("store-settings-outline", "store-settings-outline"), + ("storefront", "storefront"), + ("storefront-check", "storefront-check"), + ("storefront-check-outline", "storefront-check-outline"), + ("storefront-edit", "storefront-edit"), + ("storefront-edit-outline", "storefront-edit-outline"), + ("storefront-minus", "storefront-minus"), + ("storefront-minus-outline", "storefront-minus-outline"), + ("storefront-outline", "storefront-outline"), + ("storefront-plus", "storefront-plus"), + ("storefront-plus-outline", "storefront-plus-outline"), + ("storefront-remove", "storefront-remove"), + ("storefront-remove-outline", "storefront-remove-outline"), + ("stove", "stove"), + ("strategy", "strategy"), + ("strava", "strava"), + ("stretch-to-page", "stretch-to-page"), + ("stretch-to-page-outline", "stretch-to-page-outline"), + ("string-lights", "string-lights"), + ("string-lights-off", "string-lights-off"), + ("subdirectory-arrow-left", "subdirectory-arrow-left"), + ("subdirectory-arrow-right", "subdirectory-arrow-right"), + ("submarine", "submarine"), + ("subtitles", "subtitles"), + ("subtitles-outline", "subtitles-outline"), + ("subway", "subway"), + ("subway-alert-variant", "subway-alert-variant"), + ("subway-variant", "subway-variant"), + ("summit", "summit"), + ("sun-angle", "sun-angle"), + ("sun-angle-outline", "sun-angle-outline"), + ("sun-clock", "sun-clock"), + ("sun-clock-outline", "sun-clock-outline"), + ("sun-compass", "sun-compass"), + ("sun-snowflake", "sun-snowflake"), + ("sun-snowflake-variant", "sun-snowflake-variant"), + ("sun-thermometer", "sun-thermometer"), + ("sun-thermometer-outline", "sun-thermometer-outline"), + ("sun-wireless", "sun-wireless"), + ("sun-wireless-outline", "sun-wireless-outline"), + ("sunglasses", "sunglasses"), + ("surfing", "surfing"), + ("surround-sound", "surround-sound"), + ("surround-sound-2-0", "surround-sound-2-0"), + ("surround-sound-2-1", "surround-sound-2-1"), + ("surround-sound-3-1", "surround-sound-3-1"), + ("surround-sound-5-1", "surround-sound-5-1"), + ("surround-sound-5-1-2", "surround-sound-5-1-2"), + ("surround-sound-7-1", "surround-sound-7-1"), + ("svg", "svg"), + ("swap-horizontal", "swap-horizontal"), + ("swap-horizontal-bold", "swap-horizontal-bold"), + ("swap-horizontal-circle", "swap-horizontal-circle"), + ("swap-horizontal-circle-outline", "swap-horizontal-circle-outline"), + ("swap-horizontal-variant", "swap-horizontal-variant"), + ("swap-vertical", "swap-vertical"), + ("swap-vertical-bold", "swap-vertical-bold"), + ("swap-vertical-circle", "swap-vertical-circle"), + ("swap-vertical-circle-outline", "swap-vertical-circle-outline"), + ("swap-vertical-variant", "swap-vertical-variant"), + ("swim", "swim"), + ("switch", "switch"), + ("sword", "sword"), + ("sword-cross", "sword-cross"), + ("syllabary-hangul", "syllabary-hangul"), + ("syllabary-hiragana", "syllabary-hiragana"), + ("syllabary-katakana", "syllabary-katakana"), + ("syllabary-katakana-halfwidth", "syllabary-katakana-halfwidth"), + ("symbol", "symbol"), + ("symfony", "symfony"), + ("synagogue", "synagogue"), + ("synagogue-outline", "synagogue-outline"), + ("sync", "sync"), + ("sync-alert", "sync-alert"), + ("sync-circle", "sync-circle"), + ("sync-off", "sync-off"), + ("tab", "tab"), + ("tab-minus", "tab-minus"), + ("tab-plus", "tab-plus"), + ("tab-remove", "tab-remove"), + ("tab-search", "tab-search"), + ("tab-unselected", "tab-unselected"), + ("table", "table"), + ("table-account", "table-account"), + ("table-alert", "table-alert"), + ("table-arrow-down", "table-arrow-down"), + ("table-arrow-left", "table-arrow-left"), + ("table-arrow-right", "table-arrow-right"), + ("table-arrow-up", "table-arrow-up"), + ("table-border", "table-border"), + ("table-cancel", "table-cancel"), + ("table-chair", "table-chair"), + ("table-check", "table-check"), + ("table-clock", "table-clock"), + ("table-cog", "table-cog"), + ("table-column", "table-column"), + ("table-column-plus-after", "table-column-plus-after"), + ("table-column-plus-before", "table-column-plus-before"), + ("table-column-remove", "table-column-remove"), + ("table-column-width", "table-column-width"), + ("table-edit", "table-edit"), + ("table-eye", "table-eye"), + ("table-eye-off", "table-eye-off"), + ("table-filter", "table-filter"), + ("table-furniture", "table-furniture"), + ("table-headers-eye", "table-headers-eye"), + ("table-headers-eye-off", "table-headers-eye-off"), + ("table-heart", "table-heart"), + ("table-key", "table-key"), + ("table-large", "table-large"), + ("table-large-plus", "table-large-plus"), + ("table-large-remove", "table-large-remove"), + ("table-lock", "table-lock"), + ("table-merge-cells", "table-merge-cells"), + ("table-minus", "table-minus"), + ("table-multiple", "table-multiple"), + ("table-network", "table-network"), + ("table-of-contents", "table-of-contents"), + ("table-off", "table-off"), + ("table-picnic", "table-picnic"), + ("table-pivot", "table-pivot"), + ("table-plus", "table-plus"), + ("table-question", "table-question"), + ("table-refresh", "table-refresh"), + ("table-remove", "table-remove"), + ("table-row", "table-row"), + ("table-row-height", "table-row-height"), + ("table-row-plus-after", "table-row-plus-after"), + ("table-row-plus-before", "table-row-plus-before"), + ("table-row-remove", "table-row-remove"), + ("table-search", "table-search"), + ("table-settings", "table-settings"), + ("table-split-cell", "table-split-cell"), + ("table-star", "table-star"), + ("table-sync", "table-sync"), + ("table-tennis", "table-tennis"), + ("tablet", "tablet"), + ("tablet-android", "tablet-android"), + ("tablet-cellphone", "tablet-cellphone"), + ("tablet-dashboard", "tablet-dashboard"), + ("tablet-ipad", "tablet-ipad"), + ("taco", "taco"), + ("tag", "tag"), + ("tag-arrow-down", "tag-arrow-down"), + ("tag-arrow-down-outline", "tag-arrow-down-outline"), + ("tag-arrow-left", "tag-arrow-left"), + ("tag-arrow-left-outline", "tag-arrow-left-outline"), + ("tag-arrow-right", "tag-arrow-right"), + ("tag-arrow-right-outline", "tag-arrow-right-outline"), + ("tag-arrow-up", "tag-arrow-up"), + ("tag-arrow-up-outline", "tag-arrow-up-outline"), + ("tag-check", "tag-check"), + ("tag-check-outline", "tag-check-outline"), + ("tag-faces", "tag-faces"), + ("tag-heart", "tag-heart"), + ("tag-heart-outline", "tag-heart-outline"), + ("tag-minus", "tag-minus"), + ("tag-minus-outline", "tag-minus-outline"), + ("tag-multiple", "tag-multiple"), + ("tag-multiple-outline", "tag-multiple-outline"), + ("tag-off", "tag-off"), + ("tag-off-outline", "tag-off-outline"), + ("tag-outline", "tag-outline"), + ("tag-plus", "tag-plus"), + ("tag-plus-outline", "tag-plus-outline"), + ("tag-remove", "tag-remove"), + ("tag-remove-outline", "tag-remove-outline"), + ("tag-search", "tag-search"), + ("tag-search-outline", "tag-search-outline"), + ("tag-text", "tag-text"), + ("tag-text-outline", "tag-text-outline"), + ("tailwind", "tailwind"), + ("tally-mark-1", "tally-mark-1"), + ("tally-mark-2", "tally-mark-2"), + ("tally-mark-3", "tally-mark-3"), + ("tally-mark-4", "tally-mark-4"), + ("tally-mark-5", "tally-mark-5"), + ("tangram", "tangram"), + ("tank", "tank"), + ("tanker-truck", "tanker-truck"), + ("tape-drive", "tape-drive"), + ("tape-measure", "tape-measure"), + ("target", "target"), + ("target-account", "target-account"), + ("target-variant", "target-variant"), + ("taxi", "taxi"), + ("tea", "tea"), + ("tea-outline", "tea-outline"), + ("teamspeak", "teamspeak"), + ("teamviewer", "teamviewer"), + ("teddy-bear", "teddy-bear"), + ("telegram", "telegram"), + ("telescope", "telescope"), + ("television", "television"), + ("television-ambient-light", "television-ambient-light"), + ("television-box", "television-box"), + ("television-classic", "television-classic"), + ("television-classic-off", "television-classic-off"), + ("television-guide", "television-guide"), + ("television-off", "television-off"), + ("television-pause", "television-pause"), + ("television-play", "television-play"), + ("television-shimmer", "television-shimmer"), + ("television-speaker", "television-speaker"), + ("television-speaker-off", "television-speaker-off"), + ("television-stop", "television-stop"), + ("temperature-celsius", "temperature-celsius"), + ("temperature-fahrenheit", "temperature-fahrenheit"), + ("temperature-kelvin", "temperature-kelvin"), + ("temple-buddhist", "temple-buddhist"), + ("temple-buddhist-outline", "temple-buddhist-outline"), + ("temple-hindu", "temple-hindu"), + ("temple-hindu-outline", "temple-hindu-outline"), + ("tennis", "tennis"), + ("tennis-ball", "tennis-ball"), + ("tent", "tent"), + ("terraform", "terraform"), + ("terrain", "terrain"), + ("test-tube", "test-tube"), + ("test-tube-empty", "test-tube-empty"), + ("test-tube-off", "test-tube-off"), + ("text", "text"), + ("text-account", "text-account"), + ("text-box", "text-box"), + ("text-box-check", "text-box-check"), + ("text-box-check-outline", "text-box-check-outline"), + ("text-box-edit", "text-box-edit"), + ("text-box-edit-outline", "text-box-edit-outline"), + ("text-box-minus", "text-box-minus"), + ("text-box-minus-outline", "text-box-minus-outline"), + ("text-box-multiple", "text-box-multiple"), + ("text-box-multiple-outline", "text-box-multiple-outline"), + ("text-box-outline", "text-box-outline"), + ("text-box-plus", "text-box-plus"), + ("text-box-plus-outline", "text-box-plus-outline"), + ("text-box-remove", "text-box-remove"), + ("text-box-remove-outline", "text-box-remove-outline"), + ("text-box-search", "text-box-search"), + ("text-box-search-outline", "text-box-search-outline"), + ("text-long", "text-long"), + ("text-recognition", "text-recognition"), + ("text-search", "text-search"), + ("text-search-variant", "text-search-variant"), + ("text-shadow", "text-shadow"), + ("text-short", "text-short"), + ("texture", "texture"), + ("texture-box", "texture-box"), + ("theater", "theater"), + ("theme-light-dark", "theme-light-dark"), + ("thermometer", "thermometer"), + ("thermometer-alert", "thermometer-alert"), + ("thermometer-auto", "thermometer-auto"), + ("thermometer-bluetooth", "thermometer-bluetooth"), + ("thermometer-check", "thermometer-check"), + ("thermometer-chevron-down", "thermometer-chevron-down"), + ("thermometer-chevron-up", "thermometer-chevron-up"), + ("thermometer-high", "thermometer-high"), + ("thermometer-lines", "thermometer-lines"), + ("thermometer-low", "thermometer-low"), + ("thermometer-minus", "thermometer-minus"), + ("thermometer-off", "thermometer-off"), + ("thermometer-plus", "thermometer-plus"), + ("thermometer-probe", "thermometer-probe"), + ("thermometer-probe-off", "thermometer-probe-off"), + ("thermometer-water", "thermometer-water"), + ("thermostat", "thermostat"), + ("thermostat-auto", "thermostat-auto"), + ("thermostat-box", "thermostat-box"), + ("thermostat-box-auto", "thermostat-box-auto"), + ("thought-bubble", "thought-bubble"), + ("thought-bubble-outline", "thought-bubble-outline"), + ("thumb-down", "thumb-down"), + ("thumb-down-outline", "thumb-down-outline"), + ("thumb-up", "thumb-up"), + ("thumb-up-outline", "thumb-up-outline"), + ("thumbs-up-down", "thumbs-up-down"), + ("thumbs-up-down-outline", "thumbs-up-down-outline"), + ("ticket", "ticket"), + ("ticket-account", "ticket-account"), + ("ticket-confirmation", "ticket-confirmation"), + ("ticket-confirmation-outline", "ticket-confirmation-outline"), + ("ticket-outline", "ticket-outline"), + ("ticket-percent", "ticket-percent"), + ("ticket-percent-outline", "ticket-percent-outline"), + ("tie", "tie"), + ("tilde", "tilde"), + ("tilde-off", "tilde-off"), + ("timelapse", "timelapse"), + ("timeline", "timeline"), + ("timeline-alert", "timeline-alert"), + ("timeline-alert-outline", "timeline-alert-outline"), + ("timeline-check", "timeline-check"), + ("timeline-check-outline", "timeline-check-outline"), + ("timeline-clock", "timeline-clock"), + ("timeline-clock-outline", "timeline-clock-outline"), + ("timeline-minus", "timeline-minus"), + ("timeline-minus-outline", "timeline-minus-outline"), + ("timeline-outline", "timeline-outline"), + ("timeline-plus", "timeline-plus"), + ("timeline-plus-outline", "timeline-plus-outline"), + ("timeline-question", "timeline-question"), + ("timeline-question-outline", "timeline-question-outline"), + ("timeline-remove", "timeline-remove"), + ("timeline-remove-outline", "timeline-remove-outline"), + ("timeline-text", "timeline-text"), + ("timeline-text-outline", "timeline-text-outline"), + ("timer", "timer"), + ("timer-10", "timer-10"), + ("timer-3", "timer-3"), + ("timer-alert", "timer-alert"), + ("timer-alert-outline", "timer-alert-outline"), + ("timer-cancel", "timer-cancel"), + ("timer-cancel-outline", "timer-cancel-outline"), + ("timer-check", "timer-check"), + ("timer-check-outline", "timer-check-outline"), + ("timer-cog", "timer-cog"), + ("timer-cog-outline", "timer-cog-outline"), + ("timer-edit", "timer-edit"), + ("timer-edit-outline", "timer-edit-outline"), + ("timer-lock", "timer-lock"), + ("timer-lock-open", "timer-lock-open"), + ("timer-lock-open-outline", "timer-lock-open-outline"), + ("timer-lock-outline", "timer-lock-outline"), + ("timer-marker", "timer-marker"), + ("timer-marker-outline", "timer-marker-outline"), + ("timer-minus", "timer-minus"), + ("timer-minus-outline", "timer-minus-outline"), + ("timer-music", "timer-music"), + ("timer-music-outline", "timer-music-outline"), + ("timer-off", "timer-off"), + ("timer-off-outline", "timer-off-outline"), + ("timer-outline", "timer-outline"), + ("timer-pause", "timer-pause"), + ("timer-pause-outline", "timer-pause-outline"), + ("timer-play", "timer-play"), + ("timer-play-outline", "timer-play-outline"), + ("timer-plus", "timer-plus"), + ("timer-plus-outline", "timer-plus-outline"), + ("timer-refresh", "timer-refresh"), + ("timer-refresh-outline", "timer-refresh-outline"), + ("timer-remove", "timer-remove"), + ("timer-remove-outline", "timer-remove-outline"), + ("timer-sand", "timer-sand"), + ("timer-sand-complete", "timer-sand-complete"), + ("timer-sand-empty", "timer-sand-empty"), + ("timer-sand-full", "timer-sand-full"), + ("timer-sand-paused", "timer-sand-paused"), + ("timer-settings", "timer-settings"), + ("timer-settings-outline", "timer-settings-outline"), + ("timer-star", "timer-star"), + ("timer-star-outline", "timer-star-outline"), + ("timer-stop", "timer-stop"), + ("timer-stop-outline", "timer-stop-outline"), + ("timer-sync", "timer-sync"), + ("timer-sync-outline", "timer-sync-outline"), + ("timetable", "timetable"), + ("tire", "tire"), + ("toaster", "toaster"), + ("toaster-off", "toaster-off"), + ("toaster-oven", "toaster-oven"), + ("toggle-switch", "toggle-switch"), + ("toggle-switch-off", "toggle-switch-off"), + ("toggle-switch-off-outline", "toggle-switch-off-outline"), + ("toggle-switch-outline", "toggle-switch-outline"), + ("toggle-switch-variant", "toggle-switch-variant"), + ("toggle-switch-variant-off", "toggle-switch-variant-off"), + ("toilet", "toilet"), + ("toolbox", "toolbox"), + ("toolbox-outline", "toolbox-outline"), + ("tools", "tools"), + ("tooltip", "tooltip"), + ("tooltip-account", "tooltip-account"), + ("tooltip-cellphone", "tooltip-cellphone"), + ("tooltip-check", "tooltip-check"), + ("tooltip-check-outline", "tooltip-check-outline"), + ("tooltip-edit", "tooltip-edit"), + ("tooltip-edit-outline", "tooltip-edit-outline"), + ("tooltip-image", "tooltip-image"), + ("tooltip-image-outline", "tooltip-image-outline"), + ("tooltip-minus", "tooltip-minus"), + ("tooltip-minus-outline", "tooltip-minus-outline"), + ("tooltip-outline", "tooltip-outline"), + ("tooltip-plus", "tooltip-plus"), + ("tooltip-plus-outline", "tooltip-plus-outline"), + ("tooltip-question", "tooltip-question"), + ("tooltip-question-outline", "tooltip-question-outline"), + ("tooltip-remove", "tooltip-remove"), + ("tooltip-remove-outline", "tooltip-remove-outline"), + ("tooltip-text", "tooltip-text"), + ("tooltip-text-outline", "tooltip-text-outline"), + ("tooth", "tooth"), + ("tooth-outline", "tooth-outline"), + ("toothbrush", "toothbrush"), + ("toothbrush-electric", "toothbrush-electric"), + ("toothbrush-paste", "toothbrush-paste"), + ("tor", "tor"), + ("torch", "torch"), + ("tortoise", "tortoise"), + ("toslink", "toslink"), + ("tournament", "tournament"), + ("tow-truck", "tow-truck"), + ("tower-beach", "tower-beach"), + ("tower-fire", "tower-fire"), + ("town-hall", "town-hall"), + ("toy-brick", "toy-brick"), + ("toy-brick-marker", "toy-brick-marker"), + ("toy-brick-marker-outline", "toy-brick-marker-outline"), + ("toy-brick-minus", "toy-brick-minus"), + ("toy-brick-minus-outline", "toy-brick-minus-outline"), + ("toy-brick-outline", "toy-brick-outline"), + ("toy-brick-plus", "toy-brick-plus"), + ("toy-brick-plus-outline", "toy-brick-plus-outline"), + ("toy-brick-remove", "toy-brick-remove"), + ("toy-brick-remove-outline", "toy-brick-remove-outline"), + ("toy-brick-search", "toy-brick-search"), + ("toy-brick-search-outline", "toy-brick-search-outline"), + ("track-light", "track-light"), + ("track-light-off", "track-light-off"), + ("trackpad", "trackpad"), + ("trackpad-lock", "trackpad-lock"), + ("tractor", "tractor"), + ("tractor-variant", "tractor-variant"), + ("trademark", "trademark"), + ("traffic-cone", "traffic-cone"), + ("traffic-light", "traffic-light"), + ("traffic-light-outline", "traffic-light-outline"), + ("train", "train"), + ("train-car", "train-car"), + ("train-car-autorack", "train-car-autorack"), + ("train-car-box", "train-car-box"), + ("train-car-box-full", "train-car-box-full"), + ("train-car-box-open", "train-car-box-open"), + ("train-car-caboose", "train-car-caboose"), + ("train-car-centerbeam", "train-car-centerbeam"), + ("train-car-centerbeam-full", "train-car-centerbeam-full"), + ("train-car-container", "train-car-container"), + ("train-car-flatbed", "train-car-flatbed"), + ("train-car-flatbed-car", "train-car-flatbed-car"), + ("train-car-flatbed-tank", "train-car-flatbed-tank"), + ("train-car-gondola", "train-car-gondola"), + ("train-car-gondola-full", "train-car-gondola-full"), + ("train-car-hopper", "train-car-hopper"), + ("train-car-hopper-covered", "train-car-hopper-covered"), + ("train-car-hopper-full", "train-car-hopper-full"), + ("train-car-intermodal", "train-car-intermodal"), + ("train-car-passenger", "train-car-passenger"), + ("train-car-passenger-door", "train-car-passenger-door"), + ("train-car-passenger-door-open", "train-car-passenger-door-open"), + ("train-car-passenger-variant", "train-car-passenger-variant"), + ("train-car-tank", "train-car-tank"), + ("train-variant", "train-variant"), + ("tram", "tram"), + ("tram-side", "tram-side"), + ("transcribe", "transcribe"), + ("transcribe-close", "transcribe-close"), + ("transfer", "transfer"), + ("transfer-down", "transfer-down"), + ("transfer-left", "transfer-left"), + ("transfer-right", "transfer-right"), + ("transfer-up", "transfer-up"), + ("transit-connection", "transit-connection"), + ("transit-connection-horizontal", "transit-connection-horizontal"), + ("transit-connection-variant", "transit-connection-variant"), + ("transit-detour", "transit-detour"), + ("transit-skip", "transit-skip"), + ("transit-transfer", "transit-transfer"), + ("transition", "transition"), + ("transition-masked", "transition-masked"), + ("translate", "translate"), + ("translate-off", "translate-off"), + ("translate-variant", "translate-variant"), + ("transmission-tower", "transmission-tower"), + ("transmission-tower-export", "transmission-tower-export"), + ("transmission-tower-import", "transmission-tower-import"), + ("transmission-tower-off", "transmission-tower-off"), + ("trash-can", "trash-can"), + ("trash-can-outline", "trash-can-outline"), + ("tray", "tray"), + ("tray-alert", "tray-alert"), + ("tray-arrow-down", "tray-arrow-down"), + ("tray-arrow-up", "tray-arrow-up"), + ("tray-full", "tray-full"), + ("tray-minus", "tray-minus"), + ("tray-plus", "tray-plus"), + ("tray-remove", "tray-remove"), + ("treasure-chest", "treasure-chest"), + ("tree", "tree"), + ("tree-outline", "tree-outline"), + ("trello", "trello"), + ("trending-down", "trending-down"), + ("trending-neutral", "trending-neutral"), + ("trending-up", "trending-up"), + ("triangle", "triangle"), + ("triangle-outline", "triangle-outline"), + ("triangle-small-down", "triangle-small-down"), + ("triangle-small-up", "triangle-small-up"), + ("triangle-wave", "triangle-wave"), + ("triforce", "triforce"), + ("trophy", "trophy"), + ("trophy-award", "trophy-award"), + ("trophy-broken", "trophy-broken"), + ("trophy-outline", "trophy-outline"), + ("trophy-variant", "trophy-variant"), + ("trophy-variant-outline", "trophy-variant-outline"), + ("truck", "truck"), + ("truck-alert", "truck-alert"), + ("truck-alert-outline", "truck-alert-outline"), + ("truck-cargo-container", "truck-cargo-container"), + ("truck-check", "truck-check"), + ("truck-check-outline", "truck-check-outline"), + ("truck-delivery", "truck-delivery"), + ("truck-delivery-outline", "truck-delivery-outline"), + ("truck-fast", "truck-fast"), + ("truck-fast-outline", "truck-fast-outline"), + ("truck-flatbed", "truck-flatbed"), + ("truck-minus", "truck-minus"), + ("truck-minus-outline", "truck-minus-outline"), + ("truck-outline", "truck-outline"), + ("truck-plus", "truck-plus"), + ("truck-plus-outline", "truck-plus-outline"), + ("truck-remove", "truck-remove"), + ("truck-remove-outline", "truck-remove-outline"), + ("truck-snowflake", "truck-snowflake"), + ("truck-trailer", "truck-trailer"), + ("trumpet", "trumpet"), + ("tshirt-crew", "tshirt-crew"), + ("tshirt-crew-outline", "tshirt-crew-outline"), + ("tshirt-v", "tshirt-v"), + ("tshirt-v-outline", "tshirt-v-outline"), + ("tsunami", "tsunami"), + ("tumble-dryer", "tumble-dryer"), + ("tumble-dryer-alert", "tumble-dryer-alert"), + ("tumble-dryer-off", "tumble-dryer-off"), + ("tumblr", "tumblr"), + ("tumblr-box", "tumblr-box"), + ("tumblr-reblog", "tumblr-reblog"), + ("tune", "tune"), + ("tune-variant", "tune-variant"), + ("tune-vertical", "tune-vertical"), + ("tune-vertical-variant", "tune-vertical-variant"), + ("tunnel", "tunnel"), + ("tunnel-outline", "tunnel-outline"), + ("turbine", "turbine"), + ("turkey", "turkey"), + ("turnstile", "turnstile"), + ("turnstile-outline", "turnstile-outline"), + ("turtle", "turtle"), + ("twitch", "twitch"), + ("twitter", "twitter"), + ("twitter-box", "twitter-box"), + ("twitter-circle", "twitter-circle"), + ("two-factor-authentication", "two-factor-authentication"), + ("typewriter", "typewriter"), + ("uber", "uber"), + ("ubisoft", "ubisoft"), + ("ubuntu", "ubuntu"), + ("ufo", "ufo"), + ("ufo-outline", "ufo-outline"), + ("ultra-high-definition", "ultra-high-definition"), + ("umbraco", "umbraco"), + ("umbrella", "umbrella"), + ("umbrella-beach", "umbrella-beach"), + ("umbrella-beach-outline", "umbrella-beach-outline"), + ("umbrella-closed", "umbrella-closed"), + ("umbrella-closed-outline", "umbrella-closed-outline"), + ("umbrella-closed-variant", "umbrella-closed-variant"), + ("umbrella-outline", "umbrella-outline"), + ("undo", "undo"), + ("undo-variant", "undo-variant"), + ("unfold-less-horizontal", "unfold-less-horizontal"), + ("unfold-less-vertical", "unfold-less-vertical"), + ("unfold-more-horizontal", "unfold-more-horizontal"), + ("unfold-more-vertical", "unfold-more-vertical"), + ("ungroup", "ungroup"), + ("unicode", "unicode"), + ("unicorn", "unicorn"), + ("unicorn-variant", "unicorn-variant"), + ("unicycle", "unicycle"), + ("unity", "unity"), + ("unreal", "unreal"), + ("untappd", "untappd"), + ("update", "update"), + ("upload", "upload"), + ("upload-lock", "upload-lock"), + ("upload-lock-outline", "upload-lock-outline"), + ("upload-multiple", "upload-multiple"), + ("upload-network", "upload-network"), + ("upload-network-outline", "upload-network-outline"), + ("upload-off", "upload-off"), + ("upload-off-outline", "upload-off-outline"), + ("upload-outline", "upload-outline"), + ("usb", "usb"), + ("usb-flash-drive", "usb-flash-drive"), + ("usb-flash-drive-outline", "usb-flash-drive-outline"), + ("usb-port", "usb-port"), + ("vacuum", "vacuum"), + ("vacuum-outline", "vacuum-outline"), + ("valve", "valve"), + ("valve-closed", "valve-closed"), + ("valve-open", "valve-open"), + ("van-passenger", "van-passenger"), + ("van-utility", "van-utility"), + ("vanish", "vanish"), + ("vanish-quarter", "vanish-quarter"), + ("vanity-light", "vanity-light"), + ("variable", "variable"), + ("variable-box", "variable-box"), + ("vector-arrange-above", "vector-arrange-above"), + ("vector-arrange-below", "vector-arrange-below"), + ("vector-bezier", "vector-bezier"), + ("vector-circle", "vector-circle"), + ("vector-circle-variant", "vector-circle-variant"), + ("vector-combine", "vector-combine"), + ("vector-curve", "vector-curve"), + ("vector-difference", "vector-difference"), + ("vector-difference-ab", "vector-difference-ab"), + ("vector-difference-ba", "vector-difference-ba"), + ("vector-ellipse", "vector-ellipse"), + ("vector-intersection", "vector-intersection"), + ("vector-line", "vector-line"), + ("vector-link", "vector-link"), + ("vector-point", "vector-point"), + ("vector-point-edit", "vector-point-edit"), + ("vector-point-minus", "vector-point-minus"), + ("vector-point-plus", "vector-point-plus"), + ("vector-point-select", "vector-point-select"), + ("vector-polygon", "vector-polygon"), + ("vector-polygon-variant", "vector-polygon-variant"), + ("vector-polyline", "vector-polyline"), + ("vector-polyline-edit", "vector-polyline-edit"), + ("vector-polyline-minus", "vector-polyline-minus"), + ("vector-polyline-plus", "vector-polyline-plus"), + ("vector-polyline-remove", "vector-polyline-remove"), + ("vector-radius", "vector-radius"), + ("vector-rectangle", "vector-rectangle"), + ("vector-selection", "vector-selection"), + ("vector-square", "vector-square"), + ("vector-square-close", "vector-square-close"), + ("vector-square-edit", "vector-square-edit"), + ("vector-square-minus", "vector-square-minus"), + ("vector-square-open", "vector-square-open"), + ("vector-square-plus", "vector-square-plus"), + ("vector-square-remove", "vector-square-remove"), + ("vector-triangle", "vector-triangle"), + ("vector-union", "vector-union"), + ("venmo", "venmo"), + ("vhs", "vhs"), + ("vibrate", "vibrate"), + ("vibrate-off", "vibrate-off"), + ("video", "video"), + ("video-2d", "video-2d"), + ("video-3d", "video-3d"), + ("video-3d-off", "video-3d-off"), + ("video-3d-variant", "video-3d-variant"), + ("video-4k-box", "video-4k-box"), + ("video-account", "video-account"), + ("video-box", "video-box"), + ("video-box-off", "video-box-off"), + ("video-check", "video-check"), + ("video-check-outline", "video-check-outline"), + ("video-high-definition", "video-high-definition"), + ("video-image", "video-image"), + ("video-input-antenna", "video-input-antenna"), + ("video-input-component", "video-input-component"), + ("video-input-hdmi", "video-input-hdmi"), + ("video-input-scart", "video-input-scart"), + ("video-input-svideo", "video-input-svideo"), + ("video-marker", "video-marker"), + ("video-marker-outline", "video-marker-outline"), + ("video-minus", "video-minus"), + ("video-minus-outline", "video-minus-outline"), + ("video-off", "video-off"), + ("video-off-outline", "video-off-outline"), + ("video-outline", "video-outline"), + ("video-plus", "video-plus"), + ("video-plus-outline", "video-plus-outline"), + ("video-stabilization", "video-stabilization"), + ("video-switch", "video-switch"), + ("video-switch-outline", "video-switch-outline"), + ("video-vintage", "video-vintage"), + ("video-wireless", "video-wireless"), + ("video-wireless-outline", "video-wireless-outline"), + ("view-agenda", "view-agenda"), + ("view-agenda-outline", "view-agenda-outline"), + ("view-array", "view-array"), + ("view-array-outline", "view-array-outline"), + ("view-carousel", "view-carousel"), + ("view-carousel-outline", "view-carousel-outline"), + ("view-column", "view-column"), + ("view-column-outline", "view-column-outline"), + ("view-comfy", "view-comfy"), + ("view-comfy-outline", "view-comfy-outline"), + ("view-compact", "view-compact"), + ("view-compact-outline", "view-compact-outline"), + ("view-dashboard", "view-dashboard"), + ("view-dashboard-edit", "view-dashboard-edit"), + ("view-dashboard-edit-outline", "view-dashboard-edit-outline"), + ("view-dashboard-outline", "view-dashboard-outline"), + ("view-dashboard-variant", "view-dashboard-variant"), + ("view-dashboard-variant-outline", "view-dashboard-variant-outline"), + ("view-day", "view-day"), + ("view-day-outline", "view-day-outline"), + ("view-gallery", "view-gallery"), + ("view-gallery-outline", "view-gallery-outline"), + ("view-grid", "view-grid"), + ("view-grid-outline", "view-grid-outline"), + ("view-grid-plus", "view-grid-plus"), + ("view-grid-plus-outline", "view-grid-plus-outline"), + ("view-headline", "view-headline"), + ("view-list", "view-list"), + ("view-list-outline", "view-list-outline"), + ("view-module", "view-module"), + ("view-module-outline", "view-module-outline"), + ("view-parallel", "view-parallel"), + ("view-parallel-outline", "view-parallel-outline"), + ("view-quilt", "view-quilt"), + ("view-quilt-outline", "view-quilt-outline"), + ("view-sequential", "view-sequential"), + ("view-sequential-outline", "view-sequential-outline"), + ("view-split-horizontal", "view-split-horizontal"), + ("view-split-vertical", "view-split-vertical"), + ("view-stream", "view-stream"), + ("view-stream-outline", "view-stream-outline"), + ("view-week", "view-week"), + ("view-week-outline", "view-week-outline"), + ("vimeo", "vimeo"), + ("vine", "vine"), + ("violin", "violin"), + ("virtual-reality", "virtual-reality"), + ("virus", "virus"), + ("virus-off", "virus-off"), + ("virus-off-outline", "virus-off-outline"), + ("virus-outline", "virus-outline"), + ("vk", "vk"), + ("vk-box", "vk-box"), + ("vk-circle", "vk-circle"), + ("vlc", "vlc"), + ("voicemail", "voicemail"), + ("volcano", "volcano"), + ("volcano-outline", "volcano-outline"), + ("volleyball", "volleyball"), + ("volume", "volume"), + ("volume-equal", "volume-equal"), + ("volume-high", "volume-high"), + ("volume-low", "volume-low"), + ("volume-medium", "volume-medium"), + ("volume-minus", "volume-minus"), + ("volume-mute", "volume-mute"), + ("volume-off", "volume-off"), + ("volume-plus", "volume-plus"), + ("volume-source", "volume-source"), + ("volume-variant-off", "volume-variant-off"), + ("volume-vibrate", "volume-vibrate"), + ("vote", "vote"), + ("vote-outline", "vote-outline"), + ("vpn", "vpn"), + ("vuejs", "vuejs"), + ("vuetify", "vuetify"), + ("walk", "walk"), + ("wall", "wall"), + ("wall-fire", "wall-fire"), + ("wall-sconce", "wall-sconce"), + ("wall-sconce-flat", "wall-sconce-flat"), + ("wall-sconce-flat-outline", "wall-sconce-flat-outline"), + ("wall-sconce-flat-variant", "wall-sconce-flat-variant"), + ("wall-sconce-flat-variant-outline", "wall-sconce-flat-variant-outline"), + ("wall-sconce-outline", "wall-sconce-outline"), + ("wall-sconce-round", "wall-sconce-round"), + ("wall-sconce-round-outline", "wall-sconce-round-outline"), + ("wall-sconce-round-variant", "wall-sconce-round-variant"), + ("wall-sconce-round-variant-outline", "wall-sconce-round-variant-outline"), + ("wall-sconce-variant", "wall-sconce-variant"), + ("wallet", "wallet"), + ("wallet-giftcard", "wallet-giftcard"), + ("wallet-membership", "wallet-membership"), + ("wallet-outline", "wallet-outline"), + ("wallet-plus", "wallet-plus"), + ("wallet-plus-outline", "wallet-plus-outline"), + ("wallet-travel", "wallet-travel"), + ("wallpaper", "wallpaper"), + ("wan", "wan"), + ("wardrobe", "wardrobe"), + ("wardrobe-outline", "wardrobe-outline"), + ("warehouse", "warehouse"), + ("washing-machine", "washing-machine"), + ("washing-machine-alert", "washing-machine-alert"), + ("washing-machine-off", "washing-machine-off"), + ("watch", "watch"), + ("watch-export", "watch-export"), + ("watch-export-variant", "watch-export-variant"), + ("watch-import", "watch-import"), + ("watch-import-variant", "watch-import-variant"), + ("watch-variant", "watch-variant"), + ("watch-vibrate", "watch-vibrate"), + ("watch-vibrate-off", "watch-vibrate-off"), + ("water", "water"), + ("water-alert", "water-alert"), + ("water-alert-outline", "water-alert-outline"), + ("water-boiler", "water-boiler"), + ("water-boiler-alert", "water-boiler-alert"), + ("water-boiler-auto", "water-boiler-auto"), + ("water-boiler-off", "water-boiler-off"), + ("water-check", "water-check"), + ("water-check-outline", "water-check-outline"), + ("water-circle", "water-circle"), + ("water-minus", "water-minus"), + ("water-minus-outline", "water-minus-outline"), + ("water-off", "water-off"), + ("water-off-outline", "water-off-outline"), + ("water-opacity", "water-opacity"), + ("water-outline", "water-outline"), + ("water-percent", "water-percent"), + ("water-percent-alert", "water-percent-alert"), + ("water-plus", "water-plus"), + ("water-plus-outline", "water-plus-outline"), + ("water-polo", "water-polo"), + ("water-pump", "water-pump"), + ("water-pump-off", "water-pump-off"), + ("water-remove", "water-remove"), + ("water-remove-outline", "water-remove-outline"), + ("water-sync", "water-sync"), + ("water-thermometer", "water-thermometer"), + ("water-thermometer-outline", "water-thermometer-outline"), + ("water-well", "water-well"), + ("water-well-outline", "water-well-outline"), + ("waterfall", "waterfall"), + ("watering-can", "watering-can"), + ("watering-can-outline", "watering-can-outline"), + ("watermark", "watermark"), + ("wave", "wave"), + ("waveform", "waveform"), + ("waves", "waves"), + ("waves-arrow-left", "waves-arrow-left"), + ("waves-arrow-right", "waves-arrow-right"), + ("waves-arrow-up", "waves-arrow-up"), + ("waze", "waze"), + ("weather-cloudy", "weather-cloudy"), + ("weather-cloudy-alert", "weather-cloudy-alert"), + ("weather-cloudy-arrow-right", "weather-cloudy-arrow-right"), + ("weather-cloudy-clock", "weather-cloudy-clock"), + ("weather-dust", "weather-dust"), + ("weather-fog", "weather-fog"), + ("weather-hail", "weather-hail"), + ("weather-hazy", "weather-hazy"), + ("weather-hurricane", "weather-hurricane"), + ("weather-lightning", "weather-lightning"), + ("weather-lightning-rainy", "weather-lightning-rainy"), + ("weather-night", "weather-night"), + ("weather-night-partly-cloudy", "weather-night-partly-cloudy"), + ("weather-partly-cloudy", "weather-partly-cloudy"), + ("weather-partly-lightning", "weather-partly-lightning"), + ("weather-partly-rainy", "weather-partly-rainy"), + ("weather-partly-snowy", "weather-partly-snowy"), + ("weather-partly-snowy-rainy", "weather-partly-snowy-rainy"), + ("weather-pouring", "weather-pouring"), + ("weather-rainy", "weather-rainy"), + ("weather-snowy", "weather-snowy"), + ("weather-snowy-heavy", "weather-snowy-heavy"), + ("weather-snowy-rainy", "weather-snowy-rainy"), + ("weather-sunny", "weather-sunny"), + ("weather-sunny-alert", "weather-sunny-alert"), + ("weather-sunny-off", "weather-sunny-off"), + ("weather-sunset", "weather-sunset"), + ("weather-sunset-down", "weather-sunset-down"), + ("weather-sunset-up", "weather-sunset-up"), + ("weather-tornado", "weather-tornado"), + ("weather-windy", "weather-windy"), + ("weather-windy-variant", "weather-windy-variant"), + ("web", "web"), + ("web-box", "web-box"), + ("web-cancel", "web-cancel"), + ("web-check", "web-check"), + ("web-clock", "web-clock"), + ("web-minus", "web-minus"), + ("web-off", "web-off"), + ("web-plus", "web-plus"), + ("web-refresh", "web-refresh"), + ("web-remove", "web-remove"), + ("web-sync", "web-sync"), + ("webcam", "webcam"), + ("webcam-off", "webcam-off"), + ("webhook", "webhook"), + ("webpack", "webpack"), + ("webrtc", "webrtc"), + ("wechat", "wechat"), + ("weight", "weight"), + ("weight-gram", "weight-gram"), + ("weight-kilogram", "weight-kilogram"), + ("weight-lifter", "weight-lifter"), + ("weight-pound", "weight-pound"), + ("whatsapp", "whatsapp"), + ("wheel-barrow", "wheel-barrow"), + ("wheelchair", "wheelchair"), + ("wheelchair-accessibility", "wheelchair-accessibility"), + ("whistle", "whistle"), + ("whistle-outline", "whistle-outline"), + ("white-balance-auto", "white-balance-auto"), + ("white-balance-incandescent", "white-balance-incandescent"), + ("white-balance-iridescent", "white-balance-iridescent"), + ("white-balance-sunny", "white-balance-sunny"), + ("widgets", "widgets"), + ("widgets-outline", "widgets-outline"), + ("wifi", "wifi"), + ("wifi-alert", "wifi-alert"), + ("wifi-arrow-down", "wifi-arrow-down"), + ("wifi-arrow-left", "wifi-arrow-left"), + ("wifi-arrow-left-right", "wifi-arrow-left-right"), + ("wifi-arrow-right", "wifi-arrow-right"), + ("wifi-arrow-up", "wifi-arrow-up"), + ("wifi-arrow-up-down", "wifi-arrow-up-down"), + ("wifi-cancel", "wifi-cancel"), + ("wifi-check", "wifi-check"), + ("wifi-cog", "wifi-cog"), + ("wifi-lock", "wifi-lock"), + ("wifi-lock-open", "wifi-lock-open"), + ("wifi-marker", "wifi-marker"), + ("wifi-minus", "wifi-minus"), + ("wifi-off", "wifi-off"), + ("wifi-plus", "wifi-plus"), + ("wifi-refresh", "wifi-refresh"), + ("wifi-remove", "wifi-remove"), + ("wifi-settings", "wifi-settings"), + ("wifi-star", "wifi-star"), + ("wifi-strength-1", "wifi-strength-1"), + ("wifi-strength-1-alert", "wifi-strength-1-alert"), + ("wifi-strength-1-lock", "wifi-strength-1-lock"), + ("wifi-strength-1-lock-open", "wifi-strength-1-lock-open"), + ("wifi-strength-2", "wifi-strength-2"), + ("wifi-strength-2-alert", "wifi-strength-2-alert"), + ("wifi-strength-2-lock", "wifi-strength-2-lock"), + ("wifi-strength-2-lock-open", "wifi-strength-2-lock-open"), + ("wifi-strength-3", "wifi-strength-3"), + ("wifi-strength-3-alert", "wifi-strength-3-alert"), + ("wifi-strength-3-lock", "wifi-strength-3-lock"), + ("wifi-strength-3-lock-open", "wifi-strength-3-lock-open"), + ("wifi-strength-4", "wifi-strength-4"), + ("wifi-strength-4-alert", "wifi-strength-4-alert"), + ("wifi-strength-4-lock", "wifi-strength-4-lock"), + ("wifi-strength-4-lock-open", "wifi-strength-4-lock-open"), + ("wifi-strength-alert-outline", "wifi-strength-alert-outline"), + ("wifi-strength-lock-open-outline", "wifi-strength-lock-open-outline"), + ("wifi-strength-lock-outline", "wifi-strength-lock-outline"), + ("wifi-strength-off", "wifi-strength-off"), + ("wifi-strength-off-outline", "wifi-strength-off-outline"), + ("wifi-strength-outline", "wifi-strength-outline"), + ("wifi-sync", "wifi-sync"), + ("wikipedia", "wikipedia"), + ("wind-power", "wind-power"), + ("wind-power-outline", "wind-power-outline"), + ("wind-turbine", "wind-turbine"), + ("wind-turbine-alert", "wind-turbine-alert"), + ("wind-turbine-check", "wind-turbine-check"), + ("window-close", "window-close"), + ("window-closed", "window-closed"), + ("window-closed-variant", "window-closed-variant"), + ("window-maximize", "window-maximize"), + ("window-minimize", "window-minimize"), + ("window-open", "window-open"), + ("window-open-variant", "window-open-variant"), + ("window-restore", "window-restore"), + ("window-shutter", "window-shutter"), + ("window-shutter-alert", "window-shutter-alert"), + ("window-shutter-auto", "window-shutter-auto"), + ("window-shutter-cog", "window-shutter-cog"), + ("window-shutter-open", "window-shutter-open"), + ("window-shutter-settings", "window-shutter-settings"), + ("windsock", "windsock"), + ("wiper", "wiper"), + ("wiper-wash", "wiper-wash"), + ("wiper-wash-alert", "wiper-wash-alert"), + ("wizard-hat", "wizard-hat"), + ("wordpress", "wordpress"), + ("wrap", "wrap"), + ("wrap-disabled", "wrap-disabled"), + ("wrench", "wrench"), + ("wrench-check", "wrench-check"), + ("wrench-check-outline", "wrench-check-outline"), + ("wrench-clock", "wrench-clock"), + ("wrench-clock-outline", "wrench-clock-outline"), + ("wrench-cog", "wrench-cog"), + ("wrench-cog-outline", "wrench-cog-outline"), + ("wrench-outline", "wrench-outline"), + ("wunderlist", "wunderlist"), + ("xamarin", "xamarin"), + ("xamarin-outline", "xamarin-outline"), + ("xda", "xda"), + ("xing", "xing"), + ("xing-circle", "xing-circle"), + ("xml", "xml"), + ("xmpp", "xmpp"), + ("y-combinator", "y-combinator"), + ("yahoo", "yahoo"), + ("yammer", "yammer"), + ("yeast", "yeast"), + ("yelp", "yelp"), + ("yin-yang", "yin-yang"), + ("yoga", "yoga"), + ("youtube", "youtube"), + ("youtube-gaming", "youtube-gaming"), + ("youtube-studio", "youtube-studio"), + ("youtube-subscription", "youtube-subscription"), + ("youtube-tv", "youtube-tv"), + ("yurt", "yurt"), + ("z-wave", "z-wave"), + ("zend", "zend"), + ("zigbee", "zigbee"), + ("zip-box", "zip-box"), + ("zip-box-outline", "zip-box-outline"), + ("zip-disk", "zip-disk"), + ("zodiac-aquarius", "zodiac-aquarius"), + ("zodiac-aries", "zodiac-aries"), + ("zodiac-cancer", "zodiac-cancer"), + ("zodiac-capricorn", "zodiac-capricorn"), + ("zodiac-gemini", "zodiac-gemini"), + ("zodiac-leo", "zodiac-leo"), + ("zodiac-libra", "zodiac-libra"), + ("zodiac-pisces", "zodiac-pisces"), + ("zodiac-sagittarius", "zodiac-sagittarius"), + ("zodiac-scorpio", "zodiac-scorpio"), + ("zodiac-taurus", "zodiac-taurus"), + ("zodiac-virgo", "zodiac-virgo"), + ], + default="information-outline", + max_length=50, + verbose_name="Icon", + ), + ), + migrations.AlterField( + model_name="notification", + name="send_at", + field=models.DateTimeField( + default=django.utils.timezone.now, verbose_name="Send notification at" + ), + ), + migrations.AlterField( + model_name="oauthaccesstoken", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="oauthapplication", + name="client_secret", + field=oauth2_provider.models.ClientSecretField( + blank=True, + db_index=True, + default=oauth2_provider.generators.generate_client_secret, + help_text="Hashed on Save. Copy it now if this is a new secret.", + max_length=255, + ), + ), + migrations.AlterField( + model_name="oauthapplication", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="oauthgrant", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="oauthidtoken", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="oauthrefreshtoken", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="personinvitation", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.DeleteModel( + name="PersonalICalUrl", + ), + ] diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py index c6cee9a8c6bbefed3439eef156b685f5484e4a13..809fcb65647abf70b258017a82fc2113fc95a1a2 100644 --- a/aleksis/core/mixins.py +++ b/aleksis/core/mixins.py @@ -2,11 +2,11 @@ import os from datetime import datetime -from typing import Any, Callable, List, Optional, Union +from typing import Any, Callable, ClassVar, List, Optional, Union from django.conf import settings from django.contrib import messages -from django.contrib.auth.views import LoginView, SuccessURLAllowedHostsMixin +from django.contrib.auth.views import LoginView, RedirectURLMixin from django.contrib.contenttypes.models import ContentType from django.contrib.sites.managers import CurrentSiteManager from django.contrib.sites.models import Site @@ -16,7 +16,7 @@ from django.db.models.fields import CharField, TextField from django.forms.forms import BaseForm from django.forms.models import ModelForm, ModelFormMetaclass from django.http import HttpResponse -from django.utils.functional import lazy +from django.utils.functional import classproperty, lazy from django.utils.translation import gettext as _ from django.views.generic import CreateView, UpdateView from django.views.generic.edit import DeleteView, ModelFormMixin @@ -127,7 +127,7 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase): """ # Defines a material design icon associated with this type of model - icon_ = "radio_button_unchecked" + icon_ = "radiobox-blank" site = models.ForeignKey( Site, on_delete=models.CASCADE, default=settings.SITE_ID, editable=False @@ -465,7 +465,7 @@ class SuccessMessageMixin(ModelFormMixin): return super().form_valid(form) -class SuccessNextMixin(SuccessURLAllowedHostsMixin): +class SuccessNextMixin(RedirectURLMixin): redirect_field_name = "next" def get_success_url(self) -> str: @@ -492,8 +492,8 @@ class AdvancedDeleteView(DeleteView): success_message: Optional[str] = None - def delete(self, request, *args, **kwargs): - r = super().delete(request, *args, **kwargs) + def form_valid(self, form): + r = super().form_valid(form) if self.success_message: messages.success(self.request, self.success_message) return r @@ -543,3 +543,35 @@ class PublicFilePreferenceMixin(FilePreference): return os.path.join( self.upload_path, preferences_settings.FILE_PREFERENCE_UPLOAD_DIR, self.identifier() ) + + +class RegistryObject: + """Generic registry to allow registration of subclasses over all apps.""" + + _registry: ClassVar[Optional[dict[str, "RegistryObject"]]] = None + name: ClassVar[str] = "" + + def __init_subclass__(cls): + if getattr(cls, "_registry", None) is None: + cls._registry = {} + else: + if not cls.name: + cls.name = cls.__name__ + cls._register() + + @classmethod + def _register(cls): + if cls.name and cls.name not in cls._registry: + cls._registry[cls.name] = cls + + @classproperty + def registered_objects_dict(cls): + return cls._registry + + @classproperty + def registered_objects_list(cls): + return list(cls._registry.values()) + + @classmethod + def get_object_by_name(cls, name): + cls.registered_objects_dict.get(name) diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 812a9d254ca4bff2e9372ed7969d0cb2b811c176..04d7703ca42a6f87ea2fcd41487d9e173022d2cb 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -1,8 +1,10 @@ # flake8: noqa: DJ01 +import base64 import hmac +import uuid from datetime import date, datetime, timedelta from typing import Any, Iterable, List, Optional, Sequence, Union -from urllib.parse import urlparse +from urllib.parse import urljoin, urlparse from django.conf import settings from django.contrib.auth import get_user_model @@ -24,9 +26,13 @@ from django.utils.functional import classproperty from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ +import customidenticon import jsonstore from cachalot.api import cachalot_disabled from cache_memoize import cache_memoize +from celery.result import AsyncResult +from celery_progress.backend import Progress +from ckeditor.fields import RichTextField from django_celery_results.models import TaskResult from django_cte import CTEQuerySet, With from dynamic_preferences.models import PerInstancePreferenceModel @@ -46,7 +52,11 @@ from oauth2_provider.models import ( from phonenumber_field.modelfields import PhoneNumberField from polymorphic.models import PolymorphicModel -from aleksis.core.data_checks import BrokenDashboardWidgetDataCheck, DataCheck, DataCheckRegistry +from aleksis.core.data_checks import ( + BrokenDashboardWidgetDataCheck, + DataCheck, + field_validation_data_check_factory, +) from .managers import ( CurrentSiteManagerWithoutMigrations, @@ -60,6 +70,7 @@ from .mixins import ( ExtensibleModel, GlobalPermissionModel, PureDjangoModel, + RegistryObject, SchoolTermRelatedExtensibleModel, ) from .tasks import send_notification @@ -165,9 +176,9 @@ class Person(ExtensibleModel): ), ] - icon_ = "person" + icon_ = "account-outline" - SEX_CHOICES = [("f", _("female")), ("m", _("male"))] + SEX_CHOICES = [("f", _("female")), ("m", _("male")), ("x", _("other"))] user = models.OneToOneField( get_user_model(), @@ -305,7 +316,7 @@ class Person(ExtensibleModel): @property def unread_notifications(self) -> QuerySet: """Get all unread notifications for this person.""" - return self.notifications.filter(read=False) + return self.notifications.filter(read=False, send_at__lte=timezone.now()) @property def unread_notifications_count(self) -> int: @@ -314,7 +325,12 @@ class Person(ExtensibleModel): @property def initials(self): - return f"{self.first_name[0]}{self.last_name[0]}".upper() + initials = "" + if self.first_name: + initials += self.first_name[0] + if self.last_name: + initials += self.last_name[0] + return initials.upper() or "?" user_info_tracker = FieldTracker(fields=("first_name", "last_name", "email", "user_id")) @@ -334,6 +350,20 @@ class Person(ExtensibleModel): q = q.union(group.child_groups_recursive) return q + @property + @cache_memoize(60 * 60) + def identicon_url(self): + identicon = customidenticon.create(self.full_name, border=35) + base64_data = base64.b64encode(identicon).decode("ascii") + return f"data:image/png;base64,{base64_data}" + + @property + def avatar_url(self): + if self.avatar: + return self.avatar.url + else: + return self.identicon_url + def save(self, *args, **kwargs): # Determine all fields that were changed since last load changed = self.user_info_tracker.changed() @@ -435,6 +465,8 @@ class AdditionalField(ExtensibleModel): field_type = models.CharField( verbose_name=_("Type of field"), choices=FIELD_CHOICES, max_length=50 ) + required = models.BooleanField(verbose_name=_("Required"), default=False) + help_text = models.TextField(verbose_name=_("Help text / description"), blank=True) def __str__(self) -> str: return self.title @@ -472,7 +504,7 @@ class Group(SchoolTermRelatedExtensibleModel): ), ] - icon_ = "group" + icon_ = "account-multiple-outline" name = models.CharField(verbose_name=_("Long name"), max_length=255) short_name = models.CharField( @@ -716,6 +748,12 @@ class Notification(ExtensibleModel, TimeStampedModel): description = models.TextField(max_length=500, verbose_name=_("Description")) link = models.URLField(blank=True, verbose_name=_("Link")) + icon = models.CharField( + max_length=50, choices=ICONS, verbose_name=_("Icon"), default="information-outline" + ) + + send_at = models.DateTimeField(default=timezone.now, verbose_name=_("Send notification at")) + read = models.BooleanField(default=False, verbose_name=_("Read")) sent = models.BooleanField(default=False, verbose_name=_("Sent")) @@ -724,10 +762,14 @@ class Notification(ExtensibleModel, TimeStampedModel): def save(self, **kwargs): super().save(**kwargs) - if not self.sent: - send_notification(self.pk, resend=True) - self.sent = True - super().save(**kwargs) + if not self.sent and self.send_at <= timezone.now(): + self.send() + super().save(**kwargs) + + def send(self, resend: bool = False) -> Optional[AsyncResult]: + """Send the notification to the recipient.""" + if not self.sent or resend: + return send_notification.delay(self.pk, resend=True) class Meta: verbose_name = _("Notification") @@ -872,13 +914,11 @@ class AnnouncementRecipient(ExtensibleModel): verbose_name_plural = _("Announcement recipients") -class DashboardWidget(PolymorphicModel, PureDjangoModel): +class DashboardWidget(RegistryObject, PolymorphicModel, PureDjangoModel): """Base class for dashboard widgets on the index page.""" objects = UninstallRenitentPolymorphicManager() - data_checks = [BrokenDashboardWidgetDataCheck] - @staticmethod def get_media(widgets: Union[QuerySet, Iterable]): """Return all media required to render the selected widgets.""" @@ -965,6 +1005,19 @@ class ExternalLinkWidget(DashboardWidget): verbose_name_plural = _("External link widgets") +class StaticContentWidget(DashboardWidget): + template = "core/dashboard_widget/static_content_widget.html" + + content = RichTextField(verbose_name=_("Content")) + + def get_context(self, request): + return {"title": self.title, "content": self.content} + + class Meta: + verbose_name = _("Static content widget") + verbose_name_plural = _("Static content widgets") + + class DashboardWidgetOrder(ExtensibleModel): widget = models.ForeignKey( DashboardWidget, on_delete=models.CASCADE, verbose_name=_("Dashboard widget") @@ -1036,6 +1089,9 @@ class CustomMenuItem(ExtensibleModel): models.UniqueConstraint(fields=["menu", "name"], name="unique_name_per_menu"), ] + def get_absolute_url(self): + return reverse("admin:core_custommenuitem_change", args=[self.id]) + class GroupType(ExtensibleModel): """Group type model. @@ -1107,10 +1163,10 @@ class GroupPreferenceModel(PerInstancePreferenceModel, PureDjangoModel): class DataCheckResult(ExtensibleModel): """Save the result of a data check for a specific object.""" - check = models.CharField( + data_check = models.CharField( max_length=255, verbose_name=_("Related data check task"), - choices=DataCheckRegistry.data_checks_choices, + choices=DataCheck.data_checks_choices, ) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) @@ -1122,7 +1178,7 @@ class DataCheckResult(ExtensibleModel): @property def related_check(self) -> DataCheck: - return DataCheckRegistry.data_checks_by_name[self.check] + return DataCheck.registered_objects_dict[self.data_check] def solve(self, solve_option: str = "default"): self.related_check.solve(self, solve_option) @@ -1180,7 +1236,9 @@ class PDFFile(ExtensibleModel): expires_at = models.DateTimeField( verbose_name=_("File expires at"), default=_get_default_expiration ) - html_file = models.FileField(upload_to="pdfs/", verbose_name=_("Generated HTML file")) + html_file = models.FileField( + upload_to="pdfs/", verbose_name=_("Generated HTML file"), blank=True, null=True + ) file = models.FileField( upload_to="pdfs/", blank=True, null=True, verbose_name=_("Generated PDF file") ) @@ -1201,6 +1259,21 @@ class TaskUserAssignment(ExtensibleModel): get_user_model(), on_delete=models.CASCADE, verbose_name=_("Task user") ) + title = models.CharField(max_length=255, verbose_name=_("Title")) + back_url = models.URLField(verbose_name=_("Back URL"), blank=True) + progress_title = models.CharField(max_length=255, verbose_name=_("Progress title"), blank=True) + error_message = models.TextField(verbose_name=_("Error message"), blank=True) + success_message = models.TextField(verbose_name=_("Success message"), blank=True) + redirect_on_success_url = models.URLField(verbose_name=_("Redirect on success URL"), blank=True) + additional_button_title = models.CharField( + max_length=255, verbose_name=_("Additional button title"), blank=True + ) + additional_button_url = models.URLField(verbose_name=_("Additional button URL"), blank=True) + additional_button_icon = models.CharField( + max_length=255, verbose_name=_("Additional button icon"), blank=True + ) + result_fetched = models.BooleanField(default=False, verbose_name=_("Result fetched")) + @classmethod def create_for_task_id(cls, task_id: str, user: "User") -> "TaskUserAssignment": # Use get_or_create to ensure the TaskResult exists @@ -1209,6 +1282,51 @@ class TaskUserAssignment(ExtensibleModel): result, __ = TaskResult.objects.get_or_create(task_id=task_id) return cls.objects.create(task_result=result, user=user) + def get_progress(self) -> dict[str, any]: + """Get progress information for this task.""" + progress = Progress(AsyncResult(self.task_result.task_id)) + return progress.get_info() + + def get_progress_with_meta(self) -> dict[str, any]: + """Get progress information for this task.""" + progress = self.get_progress() + progress["meta"] = self + return progress + + def create_notification(self) -> Optional[Notification]: + """Create a notification for this task.""" + progress = self.get_progress() + if progress["state"] == "SUCCESS": + title = _("Background task completed successfully") + description = _("The background task '{}' has been completed successfully.").format( + self.title + ) + icon = "check-circle-outline" + + elif progress["state"] == "FAILURE": + title = _("Background task failed") + description = _("The background task '{}' has failed.").format(self.title) + icon = "alert-octagon-outline" + else: + # Task not yet finished + return + + link = urljoin(settings.BASE_URL, self.get_absolute_url()) + + notification = Notification( + sender=_("Background task"), + recipient=self.user.person, + title=title, + description=description, + link=link, + icon=icon, + ) + notification.save() + return notification + + def get_absolute_url(self) -> str: + return f"/celery_progress/{self.task_result.task_id}" + class Meta: verbose_name = _("Task user assignment") verbose_name_plural = _("Task user assignments") @@ -1264,7 +1382,7 @@ class OAuthApplication(AbstractApplication): # Optional list of alloewd scopes allowed_scopes = ArrayField( - models.CharField(max_length=32), + models.CharField(max_length=255), verbose_name=_("Allowed scopes that clients can request"), null=True, blank=True, @@ -1307,3 +1425,25 @@ class OAuthRefreshToken(AbstractRefreshToken): """Placeholder for customising the RefreshToken model.""" pass + + +class Room(ExtensibleModel): + short_name = models.CharField(verbose_name=_("Short name"), max_length=255) + name = models.CharField(verbose_name=_("Long name"), max_length=255) + + def __str__(self) -> str: + return f"{self.name} ({self.short_name})" + + def get_absolute_url(self) -> str: + return reverse("timetable", args=["room", self.id]) + + class Meta: + permissions = (("view_room_timetable", _("Can view room timetable")),) + ordering = ["name", "short_name"] + verbose_name = _("Room") + verbose_name_plural = _("Rooms") + constraints = [ + models.UniqueConstraint( + fields=["site_id", "short_name"], name="unique_room_short_name_per_site" + ), + ] diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py index f1fb0227eab16a152f29918e91b37d0808471812..631a9337654db24782f823dd956c286855ca7792 100644 --- a/aleksis/core/preferences.py +++ b/aleksis/core/preferences.py @@ -198,6 +198,21 @@ class NotificationChannels(ChoicePreference): choices = get_notification_choices_lazy() +@person_preferences_registry.register +class Design(ChoicePreference): + """Change design (on supported pages).""" + + section = theme + name = "design" + default = "light" + verbose_name = _("Select Design") + choices = [ + # ("system", _("System Design")), + ("light", _("Light mode")), + # ("dark", _("Dark mode")), + ] + + @site_preferences_registry.register class PrimaryGroupPattern(StringPreference): """Regular expression to match primary group.""" @@ -271,6 +286,14 @@ class AllowPasswordChange(BooleanPreference): verbose_name = _("Allow users to change their passwords") +@site_preferences_registry.register +class AllowPasswordReset(BooleanPreference): + section = auth + name = "allow_password_reset" + default = True + verbose_name = _("Allow users to reset their passwords") + + @site_preferences_registry.register class SignupEnabled(BooleanPreference): section = auth @@ -279,6 +302,14 @@ class SignupEnabled(BooleanPreference): verbose_name = _("Enable signup") +@site_preferences_registry.register +class AllowedUsernameRegex(StringPreference): + section = auth + name = "allowed_username_regex" + default = ".+" + verbose_name = _("Regular expression for allowed usernames") + + @site_preferences_registry.register class InviteEnabled(BooleanPreference): section = auth @@ -317,20 +348,6 @@ class OAuthAllowedGrants(MultipleChoicePreference): required = False -@site_preferences_registry.register -class AvailableLanguages(MultipleChoicePreference): - """Available languages of your AlekSIS instance.""" - - section = internationalisation - name = "languages" - default = [code[0] for code in settings.LANGUAGES] - widget = SelectMultiple - verbose_name = _("Available languages") - field_attribute = {"initial": []} - choices = settings.LANGUAGES - required = True - - @site_preferences_registry.register class DataChecksSendEmails(BooleanPreference): """Enable email sending if data checks detect problems.""" @@ -422,6 +439,16 @@ class PersonChangeNotificationContact(StringPreference): required = False +@site_preferences_registry.register +class PersonPreferPhoto(BooleanPreference): + """Preference, whether personal photos should be displayed instead of avatars.""" + + section = account + name = "person_prefer_photo" + default = False + verbose_name = _("Prefer personal photos over avatars") + + @site_preferences_registry.register class PDFFileExpirationDuration(IntegerPreference): """PDF file expiration duration.""" diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py index 022fa11a00671a3acb0775c2229a378bd3981342..b95f3bbac10a21aada6afeb25acfab9b01b70ef6 100644 --- a/aleksis/core/rules.py +++ b/aleksis/core/rules.py @@ -7,14 +7,40 @@ from .util.predicates import ( has_global_perm, has_object_perm, has_person, + is_anonymous, is_current_person, is_group_owner, is_notification_recipient, + is_own_celery_task, is_site_preference_set, ) rules.add_perm("core", rules.always_allow) +# Login +login_predicate = is_anonymous +rules.add_perm("core.login_rule", login_predicate) + +# Logout +logout_predicate = ~is_anonymous +rules.add_perm("core.logout_rule", logout_predicate) + +# Account +view_account_predicate = has_person +rules.add_perm("core.view_account_rule", view_account_predicate) + +# 2FA +manage_2fa_predicate = has_person +rules.add_perm("core.manage_2fa_rule", manage_2fa_predicate) + +# Social Connections +manage_social_connections_predicate = has_person +rules.add_perm("core.manage_social_connections_rule", manage_social_connections_predicate) + +# Authorized tokens +manage_authorized_tokens_predicate = has_person +rules.add_perm("core.manage_authorized_tokens_rule", manage_authorized_tokens_predicate) + # View dashboard view_dashboard_predicate = is_site_preference_set("general", "anonymous_dashboard") | has_person rules.add_perm("core.view_dashboard_rule", view_dashboard_predicate) @@ -186,6 +212,10 @@ change_person_preferences = has_person & ( ) rules.add_perm("core.change_person_preferences_rule", change_person_preferences) +# Change account preferences +change_account_preferences = has_person +rules.add_perm("core.change_account_preferences_rule", change_account_preferences) + # Change group preferences change_group_preferences = has_person & ( has_global_perm("core.change_group_preferences") @@ -268,16 +298,6 @@ rules.add_perm("core.create_schoolterm_rule", create_school_term_predicate) edit_school_term_predicate = has_person & has_global_perm("core.change_schoolterm") rules.add_perm("core.edit_schoolterm_rule", edit_school_term_predicate) -# View admin menu -view_admin_menu_predicate = has_person & ( - manage_data_predicate - | view_school_term_predicate - | impersonate_predicate - | view_system_status_predicate - | view_announcements_predicate -) -rules.add_perm("core.view_admin_menu_rule", view_admin_menu_predicate) - # View group stats view_group_stats_predicate = has_person & ( has_global_perm("core.view_group_stats") | has_object_perm("core.view_group_stats") @@ -319,18 +339,24 @@ edit_default_dashboard_predicate = has_person & has_global_perm("core.edit_defau rules.add_perm("core.edit_default_dashboard_rule", edit_default_dashboard_predicate) # django-allauth -can_register_predicate = is_site_preference_set(section="auth", pref="signup_enabled") -rules.add_perm("core.can_register", can_register_predicate) +signup_predicate = is_site_preference_set(section="auth", pref="signup_enabled") +rules.add_perm("core.signup_rule", signup_predicate) + +change_password_predicate = is_site_preference_set(section="auth", pref="allow_password_change") +rules.add_perm("core.change_password_rule", change_password_predicate) -can_change_password_predicate = is_site_preference_set(section="auth", pref="allow_password_change") -rules.add_perm("core.can_change_password", can_change_password_predicate) +reset_password_predicate = is_site_preference_set(section="auth", pref="allow_password_reset") +rules.add_perm("core.reset_password_rule", reset_password_predicate) # django-invitations invite_enabled_predicate = is_site_preference_set(section="auth", pref="invite_enabled") rules.add_perm("core.invite_enabled", invite_enabled_predicate) -can_invite_predicate = invite_enabled_predicate & has_person & has_global_perm("core.invite") -rules.add_perm("core.can_invite", can_invite_predicate) +accept_invite_predicate = has_person & invite_enabled_predicate +rules.add_perm("core.accept_invite_rule", accept_invite_predicate) + +invite_predicate = has_person & invite_enabled_predicate & has_global_perm("core.invite") +rules.add_perm("core.invite_rule", invite_predicate) # OAuth2 permissions create_oauthapplication_predicate = has_person & has_global_perm("core.add_oauthapplication") @@ -348,12 +374,32 @@ rules.add_perm("core.edit_oauthapplication_rule", edit_oauth_application_predica delete_oauth_applications_predicate = has_person & has_global_perm("core.delete_oauth_applications") rules.add_perm("core.delete_oauth_applications_rule", delete_oauth_applications_predicate) +view_django_admin_predicate = has_person & is_superuser +rules.add_perm("core.view_django_admin_rule", view_django_admin_predicate) + +# View admin menu +view_admin_menu_predicate = has_person & ( + manage_data_predicate + | view_school_term_predicate + | impersonate_predicate + | view_system_status_predicate + | view_announcements_predicate + | view_data_check_results_predicate + | view_oauth_applications_predicate + | view_dashboard_widget_predicate + | view_django_admin_predicate +) +rules.add_perm("core.view_admin_menu_rule", view_admin_menu_predicate) + # Upload and browse files via CKEditor upload_files_ckeditor_predicate = has_person & has_global_perm("core.upload_files_ckeditor") rules.add_perm("core.upload_files_ckeditor_rule", upload_files_ckeditor_predicate) manage_person_permissions_predicate = has_person & is_superuser -rules.add_perm("core.manage_permissions", manage_person_permissions_predicate) +rules.add_perm("core.manage_permissions_rule", manage_person_permissions_predicate) test_pdf_generation_predicate = has_person & has_global_perm("core.test_pdf") rules.add_perm("core.test_pdf_rule", test_pdf_generation_predicate) + +view_progress_predicate = has_person & is_own_celery_task +rules.add_perm("core.view_progress_rule", view_progress_predicate) diff --git a/aleksis/core/schema/__init__.py b/aleksis/core/schema/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..f7ab8487f2bcb7f5566e79951c69e7e8f9ec2ac2 --- /dev/null +++ b/aleksis/core/schema/__init__.py @@ -0,0 +1,170 @@ +from django.apps import apps +from django.contrib.messages import get_messages +from django.core.exceptions import PermissionDenied +from django.db.models import Q + +import graphene +from guardian.shortcuts import get_objects_for_user +from haystack.inputs import AutoQuery +from haystack.query import SearchQuerySet +from haystack.utils.loading import UnifiedIndex + +from ..models import CustomMenu, Notification, PDFFile, Person, TaskUserAssignment +from ..util.apps import AppConfig +from ..util.core_helpers import get_allowed_object_ids, get_app_module, get_app_packages, has_person +from .celery_progress import CeleryProgressFetchedMutation, CeleryProgressType +from .custom_menu import CustomMenuType +from .group import GroupType # noqa +from .installed_apps import AppType +from .message import MessageType +from .notification import MarkNotificationReadMutation, NotificationType +from .pdf import PDFFileType +from .person import PersonMutation, PersonType +from .school_term import SchoolTermType # noqa +from .search import SearchResultType +from .system_properties import SystemPropertiesType +from .user import UserType + + +class Query(graphene.ObjectType): + ping = graphene.String(payload=graphene.String()) + + notifications = graphene.List(NotificationType) + + persons = graphene.List(PersonType) + person_by_id = graphene.Field(PersonType, id=graphene.ID()) + person_by_id_or_me = graphene.Field(PersonType, id=graphene.ID()) + + who_am_i = graphene.Field(UserType) + + system_properties = graphene.Field(SystemPropertiesType) + installed_apps = graphene.List(AppType) + + celery_progress_by_task_id = graphene.Field(CeleryProgressType, task_id=graphene.String()) + celery_progress_by_user = graphene.List(CeleryProgressType) + + pdf_by_id = graphene.Field(PDFFileType, id=graphene.ID()) + + search_snippets = graphene.List( + SearchResultType, query=graphene.String(), limit=graphene.Int(required=False) + ) + + messages = graphene.List(MessageType) + + custom_menu_by_name = graphene.Field(CustomMenuType, name=graphene.String()) + + def resolve_ping(root, info, payload) -> str: + return payload + + def resolve_notifications(root, info, **kwargs): + return Notification.objects.filter( + Q( + pk__in=get_objects_for_user( + info.context.user, "core.view_person", Person.objects.all() + ) + ) + | Q(recipient=info.context.user.person) + ) + + def resolve_persons(root, info, **kwargs): + return get_objects_for_user(info.context.user, "core.view_person", Person.objects.all()) + + def resolve_person_by_id(root, info, id): # noqa + person = Person.objects.get(pk=id) + if not info.context.user.has_perm("core.view_person_rule", person): + raise PermissionDenied() + return person + + def resolve_person_by_id_or_me(root, info, **kwargs): # noqa + # Returns person associated with current user if id is None, else the person with the id + if "id" not in kwargs or kwargs["id"] is None: + return info.context.user.person if has_person(info.context.user) else None + + person = Person.objects.get(pk=kwargs["id"]) + if not info.context.user.has_perm("core.view_person_rule", person): + raise PermissionDenied() + return person + + def resolve_who_am_i(root, info, **kwargs): + return info.context.user + + def resolve_system_properties(root, info, **kwargs): + return True + + def resolve_installed_apps(root, info, **kwargs): + return [app for app in apps.get_app_configs() if isinstance(app, AppConfig)] + + def resolve_celery_progress_by_task_id(root, info, task_id, **kwargs): + task = TaskUserAssignment.objects.get(task_result__task_id=task_id) + + if not info.context.user.has_perm("core.view_progress_rule", task): + raise PermissionDenied() + progress = task.get_progress_with_meta() + return progress + + def resolve_celery_progress_by_user(root, info, **kwargs): + if info.context.user.is_anonymous: + return None + tasks = TaskUserAssignment.objects.filter(user=info.context.user) + return [ + task.get_progress_with_meta() + for task in tasks + if task.get_progress_with_meta()["complete"] is False + ] + + def resolve_pdf_by_id(root, info, id, **kwargs): # noqa + pdf_file = PDFFile.objects.get(pk=id) + if has_person(info.context) and not info.context.user.person == pdf_file.person: + raise PermissionDenied() + return pdf_file + + def resolve_search_snippets(root, info, query, limit=-1, **kwargs): + indexed_models = UnifiedIndex().get_indexed_models() + allowed_object_ids = get_allowed_object_ids(info.context.user, indexed_models) + results = SearchQuerySet().filter(id__in=allowed_object_ids).filter(text=AutoQuery(query)) + + if limit < 0: + return results + + return results[:limit] + + def resolve_messages(root, info, **kwargs): + return get_messages(info) + + def resolve_custom_menu_by_name(root, info, name, **kwargs): + return CustomMenu.get_default(name) + + +class Mutation(graphene.ObjectType): + update_person = PersonMutation.Field() + + mark_notification_read = MarkNotificationReadMutation.Field() + + celery_progress_fetched = CeleryProgressFetchedMutation.Field() + + +def build_global_schema(): + """Build global GraphQL schema from all apps.""" + query_bases = [Query] + mutation_bases = [Mutation] + + for app in get_app_packages(): + schema_mod = get_app_module(app, "schema") + if not schema_mod: + # The app does not define a schema + continue + + if AppQuery := getattr(schema_mod, "Query", None): + query_bases.append(AppQuery) + if AppMutation := getattr(schema_mod, "Mutation", None): + mutation_bases.append(AppMutation) + + # Define classes using all query/mutation classes as mixins + # cf. https://docs.graphene-python.org/projects/django/en/latest/schema/#adding-to-the-schema + GlobalQuery = type("GlobalQuery", tuple(query_bases), {}) + GlobalMutation = type("GlobalMutation", tuple(mutation_bases), {}) + + return graphene.Schema(query=GlobalQuery, mutation=GlobalMutation) + + +schema = build_global_schema() diff --git a/aleksis/core/schema/base.py b/aleksis/core/schema/base.py new file mode 100644 index 0000000000000000000000000000000000000000..e927dadccaaab7b2bf39c2110286970222f70f5b --- /dev/null +++ b/aleksis/core/schema/base.py @@ -0,0 +1,26 @@ +import graphene +from graphene_django import DjangoObjectType + +from ..util.core_helpers import queryset_rules_filter + + +class RulesObjectType(DjangoObjectType): + class Meta: + abstract = True + + @classmethod + def get_queryset(cls, queryset, info, perm): + q = super().get_queryset(queryset, info) + + return queryset_rules_filter(info.context, q, perm) + + +class FieldFileType(graphene.ObjectType): + url = graphene.String() + absolute_url = graphene.String() + + def resolve_url(root, info, **kwargs): + return root.url if root else "" + + def resolve_absolute_url(root, info, **kwargs): + return info.context.build_absolute_uri(root.url) if root else "" diff --git a/aleksis/core/schema/celery_progress.py b/aleksis/core/schema/celery_progress.py new file mode 100644 index 0000000000000000000000000000000000000000..5502b3317c47841c7ef02e9e5165db9ef37fe338 --- /dev/null +++ b/aleksis/core/schema/celery_progress.py @@ -0,0 +1,98 @@ +from django.contrib.messages.constants import DEFAULT_TAGS + +import graphene +from graphene import ObjectType +from graphene_django import DjangoObjectType + +from ..models import TaskUserAssignment + + +class CeleryProgressMessage(ObjectType): + message = graphene.String(required=True) + level = graphene.Int(required=True) + tag = graphene.String(required=True) + + def resolve_message(root, info, **kwargs): + return root[1] + + def resolve_level(root, info, **kwargs): + return root[0] + + def resolve_tag(root, info, **kwargs): + return DEFAULT_TAGS.get(root[0], "info") + + +class CeleryProgressAdditionalButtonType(ObjectType): + title = graphene.String(required=True) + url = graphene.String(required=True) + icon = graphene.String() + + +class CeleryProgressMetaType(DjangoObjectType): + additional_button = graphene.Field(CeleryProgressAdditionalButtonType, required=False) + task_id = graphene.String(required=True) + + def resolve_task_id(root, info, **kwargs): + return root.task_result.task_id + + class Meta: + model = TaskUserAssignment + fields = ( + "title", + "back_url", + "progress_title", + "error_message", + "success_message", + "redirect_on_success_url", + "additional_button", + ) + + @classmethod + def get_queryset(cls, queryset, info, perm="core.view_progress_rule"): + return super().get_queryset(queryset, info, perm) + + def resolve_additional_button(root, info, **kwargs): + if not root.additional_button_title or not root.additional_button_url: + return None + return { + "title": root.additional_button_title, + "url": root.additional_button_url, + "icon": root.additional_button_icon, + } + + +class CeleryProgressProgressType(ObjectType): + current = graphene.Int() + total = graphene.Int() + percent = graphene.Float() + + +class CeleryProgressType(graphene.ObjectType): + state = graphene.String() + complete = graphene.Boolean() + success = graphene.Boolean() + progress = graphene.Field(CeleryProgressProgressType) + messages = graphene.List(CeleryProgressMessage) + meta = graphene.Field(CeleryProgressMetaType) + + def resolve_messages(root, info, **kwargs): # noqa + if root["complete"] and isinstance(root["result"], list): + return root["result"] + return root["progress"].get("messages", []) + + +class CeleryProgressFetchedMutation(graphene.Mutation): + class Arguments: + task_id = graphene.String(required=True) + + celery_progress = graphene.Field(CeleryProgressType) + + def mutate(root, info, task_id, **kwargs): + task = TaskUserAssignment.objects.filter(task_result__task_id=task_id) + + if not info.context.user.has_perm("core.view_progress_rule", task): + return None + task.result_fetched = True + task.save() + progress = task.get_progress_with_meta() + return CeleryProgressFetchedMutation(celery_progress=progress) diff --git a/aleksis/core/schema/custom_menu.py b/aleksis/core/schema/custom_menu.py new file mode 100644 index 0000000000000000000000000000000000000000..5c485e401f1bbc946710b3eced67b1fd5cdbaf16 --- /dev/null +++ b/aleksis/core/schema/custom_menu.py @@ -0,0 +1,24 @@ +import graphene +from graphene_django import DjangoObjectType + +from ..models import CustomMenu, CustomMenuItem + + +class CustomMenuItemType(DjangoObjectType): + class Meta: + model = CustomMenuItem + + name = graphene.Field(graphene.String) + url = graphene.Field(graphene.String) + icon = graphene.Field(graphene.String) + + +class CustomMenuType(DjangoObjectType): + class Meta: + model = CustomMenu + + name = graphene.Field(graphene.String) + items = graphene.List(CustomMenuItemType) + + def resolve_items(root, info, **kwargs): + return root.items.all() diff --git a/aleksis/core/schema/group.py b/aleksis/core/schema/group.py new file mode 100644 index 0000000000000000000000000000000000000000..327daff3dd09d54053b683ba4cefb71da8ba6e5b --- /dev/null +++ b/aleksis/core/schema/group.py @@ -0,0 +1,8 @@ +from graphene_django import DjangoObjectType + +from ..models import Group + + +class GroupType(DjangoObjectType): + class Meta: + model = Group diff --git a/aleksis/core/schema/installed_apps.py b/aleksis/core/schema/installed_apps.py new file mode 100644 index 0000000000000000000000000000000000000000..879575466ae2f06795c75c9b928fdc7f8cdb4499 --- /dev/null +++ b/aleksis/core/schema/installed_apps.py @@ -0,0 +1,58 @@ +import graphene +from graphene import ObjectType + + +class AppURLType(ObjectType): + name = graphene.String(required=True) + url = graphene.String(required=True) + + +class CopyrightType(ObjectType): + years = graphene.String(required=True) + name = graphene.String(required=True) + email = graphene.String(required=True) + + +class LicenceFlagsType(ObjectType): + isFsfLibre = graphene.Boolean(required=True) + isOsiApproved = graphene.Boolean(required=True) + + +class SubLicenceType(ObjectType): + isDeprecatedLicenseId = graphene.Boolean(default_value=False) + isFsfLibre = graphene.Boolean(default_value=False) + isOsiApproved = graphene.Boolean(default_value=False) + licenseId = graphene.String(required=True) + name = graphene.String(required=True) + referenceNumber = graphene.Int(default_value=-1) + url = graphene.String() + + +class LicenceType(ObjectType): + verbose_name = graphene.String(required=True) + flags = graphene.Field(LicenceFlagsType, required=True) + licences = graphene.List(SubLicenceType) + + +class AppType(ObjectType): + copyrights = graphene.List(CopyrightType) + licence = graphene.Field(LicenceType) + name = graphene.String(required=True) + verbose_name = graphene.String(required=True) + version = graphene.String() + urls = graphene.List(AppURLType) + + def resolve_verbose_name(root, info, **kwargs): + return root.get_name() + + def resolve_version(root, info, **kwargs): + return root.get_version() + + def resolve_licence(root, info, **kwargs): + return root.get_licence_dict() + + def resolve_urls(root, info, **kwargs): + return root.get_urls_dict() + + def resolve_copyrights(root, info, **kwargs): + return root.get_copyright_dicts() diff --git a/aleksis/core/schema/message.py b/aleksis/core/schema/message.py new file mode 100644 index 0000000000000000000000000000000000000000..c3a4cadf40db6b082e51e19aec6a654952905a61 --- /dev/null +++ b/aleksis/core/schema/message.py @@ -0,0 +1,12 @@ +import graphene + + +class MessageType(graphene.ObjectType): + tags = graphene.String() + message = graphene.String() + + def resolve_tags(root, info, **kwargs): + return root.tags + + def resolve_message(root, info, **kwargs): + return root.message diff --git a/aleksis/core/schema/notification.py b/aleksis/core/schema/notification.py new file mode 100644 index 0000000000000000000000000000000000000000..1e10a74e1e4e7b13c56063fb63dd978a8947adf4 --- /dev/null +++ b/aleksis/core/schema/notification.py @@ -0,0 +1,29 @@ +from django.core.exceptions import PermissionDenied + +import graphene +from graphene_django import DjangoObjectType + +from ..models import Notification + + +class NotificationType(DjangoObjectType): + class Meta: + model = Notification + + +class MarkNotificationReadMutation(graphene.Mutation): + class Arguments: + id = graphene.ID() # noqa + + notification = graphene.Field(NotificationType) + + @classmethod + def mutate(cls, root, info, id): # noqa + notification = Notification.objects.get(pk=id) + + if not info.context.user.has_perm("core.mark_notification_as_read_rule", notification): + raise PermissionDenied() + notification.read = True + notification.save() + + return MarkNotificationReadMutation(notification=notification) diff --git a/aleksis/core/schema/pdf.py b/aleksis/core/schema/pdf.py new file mode 100644 index 0000000000000000000000000000000000000000..a87eabf7bc60b23c04f8d6a3b334e03e61522a8e --- /dev/null +++ b/aleksis/core/schema/pdf.py @@ -0,0 +1,13 @@ +import graphene +from graphene_django import DjangoObjectType + +from ..models import PDFFile +from .base import FieldFileType + + +class PDFFileType(DjangoObjectType): + file = graphene.Field(FieldFileType) + + class Meta: + model = PDFFile + exclude = ["html_file"] diff --git a/aleksis/core/schema/permissions.py b/aleksis/core/schema/permissions.py new file mode 100644 index 0000000000000000000000000000000000000000..ac2d0041027aad9d2bb945983ed594adb91b60fc --- /dev/null +++ b/aleksis/core/schema/permissions.py @@ -0,0 +1,6 @@ +import graphene + + +class GlobalPermissionType(graphene.ObjectType): + name = graphene.ID() + result = graphene.Boolean() diff --git a/aleksis/core/schema/person.py b/aleksis/core/schema/person.py new file mode 100644 index 0000000000000000000000000000000000000000..821cade46c4ca76539e284bd1311a6992869e782 --- /dev/null +++ b/aleksis/core/schema/person.py @@ -0,0 +1,206 @@ +from typing import Union + +from django.core.exceptions import PermissionDenied +from django.utils import timezone + +import graphene +from graphene_django import DjangoObjectType +from graphene_django.forms.mutation import DjangoModelFormMutation + +from ..forms import PersonForm +from ..models import DummyPerson, Person +from ..util.core_helpers import get_site_preferences, is_impersonate +from .base import FieldFileType +from .notification import NotificationType + + +class PersonPreferencesType(graphene.ObjectType): + theme_design_mode = graphene.String() + + def resolve_theme_design_mode(parent, info, **kwargs): + return parent["theme__design"] + + +class PersonType(DjangoObjectType): + class Meta: + model = Person + + full_name = graphene.String() + username = graphene.String() + userid = graphene.ID() + photo = graphene.Field(FieldFileType) + avatar = graphene.Field(FieldFileType) + avatar_url = graphene.String() + avatar_content_url = graphene.String() + secondary_image_url = graphene.String() + + notifications = graphene.List(NotificationType) + unread_notifications_count = graphene.Int() + + is_dummy = graphene.Boolean() + is_impersonate = graphene.Boolean() + preferences = graphene.Field(PersonPreferencesType) + + can_edit_person = graphene.Boolean() + can_delete_person = graphene.Boolean() + can_change_person_preferences = graphene.Boolean() + can_impersonate_person = graphene.Boolean() + can_invite_person = graphene.Boolean() + + def resolve_street(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_address_rule", root): + return root.street + return None + + def resolve_housenumber(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_address_rule", root): + return root.housenumber + return None + + def resolve_postal_code(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_address_rule", root): + return root.postal_code + return None + + def resolve_place(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_address_rule", root): + return root.place + return None + + def resolve_phone_number(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_contact_details_rule", root): + return root.phone_number + return None + + def resolve_mobile_number(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_contact_details_rule", root): + return root.mobile_number + return None + + def resolve_email(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_contact_details_rule", root): + return root.email + return None + + def resolve_date_of_birth(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_personal_details_rule", root): + return root.date_of_birth + return None + + def resolve_place_of_birth(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_personal_details_rule", root): + return root.place_of_birth + return None + + def resolve_children(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_personal_details_rule", root): + return root.children.all() + return [] + + def resolve_guardians(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_personal_details_rule", root): + return root.guardians.all() + return [] + + def resolve_member_of(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_person_groups_rule", root): + return root.member_of.all() + return [] + + def resolve_owner_of(root, info, **kwargs): # noqa + if info.context.user.has_perm("core.view_person_groups_rule", root): + return root.owner_of.all() + return [] + + def resolve_username(root, info, **kwargs): # noqa + return root.user.username if root.user else None + + def resolve_userid(root, info, **kwargs): # noqa + return root.user.id if root.user else None + + def resolve_unread_notifications_count(root, info, **kwargs): # noqa + return root.unread_notifications_count + + def resolve_photo(root, info, **kwargs): + if info.context.user.has_perm("core.view_photo_rule", root): + return root.photo + return None + + def resolve_avatar(root, info, **kwargs): + if info.context.user.has_perm("core.view_avatar_rule", root): + return root.avatar + return None + + def resolve_avatar_url(root, info, **kwargs): + if info.context.user.has_perm("core.view_avatar_rule", root) and root.avatar: + return root.avatar.url + return root.identicon_url + + def resolve_avatar_content_url(root, info, **kwargs): # noqa + # Returns the url for the main image for a person, either the avatar, photo or identicon, + # based on permissions and preferences + if get_site_preferences()["account__person_prefer_photo"]: + if info.context.user.has_perm("core.view_photo_rule", root) and root.photo: + return root.photo.url + elif info.context.user.has_perm("core.view_avatar_rule", root) and root.avatar: + return root.avatar.url + + else: + if info.context.user.has_perm("core.view_avatar_rule", root) and root.avatar: + return root.avatar.url + elif info.context.user.has_perm("core.view_photo_rule", root) and root.photo: + return root.photo.url + + return root.identicon_url + + def resolve_secondary_image_url(root, info, **kwargs): # noqa + # returns either the photo url or the avatar url, + # depending on the one returned by avatar_content_url + + if get_site_preferences()["account__person_prefer_photo"]: + if info.context.user.has_perm("core.view_avatar_rule", root) and root.avatar: + return root.avatar.url + elif info.context.user.has_perm("core.view_photo_rule", root) and root.photo: + return root.photo.url + return None + + def resolve_is_dummy(root: Union[Person, DummyPerson], info, **kwargs): + return root.is_dummy if hasattr(root, "is_dummy") else False + + def resolve_is_impersonate(root: Person, info, **kwargs): + return is_impersonate(info.context) + + def resolve_notifications(root: Person, info, **kwargs): + return root.notifications.filter(send_at__lte=timezone.now()).order_by("read", "-created") + + def resolve_can_edit_person(root, info, **kwargs): # noqa + return info.context.user.has_perm("core.edit_person_rule", root) + + def resolve_can_delete_person(root, info, **kwargs): # noqa + return info.context.user.has_perm("core.delete_person_rule", root) + + def resolve_can_change_person_preferences(root, info, **kwargs): # noqa + return info.context.user.has_perm("core.change_person_preferences_rule", root) + + def resolve_can_impersonate_person(root, info, **kwargs): # noqa + return root.user and info.context.user.has_perm("core.impersonate_rule", root) + + def resolve_can_invite_person(root, info, **kwargs): # noqa + return (not root.user) and info.context.user.has_perm("core.can_invite_rule", root) + + +class PersonMutation(DjangoModelFormMutation): + person = graphene.Field(PersonType) + + class Meta: + form_class = PersonForm + + @classmethod + def perform_mutate(cls, form, info): + if not form.initial: + if not info.context.user.has_perm("core.create_person_rule"): + raise PermissionDenied() + else: + if not info.context.user.has_perm("core.edit_person_rule", form.instance): + raise PermissionDenied() + return super().perform_mutate(form, info) diff --git a/aleksis/core/schema/school_term.py b/aleksis/core/schema/school_term.py new file mode 100644 index 0000000000000000000000000000000000000000..1f6e504bc280689c9011a63da7d0af3b5ec53a06 --- /dev/null +++ b/aleksis/core/schema/school_term.py @@ -0,0 +1,8 @@ +from graphene_django import DjangoObjectType + +from ..models import SchoolTerm + + +class SchoolTermType(DjangoObjectType): + class Meta: + model = SchoolTerm diff --git a/aleksis/core/schema/search.py b/aleksis/core/schema/search.py new file mode 100644 index 0000000000000000000000000000000000000000..290ac8818730e42e540c752362f5e2dcf5ea2840 --- /dev/null +++ b/aleksis/core/schema/search.py @@ -0,0 +1,32 @@ +import graphene + + +class SearchModelType(graphene.ObjectType): + absolute_url = graphene.String() + name = graphene.String() + icon = graphene.String() + + def resolve_absolute_url(root, info, **kwargs): + if hasattr(root, "get_absolute_url"): + return root.get_absolute_url() + else: + return "#!" + + def resolve_name(root, info, **kwargs): + return str(root) + + def resolve_icon(root, info, **kwargs): + return getattr(root, "icon_", "") + + +class SearchResultType(graphene.ObjectType): + app_label = graphene.String() + model_name = graphene.String() + score = graphene.Int() + obj = graphene.Field(SearchModelType) + verbose_name = graphene.String() + verbose_name_plural = graphene.String() + text = graphene.String() + + def resolve_obj(root, info, **kwargs): # noqa + return root.object diff --git a/aleksis/core/schema/site_preferences.py b/aleksis/core/schema/site_preferences.py new file mode 100644 index 0000000000000000000000000000000000000000..20193e4b53b26f6202986120453fdb217e4cb3d7 --- /dev/null +++ b/aleksis/core/schema/site_preferences.py @@ -0,0 +1,45 @@ +from django.templatetags.static import static + +import graphene + + +class ThemeLogoType(graphene.ObjectType): + url = graphene.String(required=False) + + +class SitePreferencesType(graphene.ObjectType): + general_title = graphene.String() + + theme_logo = graphene.Field(ThemeLogoType) + theme_primary = graphene.String() + theme_secondary = graphene.String() + + footer_imprint_url = graphene.String() + footer_privacy_url = graphene.String() + + account_person_prefer_photo = graphene.Boolean() + + def resolve_general_title(parent, info, **kwargs): + return parent["general__title"] + + def resolve_theme_logo(parent, info, **kwargs): + return ( + parent["theme__logo"] + if parent["theme__logo"] + else {"url": static("/img/aleksis-banner.svg")} + ) + + def resolve_theme_primary(parent, info, **kwargs): + return parent["theme__primary"] + + def resolve_theme_secondary(parent, info, **kwargs): + return parent["theme__secondary"] + + def resolve_footer_imprint_url(parent, info, **kwargs): + return parent["footer__imprint_url"] + + def resolve_footer_privacy_url(parent, info, **kwargs): + return parent["footer__privacy_url"] + + def resolve_account_person_prefer_photo(parent, info, **kwargs): + return parent["account__person_prefer_photo"] diff --git a/aleksis/core/schema/system_properties.py b/aleksis/core/schema/system_properties.py new file mode 100644 index 0000000000000000000000000000000000000000..1546512fc4e488faa01a93d87510249577c63388 --- /dev/null +++ b/aleksis/core/schema/system_properties.py @@ -0,0 +1,40 @@ +from django.conf import settings +from django.utils import translation + +import graphene + +from ..models import CustomMenu +from ..util.frontend_helpers import get_language_cookie +from .custom_menu import CustomMenuType +from .site_preferences import SitePreferencesType + + +class LanguageType(graphene.ObjectType): + code = graphene.String(required=True) + name = graphene.String(required=True) + name_local = graphene.String(required=True) + name_translated = graphene.String(required=True) + bidi = graphene.Boolean(required=True) + cookie = graphene.String(required=True) + + +class SystemPropertiesType(graphene.ObjectType): + current_language = graphene.String(required=True) + available_languages = graphene.List(LanguageType) + site_preferences = graphene.Field(SitePreferencesType) + custom_menu_by_name = graphene.Field(CustomMenuType) + + def resolve_current_language(parent, info, **kwargs): + return info.context.LANGUAGE_CODE + + def resolve_available_languages(parent, info, **kwargs): + return [ + translation.get_language_info(code) | {"cookie": get_language_cookie(code)} + for code, name in settings.LANGUAGES + ] + + def resolve_site_preferences(root, info, **kwargs): + return info.context.site.preferences + + def resolve_custom_menu_by_name(root, info, name, **kwargs): + return CustomMenu.get_default(name) diff --git a/aleksis/core/schema/user.py b/aleksis/core/schema/user.py new file mode 100644 index 0000000000000000000000000000000000000000..1c1ff08ea2c4c77a6ab68af9e389a36db66a764c --- /dev/null +++ b/aleksis/core/schema/user.py @@ -0,0 +1,26 @@ +import graphene + +from .permissions import GlobalPermissionType +from .person import PersonType + + +class UserType(graphene.ObjectType): + id = graphene.ID() # noqa + username = graphene.String() + first_name = graphene.String() + last_name = graphene.String() + + is_authenticated = graphene.Boolean(required=True) + is_anonymous = graphene.Boolean(required=True) + + person = graphene.Field(PersonType) + + global_permissions_by_name = graphene.List( + GlobalPermissionType, permissions=graphene.List(graphene.String) + ) + + def resolve_global_permissions_by_name(root, info, permissions, **kwargs): + return [ + {"name": permission_name, "result": info.context.user.has_perm(permission_name)} + for permission_name in permissions + ] diff --git a/aleksis/core/search_indexes.py b/aleksis/core/search_indexes.py index 7583a774eaadebb1cbfdb35d08dc0ddcfb355eea..ea0b4dae56290791bf9f99c919aa6d2d7925b64e 100644 --- a/aleksis/core/search_indexes.py +++ b/aleksis/core/search_indexes.py @@ -1,4 +1,4 @@ -from .models import Group, Person +from .models import Group, Person, Room from .util.search import Indexable, SearchIndex @@ -12,3 +12,9 @@ class GroupIndex(SearchIndex, Indexable): """Haystack index for searching groups.""" model = Group + + +class RoomIndex(SearchIndex, Indexable): + """Haystack index for searching rooms.""" + + model = Room diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index d467febc0bfe38b57abd67fe058d9835576552e2..d68a0ed621ebe6ebcda900ded4aff9b513f17dd4 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -1,13 +1,20 @@ import os import warnings +from copy import deepcopy from glob import glob from socket import getfqdn +from django.utils.log import DEFAULT_LOGGING from django.utils.translation import gettext_lazy as _ from dynaconf import LazySettings -from .util.core_helpers import get_app_packages, merge_app_settings, monkey_patch +from .util.core_helpers import ( + get_app_packages, + get_app_settings_overrides, + merge_app_settings, + monkey_patch, +) monkey_patch() @@ -36,7 +43,10 @@ _settings = LazySettings( ) # Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Cache directory for external operations +CACHE_DIR = _settings.get("caching.dir", os.path.join(BASE_DIR, "cache")) SILENCED_SYSTEM_CHECKS = [] @@ -46,29 +56,6 @@ SECRET_KEY = _settings.get("secret_key", "DoNotUseInProduction") # SECURITY WARNING: don't run with debug turned on in production! DEBUG = _settings.get("maintenance.debug", False) INTERNAL_IPS = _settings.get("maintenance.internal_ips", []) -DEBUG_TOOLBAR_CONFIG = { - "RENDER_PANELS": True, - "SHOW_COLLAPSED": True, - "JQUERY_URL": "", - "SHOW_TOOLBAR_CALLBACK": "aleksis.core.util.core_helpers.dt_show_toolbar", - "DISABLE_PANELS": {}, -} - -DEBUG_TOOLBAR_PANELS = [ - "debug_toolbar.panels.versions.VersionsPanel", - "debug_toolbar.panels.timer.TimerPanel", - "debug_toolbar.panels.settings.SettingsPanel", - "debug_toolbar.panels.headers.HeadersPanel", - "debug_toolbar.panels.request.RequestPanel", - "debug_toolbar.panels.sql.SQLPanel", - "debug_toolbar.panels.cache.CachePanel", - "debug_toolbar.panels.staticfiles.StaticFilesPanel", - "debug_toolbar.panels.templates.TemplatesPanel", - "debug_toolbar.panels.signals.SignalsPanel", - "debug_toolbar.panels.logging.LoggingPanel", - "debug_toolbar.panels.profiling.ProfilingPanel", - "django_uwsgi.panels.UwsgiPanel", -] UWSGI = { "module": "aleksis.core.wsgi", @@ -76,11 +63,27 @@ UWSGI = { UWSGI_SERVE_STATIC = True UWSGI_SERVE_MEDIA = False +DEV_SERVER_PORT = 8000 +DJANGO_VITE_DEV_SERVER_PORT = DEV_SERVER_PORT + 1 + ALLOWED_HOSTS = _settings.get("http.allowed_hosts", [getfqdn(), "localhost", "127.0.0.1", "[::1]"]) BASE_URL = _settings.get( - "http.base_url", "http://localhost:8000" if DEBUG else f"https://{ALLOWED_HOSTS[0]}" + "http.base_url", f"http://localhost:{DEV_SERVER_PORT}" if DEBUG else f"//{ALLOWED_HOSTS[0]}" ) + +def generate_trusted_origins(): + origins = [] + origins += [f"http://{host}" for host in ALLOWED_HOSTS] + origins += [f"https://{host}" for host in ALLOWED_HOSTS] + if DEBUG: + origins += [f"http://{host}:{DEV_SERVER_PORT}" for host in ALLOWED_HOSTS] + origins += [f"http://{host}:{DJANGO_VITE_DEV_SERVER_PORT}" for host in ALLOWED_HOSTS] + return origins + + +CSRF_TRUSTED_ORIGINS = _settings.get("http.trusted_origins", generate_trusted_origins()) + # Application definition INSTALLED_APPS = [ "django.contrib.admin", @@ -108,12 +111,11 @@ INSTALLED_APPS = [ "sass_processor", "django_any_js", "django_yarnpkg", + "django_vite", "django_tables2", "maintenance_mode", - "menu_generator", "reversion", "phonenumber_field", - "debug_toolbar", "django_prometheus", "django_select2", "templated_email", @@ -137,16 +139,18 @@ INSTALLED_APPS = [ "dynamic_preferences.users.apps.UserPreferencesConfig", "impersonate", "two_factor", + "two_factor.plugins.phonenumber", "material", "ckeditor", "ckeditor_uploader", - "django_js_reverse", "colorfield", "django_bleach", "favicon", "django_filters", "oauth2_provider", "rest_framework", + "graphene_django", + "dj_iconify.apps.DjIconifyConfig", ] merge_app_settings("INSTALLED_APPS", INSTALLED_APPS, True) @@ -155,7 +159,6 @@ INSTALLED_APPS += get_app_packages() STATICFILES_FINDERS = [ "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", - "django_yarnpkg.finders.NodeModulesFinder", "sass_processor.finders.CssFinder", ] @@ -165,7 +168,6 @@ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", - "debug_toolbar.middleware.DebugToolbarMiddleware", "django.middleware.locale.LocaleMiddleware", "django.middleware.http.ConditionalGetMiddleware", "django.contrib.sites.middleware.CurrentSiteMiddleware", @@ -224,6 +226,7 @@ DATABASES = { "HOST": _settings.get("database.host", "127.0.0.1"), "PORT": _settings.get("database.port", "5432"), "CONN_MAX_AGE": _settings.get("database.conn_max_age", None), + "CONN_HEALTH_CHECK": True, "OPTIONS": _settings.get("database.options", {}), } } @@ -237,6 +240,12 @@ DATABASE_OOT_LABELS = ["django_celery_results"] merge_app_settings("DATABASES", DATABASES, False) +PASSWORD_HASHERS = [ + "django.contrib.auth.hashers.ScryptPasswordHasher", + "django.contrib.auth.hashers.PBKDF2PasswordHasher", + "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", +] + REDIS_HOST = _settings.get("redis.host", "localhost") REDIS_PORT = _settings.get("redis.port", 6379) REDIS_DB = _settings.get("redis.database", 0) @@ -251,15 +260,10 @@ REDIS_URL = ( if _settings.get("caching.redis.enabled", not IN_PYTEST): CACHES = { "default": { - "BACKEND": "django_redis.cache.RedisCache", + "BACKEND": "django.core.cache.backends.redis.RedisCache", "LOCATION": _settings.get("caching.redis.address", REDIS_URL), - "OPTIONS": { - "CLIENT_CLASS": "django_redis.client.DefaultClient", - }, } } - if REDIS_PASSWORD: - CACHES["default"]["OPTIONS"]["PASSWORD"] = REDIS_PASSWORD else: CACHES = { "default": { @@ -269,7 +273,6 @@ else: } INSTALLED_APPS.append("cachalot") -DEBUG_TOOLBAR_PANELS.append("cachalot.panels.CachalotPanel") CACHALOT_TIMEOUT = _settings.get("caching.cachalot.timeout", None) CACHALOT_DATABASES = set(["default", "default_oot"]) SILENCED_SYSTEM_CHECKS += ["cachalot.W001"] @@ -363,6 +366,9 @@ ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = True # Enforce uniqueness of email addresses ACCOUNT_UNIQUE_EMAIL = _settings.get("auth.login.registration.unique_email", True) +# Configurable username validators +ACCOUNT_USERNAME_VALIDATORS = "aleksis.core.util.auth_helpers.custom_username_validators" + # Configuration for django-invitations # Use custom account adapter @@ -385,6 +391,8 @@ OAUTH2_PROVIDER = { "SCOPES_BACKEND_CLASS": "aleksis.core.util.auth_helpers.AppScopes", "OAUTH2_VALIDATOR_CLASS": "aleksis.core.util.auth_helpers.CustomOAuth2Validator", "OIDC_ENABLED": True, + "REFRESH_TOKEN_EXPIRE_SECONDS": _settings.get("oauth2.token_expiry", 86400), + "PKCE_REQUIRED": False, } OAUTH2_PROVIDER_APPLICATION_MODEL = "core.OAuthApplication" OAUTH2_PROVIDER_GRANT_MODEL = "core.OAuthGrant" @@ -416,6 +424,11 @@ REST_FRAMEWORK = { ] } +# Configuration for GraphQL framework +GRAPHENE = { + "SCHEMA": "aleksis.core.schema.schema", +} + # LDAP config if _settings.get("ldap.uri", None): # LDAP dependencies are not necessarily installed, so import them here @@ -529,11 +542,10 @@ AUTHENTICATION_BACKENDS.append("allauth.account.auth_backends.AuthenticationBack LANGUAGES = [ ("en", _("English")), ("de", _("German")), + ("uk", _("Ukrainian")), ] LANGUAGE_CODE = _settings.get("l10n.lang", "en") TIME_ZONE = _settings.get("l10n.tz", "UTC") -USE_I18N = True -USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) @@ -548,31 +560,67 @@ LOGOUT_REDIRECT_URL = "index" STATIC_ROOT = _settings.get("static.root", os.path.join(BASE_DIR, "static")) MEDIA_ROOT = _settings.get("media.root", os.path.join(BASE_DIR, "media")) -NODE_MODULES_ROOT = _settings.get("node_modules.root", os.path.join(BASE_DIR, "node_modules")) +NODE_MODULES_ROOT = CACHE_DIR YARN_INSTALLED_APPS = [ - "cleave.js", - "@fontsource/roboto", - "jquery", - "@materializecss/materialize", - "material-design-icons-iconfont", - "select2", - "select2-materialize", - "paper-css", - "jquery-sortablejs", - "sortablejs", - "@sentry/tracing", - "luxon", + "cleave.js@^1.6.0", + "@fontsource/roboto@^4.5.5", + "jquery@^3.6.0", + "@materializecss/materialize@~1.0.0", + "material-design-icons-iconfont@^6.6.0", + "select2-materialize@^0.1.8", + "paper-css@^0.4.1", + "jquery-sortablejs@^1.0.1", + "sortablejs@^1.15.0", + "@sentry/tracing@^7.28.0", + "luxon@^2.3.2", + "@iconify/iconify@^2.2.1", + "@iconify/json@^2.1.30", + "@mdi/font@^6.9.96", + "apollo-boost@^0.4.9", + "apollo-link-retry@^2.2.16", + "apollo3-cache-persist@^0.14.1", + "deepmerge@^4.2.2", + "graphql@^15.8.0", + "graphql-tag@^2.12.6", + "sass@^1.32", + "vue@^2.7.7", + "vue-apollo@^3.1.0", + "vuetify@^2.6.7", + "vue-router@^3.5.2", + "vite@^4.0.1", + "vite-plugin-pwa@^0.14.1", + "vite-plugin-top-level-await@^1.2.2", + "@vitejs/plugin-vue2@^2.2.0", + "@rollup/plugin-node-resolve@^15.0.1", + "@rollup/plugin-graphql@^2.0.2", + "@rollup/plugin-virtual@^3.0.1", + "rollup-plugin-license@^3.0.1", + "vue-i18n@^8.0.0", + "browserslist-to-esbuild@^1.2.0", + "@sentry/vue@^7.28.0", + "prettier@^2.8.1", + "eslint@^8.26.0", + "eslint-plugin-vue@^9.7.0", + "eslint-config-prettier@^8.5.0", + "@intlify/eslint-plugin-vue-i18n@^2.0.0", + "stylelint@^14.14.0", + "stylelint-config-standard@^29.0.0", + "stylelint-config-prettier@^9.0.3", ] merge_app_settings("YARN_INSTALLED_APPS", YARN_INSTALLED_APPS, True) JS_URL = _settings.get("js_assets.url", STATIC_URL) -JS_ROOT = _settings.get("js_assets.root", NODE_MODULES_ROOT + "/node_modules") +JS_ROOT = _settings.get("js_assets.root", os.path.join(NODE_MODULES_ROOT, "node_modules")) -SELECT2_CSS = JS_URL + "/select2/dist/css/select2.min.css" -SELECT2_JS = JS_URL + "/select2/dist/js/select2.min.js" -SELECT2_I18N_PATH = JS_URL + "/select2/dist/js/i18n" +DJANGO_VITE_ASSETS_PATH = os.path.join(NODE_MODULES_ROOT, "vite_bundles") +DJANGO_VITE_DEV_MODE = DEBUG + +STATICFILES_DIRS = ( + DJANGO_VITE_ASSETS_PATH, + JS_ROOT, +) ANY_JS = { "materialize": {"js_url": JS_URL + "/@materializecss/materialize/dist/js/materialize.min.js"}, @@ -596,6 +644,7 @@ ANY_JS = { "Sentry": {"js_url": JS_URL + "/@sentry/tracing/build/bundle.tracing.js"}, "cleavejs": {"js_url": JS_URL + "/cleave.js/dist/cleave.min.js"}, "luxon": {"js_url": JS_URL + "/luxon/build/global/luxon.min.js"}, + "iconify": {"js_url": JS_URL + "/@iconify/iconify/dist/iconify.min.js"}, } merge_app_settings("ANY_JS", ANY_JS, True) @@ -615,6 +664,9 @@ SASS_PROCESSOR_INCLUDE_DIRS = [ os.path.join(STATIC_ROOT, "public"), ] +ICONIFY_JSON_ROOT = os.path.join(JS_ROOT, "@iconify", "json") +ICONIFY_COLLECTIONS_ALLOWED = ["mdi"] + ADMINS = _settings.get( "contact.admins", [(AUTH_INITIAL_SUPERUSER["username"], AUTH_INITIAL_SUPERUSER["email"])] ) @@ -672,7 +724,7 @@ if _settings.get("backup.storage.type", "").lower() == "s3": key: value for (key, value) in _settings.get("backup.storage.s3").items() } -IMPERSONATE = {"USE_HTTP_REFERER": True, "REQUIRE_SUPERUSER": True, "ALLOW_SUPERUSER": True} +IMPERSONATE = {"REQUIRE_SUPERUSER": True, "ALLOW_SUPERUSER": True, "REDIRECT_FIELD_NAME": "next"} DJANGO_TABLES2_TEMPLATE = "django_tables2/materialize.html" @@ -705,6 +757,7 @@ CELERY_BROKER_URL = _settings.get("celery.broker", REDIS_URL) CELERY_RESULT_BACKEND = "django-db" CELERY_CACHE_BACKEND = "django-cache" CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" +CELERY_RESULT_EXTENDED = True if _settings.get("celery.email", False): EMAIL_BACKEND = "djcelery_email.backends.CeleryEmailBackend" @@ -714,6 +767,7 @@ if _settings.get("dev.uwsgi.celery", DEBUG): UWSGI.setdefault("attach-daemon", []) UWSGI["attach-daemon"].append(f"celery -A aleksis.core worker --concurrency={concurrency}") UWSGI["attach-daemon"].append("celery -A aleksis.core beat") + UWSGI["attach-daemon"].append("aleksis-admin vite --no-install serve") DEFAULT_FAVICON_PATHS = { "pwa_icon": os.path.join(STATIC_ROOT, "img/aleksis-icon-maskable.png"), @@ -726,8 +780,13 @@ PWA_ICONS_CONFIG = { "microsoft": [144], } FAVICON_PATH = os.path.join("public", "favicon") +FAVICON_CONFIG = { + "shortcut icon": [16, 32, 48, 128, 192], + "touch-icon": [196], + "icon": [196], +} -SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "js", "serviceworker.js") +SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "sw.js") SITE_ID = 1 @@ -857,26 +916,33 @@ BLEACH_STRIP_TAGS = True # Strip comments, or leave them in. BLEACH_STRIP_COMMENTS = True -LOGGING = { - "version": 1, - "disable_existing_loggers": False, - "handlers": { - "console": {"class": "logging.StreamHandler", "formatter": "verbose"}, - "null": {"class": "logging.NullHandler"}, - }, - "formatters": {"verbose": {"format": "%(levelname)s %(asctime)s %(module)s: %(message)s"}}, - "root": { - "handlers": ["console"], - "level": _settings.get("logging.level", "WARNING"), - }, - "loggers": {}, +LOGGING = deepcopy(DEFAULT_LOGGING) +# Set root logging level as default +LOGGING["root"] = { + "handlers": ["console"], + "level": _settings.get("logging.level", "WARNING"), } - +# Add null handler for selective silencing +LOGGING["handlers"]["null"] = {"class": "logging.NullHandler"} +# Make console logging independent of DEBUG +LOGGING["handlers"]["console"]["filters"].remove("require_debug_true") +# Use root log level for console +del LOGGING["handlers"]["console"]["level"] +# Disable exception mails if not desired +if not _settings.get("logging.mail_admins", True): + LOGGING["loggers"]["django"]["handlers"].remove("mail_admins") +# Disable mails on disaalowed host by default if not _settings.get("logging.disallowed_host", False): LOGGING["loggers"]["django.security.DisallowedHost"] = { "handlers": ["null"], "propagate": False, } +# Configure logging explicitly for Celery +LOGGING["loggers"]["celery"] = { + "handlers": ["console"], + "level": _settings.get("logging.level", "WARNING"), + "propagate": False, +} # Rules and permissions @@ -997,5 +1063,9 @@ SHELL_PLUS_DONT_LOAD = [] merge_app_settings("SHELL_PLUS_APP_PREFIXES", SHELL_PLUS_APP_PREFIXES) merge_app_settings("SHELL_PLUS_DONT_LOAD", SHELL_PLUS_DONT_LOAD) +X_FRAME_OPTIONS = "SAMEORIGIN" + # Add django-cleanup after all apps to ensure that it gets all signals as last app INSTALLED_APPS.append("django_cleanup.apps.CleanupConfig") + +locals().update(get_app_settings_overrides()) diff --git a/aleksis/core/static/js/copy_button.js b/aleksis/core/static/js/copy_button.js new file mode 100644 index 0000000000000000000000000000000000000000..c7f53e61bf5fa91a13fd24be0b01832755e955d4 --- /dev/null +++ b/aleksis/core/static/js/copy_button.js @@ -0,0 +1,16 @@ +$(".copy-button").click((e) => { + const target = $(e.currentTarget); + const input = $("#" + target.data("target")); + const copy_icon = target.children(".copy-icon-copy").first(); + const check_icon = target.children(".copy-icon-success").first(); + + console.log("Copying to clipboard"); + navigator.clipboard.writeText(input.val()).then((r) => { + check_icon.show(); + copy_icon.hide(); + setTimeout(() => { + check_icon.hide(); + copy_icon.show(); + }, 1000); + }); +}); diff --git a/aleksis/core/static/js/edit_dashboard.js b/aleksis/core/static/js/edit_dashboard.js index 0cc90de60305497a682d219b121e77550d273d1d..b6e441191c118b4956e3f54cab919d9caa8fde25 100644 --- a/aleksis/core/static/js/edit_dashboard.js +++ b/aleksis/core/static/js/edit_dashboard.js @@ -1,22 +1,22 @@ function refreshOrder() { - $(".order-input").val(0); - $("#widgets > .col").each(function (index) { - const order = (index + 1) * 10; - let pk = $(this).attr("data-pk"); - let sel = $("#order-form input[value=" + pk + "].pk-input").next(); - sel.val(order); - }) + $(".order-input").val(0); + $("#widgets > .col").each(function (index) { + const order = (index + 1) * 10; + let pk = $(this).attr("data-pk"); + let sel = $("#order-form input[value=" + pk + "].pk-input").next(); + sel.val(order); + }); } $(document).ready(function () { - $('#not-used-widgets').sortable({ - group: 'widgets', - animation: 150, - onEnd: refreshOrder - }); - $('#widgets').sortable({ - group: 'widgets', - animation: 150, - onEnd: refreshOrder - }); + $("#not-used-widgets").sortable({ + group: "widgets", + animation: 150, + onEnd: refreshOrder, + }); + $("#widgets").sortable({ + group: "widgets", + animation: 150, + onEnd: refreshOrder, + }); }); diff --git a/aleksis/core/static/js/helper.js b/aleksis/core/static/js/helper.js index 844496346e451a89814ae90194db57fb67a72434..48dab95651703837a071ee39bcc3f9682d071c9b 100644 --- a/aleksis/core/static/js/helper.js +++ b/aleksis/core/static/js/helper.js @@ -1,30 +1,37 @@ function formatDate(date) { - return date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear(); + return ( + date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear() + ); } - function addZeros(i) { - if (i < 10) { - return "0" + i; - } else { - return "" + i; - } + if (i < 10) { + return "0" + i; + } else { + return "" + i; + } } function formatDateForDjango(date) { - return "" + date.getFullYear() + "/" + addZeros(date.getMonth() + 1) + "/" + addZeros(date.getDate()) + "/"; - + return ( + "" + + date.getFullYear() + + "/" + + addZeros(date.getMonth() + 1) + + "/" + + addZeros(date.getDate()) + + "/" + ); } function getNow() { - return new Date(); + return new Date(); } function getNowFormatted() { - return formatDate(getNow()); + return formatDate(getNow()); } function getJSONScript(elementId) { - return JSON.parse(document.getElementById(elementId).textContent); + return JSON.parse(document.getElementById(elementId).textContent); } - diff --git a/aleksis/core/static/js/include_ajax_live.js b/aleksis/core/static/js/include_ajax_live.js index 3a4794bad9881ebe502ea7786b8c0d2a740e65f0..0d23769c1c68114c638a8daf7217b2bc72d8948e 100644 --- a/aleksis/core/static/js/include_ajax_live.js +++ b/aleksis/core/static/js/include_ajax_live.js @@ -14,7 +14,7 @@ const setAsyncInterval = (cb, interval) => { runAsyncInterval(cb, interval, intervalIndex); return intervalIndex; } else { - throw new Error('Callback must be a function'); + throw new Error("Callback must be a function"); } }; @@ -25,11 +25,11 @@ const clearAsyncInterval = (intervalIndex) => { }; let live_load_interval = setAsyncInterval(async () => { - console.log('fetching new data'); + console.log("fetching new data"); const promise = new Promise((resolve) => { - $('#live_load').load(window.location.pathname + " #live_load"); + $("#live_load").load(window.location.pathname + " #live_load"); resolve(1); }); await promise; - console.log('data fetched successfully'); + console.log("data fetched successfully"); }, 15000); diff --git a/aleksis/core/static/js/main.js b/aleksis/core/static/js/main.js index 9b4c133e1ae7db5906645963cfd7182da313ca01..66d3afdeeec947ddb9b63a3c155e3325c42adf05 100644 --- a/aleksis/core/static/js/main.js +++ b/aleksis/core/static/js/main.js @@ -1,193 +1,176 @@ // Define maps between Python's strftime and Luxon's and Materialize's proprietary formats const pythonToMomentJs = { - "%a": "EEE", - "%A": "EEEE", - "%w": "E", - "%d": "dd", - "%b": "MMM", - "%B": "MMMM", - "%m": "MM", - "%y": "yy", - "%Y": "yyyy", - "%H": "HH", - "%I": "hh", - "%p": "a", - "%M": "mm", - "%s": "ss", - "%f": "SSSSSS", - "%z": "ZZZ", - "%Z": "z", - "%U": "WW", - "%j": "ooo", - "%W": "WW", - "%u": "E", - "%G": "kkkk", - "%V": "WW", + "%a": "EEE", + "%A": "EEEE", + "%w": "E", + "%d": "dd", + "%b": "MMM", + "%B": "MMMM", + "%m": "MM", + "%y": "yy", + "%Y": "yyyy", + "%H": "HH", + "%I": "hh", + "%p": "a", + "%M": "mm", + "%s": "ss", + "%f": "SSSSSS", + "%z": "ZZZ", + "%Z": "z", + "%U": "WW", + "%j": "ooo", + "%W": "WW", + "%u": "E", + "%G": "kkkk", + "%V": "WW", }; const pythonToMaterialize = { - "%d": "dd", - "%a": "ddd", - "%A": "dddd", - "%m": "mm", - "%b": "mmm", - "%B": "mmmm", - "%y": "yy", - "%Y": "yyyy", -} + "%d": "dd", + "%a": "ddd", + "%A": "dddd", + "%m": "mm", + "%b": "mmm", + "%B": "mmmm", + "%y": "yy", + "%Y": "yyyy", +}; function buildDateFormat(formatString, map) { - // Convert a Python strftime format string to another format string - for (const key in map) { - formatString = formatString.replace(key, map[key]); - } - return formatString; + // Convert a Python strftime format string to another format string + for (const key in map) { + formatString = formatString.replace(key, map[key]); + } + return formatString; } function initDatePicker(sel) { - // Initialize datepicker [MAT] - - // Get the date format from Django - const dateInputFormat = get_format('DATE_INPUT_FORMATS')[0] - const inputFormat = buildDateFormat(dateInputFormat, pythonToMomentJs); - const outputFormat = buildDateFormat(dateInputFormat, pythonToMaterialize); - - const el = $(sel).datepicker({ - format: outputFormat, - // Pull translations from Django helpers - i18n: { - months: calendarweek_i18n.month_names, - monthsShort: calendarweek_i18n.month_abbrs, - weekdays: calendarweek_i18n.day_names, - weekdaysShort: calendarweek_i18n.day_abbrs, - weekdaysAbbrev: calendarweek_i18n.day_abbrs.map(([v]) => v), - - // Buttons - today: gettext('Today'), - cancel: gettext('Cancel'), - done: gettext('OK'), - }, - - // Set monday as first day of week - firstDay: get_format('FIRST_DAY_OF_WEEK'), - autoClose: true, - yearRange: [new Date().getFullYear() - 100, new Date().getFullYear() + 100], - }); - - // Set initial values of datepickers - $(sel).each(function () { - const currentValue = $(this).val(); - if (currentValue) { - const currentDate = luxon.DateTime.fromFormat(currentValue, inputFormat).toJSDate(); - $(this).datepicker('setDate', currentDate); - } - }); - - return el; + // Initialize datepicker [MAT] + + // Get the date format from Django + const dateInputFormat = get_format("DATE_INPUT_FORMATS")[0]; + const inputFormat = buildDateFormat(dateInputFormat, pythonToMomentJs); + const outputFormat = buildDateFormat(dateInputFormat, pythonToMaterialize); + + const el = $(sel).datepicker({ + format: outputFormat, + // Pull translations from Django helpers + i18n: { + months: calendarweek_i18n.month_names, + monthsShort: calendarweek_i18n.month_abbrs, + weekdays: calendarweek_i18n.day_names, + weekdaysShort: calendarweek_i18n.day_abbrs, + weekdaysAbbrev: calendarweek_i18n.day_abbrs.map(([v]) => v), + + // Buttons + today: gettext("Today"), + cancel: gettext("Cancel"), + done: gettext("OK"), + }, + + // Set monday as first day of week + firstDay: get_format("FIRST_DAY_OF_WEEK"), + autoClose: true, + yearRange: [new Date().getFullYear() - 100, new Date().getFullYear() + 100], + }); + + // Set initial values of datepickers + $(sel).each(function () { + const currentValue = $(this).val(); + if (currentValue) { + const currentDate = luxon.DateTime.fromFormat( + currentValue, + inputFormat + ).toJSDate(); + $(this).datepicker("setDate", currentDate); + } + }); + + return el; } function initTimePicker(sel) { - // Initialize timepicker [MAT] - return $(sel).timepicker({ - twelveHour: false, - autoClose: true, - i18n: { - cancel: 'Abbrechen', - clear: 'Löschen', - done: 'OK' - }, - }); + // Initialize timepicker [MAT] + return $(sel).timepicker({ + twelveHour: false, + autoClose: true, + i18n: { + cancel: "Abbrechen", + clear: "Löschen", + done: "OK", + }, + }); } $(document).ready(function () { - $("dmc-datetime input").addClass("datepicker"); - $("[data-form-control='date']").addClass("datepicker"); - $("[data-form-control='time']").addClass("timepicker"); - - // Initialize sidenav [MAT] - $(".sidenav").sidenav(); - - // Initialize datepicker [MAT] - initDatePicker(".datepicker"); - - // Initialize timepicker [MAT] - initTimePicker(".timepicker"); - - // Initialize tooltip [MAT] - $('.tooltipped').tooltip(); - - // Initialize select [MAT] - $('select').formSelect(); - - // Initialize dropdown [MAT] - $('.dropdown-trigger').dropdown(); - - // If JS is activated, the language form will be auto-submitted - $('.language-field select').change(function () { - $(this).parents(".language-form").submit(); - }); - - // If auto-submit is activated (see above), the language submit must not be visible - $(".language-submit-p").hide(); - - // Initalize print button - $("#print").click(function () { - window.print(); - }); - - // Initialize Collapsible [MAT] - $('.collapsible').collapsible(); - - // Initialize FABs [MAT] - $('.fixed-action-btn').floatingActionButton(); - - // Initialize Modals [MAT] - $('.modal').modal(); - - // Initialize image boxes [Materialize] - $('.materialboxed').materialbox(); - - // Intialize Tabs [Materialize] - $('.tabs').tabs(); - - // Sync color picker - $(".jscolor").change(function () { - $("#" + $(this).data("preview")).css("color", $(this).val()); - }); - - // Initialise auto-completion for search bar - window.autocomplete = new Autocomplete({minimum_length: 2}); - window.autocomplete.setup(); - - // Initialize text collapsibles [MAT, own work] - $(".text-collapsible").addClass("closed").removeClass("opened"); - - $(".text-collapsible .open-icon").click(function (e) { - var el = $(e.target).parent(); - el.addClass("opened").removeClass("closed"); - }); - $(".text-collapsible .close-icon").click(function (e) { - var el = $(e.target).parent(); - el.addClass("closed").removeClass("opened"); - }); - - // Initialize the service worker - if ('serviceWorker' in navigator) { - console.debug("Start registration of service worker."); - navigator.serviceWorker.register('/serviceworker.js', { - scope: '/' - }).then(function() { - console.debug("Service worker has been registered."); - }).catch(function() { - console.debug("Service worker registration has failed.") - }); - } -}); + $("dmc-datetime input").addClass("datepicker"); + $("[data-form-control='date']").addClass("datepicker"); + $("[data-form-control='time']").addClass("timepicker"); -// Show notice if serviceworker broadcasts that the current page comes from its cache -const channel = new BroadcastChannel("cache-or-not"); -channel.addEventListener("message", event => { - if ((event.data) && !($("#cache-alert").length)) { - $("main").prepend('<div id="cache-alert" class="alert warning"><p><i class="material-icons left">warning</i>' + gettext("This page may contain outdated information since there is no internet connection.") + '</p> </div>') - } + // Initialize sidenav [MAT] + $(".sidenav").sidenav(); + + // Initialize datepicker [MAT] + initDatePicker(".datepicker"); + + // Initialize timepicker [MAT] + initTimePicker(".timepicker"); + + // Initialize tooltip [MAT] + $(".tooltipped").tooltip(); + + // Initialize select [MAT] + $("select").formSelect(); + + // Initialize dropdown [MAT] + $(".dropdown-trigger").dropdown(); + $(".navbar-dropdown-trigger").dropdown({ + coverTrigger: false, + constrainWidth: false, + }); + + // If JS is activated, the language form will be auto-submitted + $(".language-field select").change(function () { + $(this).parents(".language-form").submit(); + }); + + // If auto-submit is activated (see above), the language submit must not be visible + $(".language-submit-p").hide(); + + // Initalize print button + $("#print").click(function () { + window.print(); + }); + + // Initialize Collapsible [MAT] + $(".collapsible").collapsible(); + + // Initialize FABs [MAT] + $(".fixed-action-btn").floatingActionButton(); + + // Initialize Modals [MAT] + $(".modal").modal(); + + // Initialize image boxes [Materialize] + $(".materialboxed").materialbox(); + + // Intialize Tabs [Materialize] + $(".tabs").tabs(); + + // Sync color picker + $(".jscolor").change(function () { + $("#" + $(this).data("preview")).css("color", $(this).val()); + }); + + // Initialize text collapsibles [MAT, own work] + $(".text-collapsible").addClass("closed").removeClass("opened"); + + $(".text-collapsible .open-icon").click(function (e) { + var el = $(e.target).parent(); + el.addClass("opened").removeClass("closed"); + }); + $(".text-collapsible .close-icon").click(function (e) { + var el = $(e.target).parent(); + el.addClass("closed").removeClass("opened"); + }); }); diff --git a/aleksis/core/static/js/multi_select.js b/aleksis/core/static/js/multi_select.js index cddf911b5f50be2217075d2c0f34191adab6f72e..105f4c13d6632224a6a88ba2a1d4047255171439 100644 --- a/aleksis/core/static/js/multi_select.js +++ b/aleksis/core/static/js/multi_select.js @@ -1,48 +1,48 @@ $(document).ready(function () { - $(".select--header-box").change(function () { - /* + $(".select--header-box").change(function () { + /* If the top checkbox is checked, all sub checkboxes should be checked, if it gets unchecked, all other ones should get unchecked. */ - if ($(this).is(":checked")) { - $(this).closest("table").find('input[name="selected_objects"]').prop({ - indeterminate: false, - checked: true, - }); - } else { - $(this).closest("table").find('input[name="selected_objects"]').prop({ - indeterminate: false, - checked: false, - }); - } - }); + if ($(this).is(":checked")) { + $(this).closest("table").find('input[name="selected_objects"]').prop({ + indeterminate: false, + checked: true, + }); + } else { + $(this).closest("table").find('input[name="selected_objects"]').prop({ + indeterminate: false, + checked: false, + }); + } + }); - $('input[name="selected_objects"]').change(function () { - /* + $('input[name="selected_objects"]').change(function () { + /* If a table checkbox changes, check the state of the other ones. If all boxes are checked the box in the header should be checked, if all boxes are unchecked the header box should be unchecked. If only some boxes are checked the top one should be inderteminate. */ - let checked = $(this).is(":checked"); - let indeterminate = false; - let table = $(this).closest("table"); - table.find('input[name="selected_objects"]').each(function () { - if ($(this).is(":checked") !== checked) { - /* Set the header box to indeterminate if the boxes are not the same */ - table.find(".select--header-box").prop({ - indeterminate: true, - }) - indeterminate = true; - return false; - } + let checked = $(this).is(":checked"); + let indeterminate = false; + let table = $(this).closest("table"); + table.find('input[name="selected_objects"]').each(function () { + if ($(this).is(":checked") !== checked) { + /* Set the header box to indeterminate if the boxes are not the same */ + table.find(".select--header-box").prop({ + indeterminate: true, }); - if (!(indeterminate)) { - /* All boxes are the same, set the header box to the same value */ - table.find(".select--header-box").prop({ - indeterminate: false, - checked: checked, - }); - } + indeterminate = true; + return false; + } }); + if (!indeterminate) { + /* All boxes are the same, set the header box to the same value */ + table.find(".select--header-box").prop({ + indeterminate: false, + checked: checked, + }); + } + }); }); diff --git a/aleksis/core/static/js/progress.js b/aleksis/core/static/js/progress.js deleted file mode 100644 index 0b2509006029421273159617c9ff2646bb12800b..0000000000000000000000000000000000000000 --- a/aleksis/core/static/js/progress.js +++ /dev/null @@ -1,74 +0,0 @@ -const OPTIONS = getJSONScript("progress_options"); - -const STYLE_CLASSES = { - 10: 'info', - 20: 'info', - 25: 'success', - 30: 'warning', - 40: 'error', -}; - -const ICONS = { - 10: 'info', - 20: 'info', - 25: 'check_circle', - 30: 'warning', - 40: 'error', -}; - -function setProgress(progress) { - $("#progress-bar").css("width", progress + "%"); -} - -function renderMessageBox(level, text) { - return '<div class="alert ' + STYLE_CLASSES[level] + '"><p><i class="material-icons left">' + ICONS[level] + '</i>' + text + '</p></div>'; -} - -function customProgress(progressBarElement, progressBarMessageElement, progress) { - setProgress(progress.percent); - - if (progress.hasOwnProperty("messages")) { - const messagesBox = $("#messages"); - - // Clear container - messagesBox.html("") - - // Render message boxes - $.each(progress.messages, function (i, message) { - messagesBox.append(renderMessageBox(message[0], message[1])); - }) - } -} - - -function customSuccess(progressBarElement, progressBarMessageElement) { - setProgress(100); - $("#result-alert").addClass("success"); - $("#result-icon").text("check_circle"); - $("#result-text").text(OPTIONS.success); - $("#result-box").show(); - $("#result-button").show(); - const redirect = "redirect_on_success" in OPTIONS && OPTIONS.redirect_on_success; - if (redirect) { - window.location.replace(OPTIONS.redirect_on_success); - } -} - -function customError(progressBarElement, progressBarMessageElement) { - setProgress(100); - $("#result-alert").addClass("error"); - $("#result-icon").text("error"); - $("#result-text").text(OPTIONS.error); - $("#result-box").show(); -} - -$(document).ready(function () { - $("#progress-bar").removeClass("indeterminate").addClass("determinate"); - - var progressUrl = Urls["taskStatus"](OPTIONS.task_id); - CeleryProgressBar.initProgressBar(progressUrl, { - onProgress: customProgress, - onSuccess: customSuccess, - onError: customError, - }); -}); diff --git a/aleksis/core/static/js/search.js b/aleksis/core/static/js/search.js index fd121dbdfafe20c1c60ef2c793cd1f13b2a7573e..c24c79d747227ac71aa75901e8891da30956e7af 100644 --- a/aleksis/core/static/js/search.js +++ b/aleksis/core/static/js/search.js @@ -6,129 +6,129 @@ */ var Autocomplete = function (options) { - this.form_selector = options.form_selector || '.autocomplete'; - this.url = options.url || Urls.searchbarSnippets(); - this.delay = parseInt(options.delay || 300); - this.minimum_length = parseInt(options.minimum_length || 3); - this.form_elem = null; - this.query_box = null; - this.selected_element = null; + this.form_selector = options.form_selector || ".autocomplete"; + this.url = options.url; + this.delay = parseInt(options.delay || 300); + this.minimum_length = parseInt(options.minimum_length || 3); + this.form_elem = null; + this.query_box = null; + this.selected_element = null; }; Autocomplete.prototype.setup = function () { - var self = this; - - this.form_elem = $(this.form_selector); - this.query_box = this.form_elem.find('input[name=q]'); - - - $("#search-form").focusout(function (e) { - if (!$(e.relatedTarget).hasClass("search-item")) { - e.preventDefault(); - $("#search-results").remove(); - } - }); - - // Trigger the "keyup" event if input gets focused - - this.query_box.focus(function () { - self.query_box.trigger("input"); - }); - - this.query_box.on("input", () => { - console.log("Input changed, fetching again...") - var query = self.query_box.val(); - - if (query.length < self.minimum_length) { - $("#search-results").remove(); - return true; - } - - self.fetch(query); - return true; - }); - - // Watch the input box. - this.query_box.keydown(function (e) { - - if (e.which === 38) { // Keypress Up - if (!self.selected_element) { - self.setSelectedResult($("#search-collection").children().last()); - return false; - } - - let prev = self.selected_element.prev(); - if (prev.length > 0) { - self.setSelectedResult(prev); - } - return false; - } - - if (e.which === 40) { // Keypress Down - if (!self.selected_element) { - self.setSelectedResult($("#search-collection").children().first()); - return false; - } - - let next = self.selected_element.next(); - if (next.length > 0) { - self.setSelectedResult(next); - } - return false; - } - - if (self.selected_element && e.which === 13) { - e.preventDefault(); - window.location.href = self.selected_element.attr("href"); - } - }); - - // // On selecting a result, remove result box - // this.form_elem.on('click', '#search-results', function (ev) { - // $('#search-results').remove(); - // return true; - // }); - - // Disable browser's own autocomplete - // We do this here so users without JavaScript can keep it enabled - this.query_box.attr('autocomplete', 'off'); + var self = this; + + this.form_elem = $(this.form_selector); + this.query_box = this.form_elem.find("input[name=q]"); + + $("#search-form").focusout(function (e) { + if (!$(e.relatedTarget).hasClass("search-item")) { + e.preventDefault(); + $("#search-results").remove(); + } + }); + + // Trigger the "keyup" event if input gets focused + + this.query_box.focus(function () { + self.query_box.trigger("input"); + }); + + this.query_box.on("input", () => { + console.log("Input changed, fetching again..."); + var query = self.query_box.val(); + + if (query.length < self.minimum_length) { + $("#search-results").remove(); + return true; + } + + self.fetch(query); + return true; + }); + + // Watch the input box. + this.query_box.keydown(function (e) { + if (e.which === 38) { + // Keypress Up + if (!self.selected_element) { + self.setSelectedResult($("#search-collection").children().last()); + return false; + } + + let prev = self.selected_element.prev(); + if (prev.length > 0) { + self.setSelectedResult(prev); + } + return false; + } + + if (e.which === 40) { + // Keypress Down + if (!self.selected_element) { + self.setSelectedResult($("#search-collection").children().first()); + return false; + } + + let next = self.selected_element.next(); + if (next.length > 0) { + self.setSelectedResult(next); + } + return false; + } + + if (self.selected_element && e.which === 13) { + e.preventDefault(); + window.location.href = self.selected_element.attr("href"); + } + }); + + // // On selecting a result, remove result box + // this.form_elem.on('click', '#search-results', function (ev) { + // $('#search-results').remove(); + // return true; + // }); + + // Disable browser's own autocomplete + // We do this here so users without JavaScript can keep it enabled + this.query_box.attr("autocomplete", "off"); }; Autocomplete.prototype.fetch = function (query) { - var self = this; - - $.ajax({ - url: this.url, - data: { - 'q': query - }, - beforeSend: (request, settings) => { - $('#search-results').remove(); - self.setLoader(true); - }, - success: function (data) { - self.setLoader(false); - self.show_results(data); - } - }) + var self = this; + + $.ajax({ + url: this.url, + data: { + q: query, + }, + beforeSend: (request, settings) => { + $("#search-results").remove(); + self.setLoader(true); + }, + success: function (data) { + self.setLoader(false); + self.show_results(data); + }, + }); }; Autocomplete.prototype.show_results = function (data) { - $('#search-results').remove(); - var results_wrapper = $('<div id="search-results">' + data + '</div>'); - this.query_box.after(results_wrapper); - this.selected_element = null; + $("#search-results").remove(); + var results_wrapper = $('<div id="search-results">' + data + "</div>"); + this.query_box.after(results_wrapper); + this.selected_element = null; }; Autocomplete.prototype.setSelectedResult = function (element) { - if (this.selected_element) { - this.selected_element.removeClass("active"); - } - element.addClass("active"); - this.selected_element = element; - console.log("New element: ", element); + if (this.selected_element) { + this.selected_element.removeClass("active"); + } + element.addClass("active"); + this.selected_element = element; + console.log("New element: ", element); }; Autocomplete.prototype.setLoader = function (value) { - $("#search-loader").css("display", (value === true ? "block" : "none")) -} + $("#search-loader").css("display", value === true ? "block" : "none"); +}; diff --git a/aleksis/core/static/js/serviceworker.js b/aleksis/core/static/js/serviceworker.js index 16382ec00c5dadb22c63060a227451377202d363..fcc181a471037d7ba9e23a2eac08c9a89d66ee4f 100644 --- a/aleksis/core/static/js/serviceworker.js +++ b/aleksis/core/static/js/serviceworker.js @@ -1,83 +1,85 @@ - // This is the AlekSIS service worker -const CACHE = 'aleksis-cache'; - -const offlineFallbackPage = 'offline/'; +const CACHE = "aleksis-cache"; -const channel = new BroadcastChannel('cache-or-not'); +const cacheChannel = new BroadcastChannel("cache-or-not"); +const offlineFallbackChannel = new BroadcastChannel("offline-fallback"); -var comesFromCache = false; +let comesFromCache = false; +let offlineFallback = false; self.addEventListener("install", function (event) { - console.log("[AlekSIS PWA] Install Event processing."); - - console.log("[AlekSIS PWA] Skipping waiting on install."); - self.skipWaiting(); + console.log("[AlekSIS PWA] Install Event processing."); - event.waitUntil( - caches.open(CACHE).then(function (cache) { - console.log("[AlekSIS PWA] Caching pages during install."); - return cache.add(offlineFallbackPage); - }) - ); + console.log("[AlekSIS PWA] Skipping waiting on install."); + self.skipWaiting(); }); // Allow sw to control of current page self.addEventListener("activate", function (event) { - console.log("[AlekSIS PWA] Claiming clients for current page."); - event.waitUntil(self.clients.claim()); + console.log("[AlekSIS PWA] Claiming clients for current page."); + event.waitUntil(self.clients.claim()); }); // If any fetch fails, it will look for the request in the cache and serve it from there first self.addEventListener("fetch", function (event) { - if (event.request.method !== "GET") return; - networkFirstFetch(event); - if (comesFromCache) channel.postMessage(true); + if (event.request.method !== "GET") return; + networkFirstFetch(event); + if (offlineFallback) offlineFallbackChannel.postMessage(true); + if (comesFromCache) cacheChannel.postMessage(true); }); function networkFirstFetch(event) { - event.respondWith( - fetch(event.request) - .then(function (response) { - // If request was successful, add or update it in the cache - console.log("[AlekSIS PWA] Network request successful."); - event.waitUntil(updateCache(event.request, response.clone())); - comesFromCache = false; - return response; - }) - .catch(function (error) { - console.log("[AlekSIS PWA] Network request failed. Serving content from cache: " + error); - return fromCache(event); - }) - ); + event.respondWith( + fetch(event.request) + .then(function (response) { + // If request was successful, add or update it in the cache + console.log("[AlekSIS PWA] Network request successful."); + event.waitUntil(updateCache(event.request, response.clone())); + offlineFallback = false; + comesFromCache = false; + return response; + }) + .catch(function (error) { + console.log( + "[AlekSIS PWA] Network request failed. Serving content from cache: " + + error + ); + return fromCache(event); + }) + ); } function fromCache(event) { - // Check to see if you have it in the cache - // Return response - // If not in the cache, then return offline fallback page - return caches.open(CACHE).then(function (cache) { - return cache.match(event.request) - .then(function (matching) { - if (!matching || matching.status === 404) { - console.log("[AlekSIS PWA] Cache request failed. Serving offline fallback page."); - comesFromCache = false; - // Use the precached offline page as fallback - return caches.match(offlineFallbackPage); - } - comesFromCache = true; - return matching; - }); + // Check to see if you have it in the cache + // Return response + // If not in the cache, then return offline fallback page + return caches.open(CACHE).then(function (cache) { + return cache.match(event.request).then(function (matching) { + if (!matching || matching.status === 404) { + console.log( + "[AlekSIS PWA] Cache request failed. Serving offline fallback page." + ); + comesFromCache = false; + offlineFallback = true; + return; + } + offlineFallback = false; + comesFromCache = true; + return matching; }); + }); } function updateCache(request, response) { - if (response.headers.get('cache-control') && response.headers.get('cache-control').includes('no-cache')) { - return Promise.resolve(); - } else { - return caches.open(CACHE).then(function (cache) { - return cache.put(request, response); - }); - } + if ( + response.headers.get("cache-control") && + response.headers.get("cache-control").includes("no-cache") + ) { + return Promise.resolve(); + } else { + return caches.open(CACHE).then(function (cache) { + return cache.put(request, response); + }); + } } diff --git a/aleksis/core/static/print-simple.css b/aleksis/core/static/print-simple.css new file mode 100644 index 0000000000000000000000000000000000000000..dfde8908dbe44e0bfa21039364455ed4b9154906 --- /dev/null +++ b/aleksis/core/static/print-simple.css @@ -0,0 +1,25 @@ +@page { + padding: 0; + margin: 0; +} + +table.small-print, +td.small-print, +th.small-print { + font-size: 10pt; +} + +tr { + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} + +td, +th { + padding: 1px; +} + +td.rotate, +th.rotate { + text-align: center; + transform: rotate(-90deg); +} diff --git a/aleksis/core/static/print.css b/aleksis/core/static/print.css index cda82eacab1d51a39f7f455170eb6ff12121dc30..1c3e9d486a27e913671a453219c60b70b8778462 100644 --- a/aleksis/core/static/print.css +++ b/aleksis/core/static/print.css @@ -1,132 +1,139 @@ .sheet.infinite { - height: auto !important; + height: auto !important; } @page { - size: A4; - padding: 30mm; - margin: 0; + size: A4; + padding: 30mm; + margin: 0; } header { - display: block; - width: 190mm; + display: block; + width: 190mm; } - #print-header { - display: block !important; - border-bottom: 1px solid; - margin-bottom: 0; - height: 22mm; - background: white; + display: block !important; + border-bottom: 1px solid; + margin-bottom: 0; + height: 22mm; + background: white; } -header, main, footer { - margin: 0; +header, +main, +footer { + margin: 0; } #print-header .col.right-align { - padding: 15px; + padding: 15px; } .sheet { - padding: 10mm; + padding: 10mm; } - -.header-space, .footer-space { - height: 0; +.header-space, +.footer-space { + height: 0; } -.print-layout-table, .print-layout-td { - width: 190mm; - max-width: 190mm; - min-width: 190mm; +.print-layout-table, +.print-layout-td { + width: 190mm; + max-width: 190mm; + min-width: 190mm; } .print-layout-td { - padding: 0; + padding: 0; } .print-layout-table .no-border { - border: 0; + border: 0; } - footer { - margin-top: 5mm; - text-align: center; - width: 190mm; - + margin-top: 5mm; + text-align: center; + width: 190mm; } -header .row, header .col { - padding: 0 !important; - margin: 0 !important; +header .row, +header .col { + padding: 0 !important; + margin: 0 !important; } #print-logo { - padding: 2mm; - height: 22mm; - width: auto; + height: 22mm; + width: auto; + margin-block: 0; + padding: 2mm 2mm 2mm 0; } .page-break { - display: block; - text-align: center; - margin: auto; - margin-top: 20px; - margin-bottom: 20px; - width: 200px; - border-top: 1px dashed; - color: darkgrey; - page-break-after: always; + display: block; + text-align: center; + margin: auto; + margin-top: 20px; + margin-bottom: 20px; + width: 200px; + border-top: 1px dashed; + color: darkgrey; + page-break-after: always; } @media print { - .header-space { - height: 35mm; - } + .header-space { + height: 35mm; + } - .footer-space { - height: 20mm - } + .footer-space { + height: 20mm; + } - header, footer { - height: 22mm; - } + header, + footer { + height: 22mm; + } - header { - position: fixed; - top: 10mm; - } + header { + position: fixed; + top: 10mm; + } - footer { - position: fixed; - bottom: 0; - } + footer { + position: fixed; + bottom: 0; + } - .page-break { - border: white; - } + .page-break { + border: white; + } } /* Some stuff for tables */ -table.small-print, td.small-print, th.small-print { - font-size: 10pt; +table.small-print, +td.small-print, +th.small-print { + font-size: 10pt; } tr { - border-bottom: 1px solid rgba(0, 0, 0, 0.3); + border-bottom: 1px solid rgba(0, 0, 0, 0.3); } -td, th { - padding: 1px; +td, +th { + padding: 1px; } -td.rotate, th.rotate { - text-align: center; - transform: rotate(-90deg); +td.rotate, +th.rotate { + text-align: center; + transform: rotate(-90deg); } diff --git a/aleksis/core/static/print_landscape.css b/aleksis/core/static/print_landscape.css index a348ddff6268f56a1f4fa82eac240d6c9823e14c..746968664ee7ac8e04643e97e6964cfc57796eca 100644 --- a/aleksis/core/static/print_landscape.css +++ b/aleksis/core/static/print_landscape.css @@ -1,19 +1,18 @@ @page { - size: A4 landscape; + size: A4 landscape; } header { - width: 277mm; + width: 277mm; } - -.print-layout-table, .print-layout-td { - width: 277mm; - max-width: 277mm; - min-width: 277mm; +.print-layout-table, +.print-layout-td { + width: 277mm; + max-width: 277mm; + min-width: 277mm; } - footer { - width: 277mm; + width: 277mm; } diff --git a/aleksis/core/static/public/style.scss b/aleksis/core/static/public/style.scss index e448c8aa54e55d4667c8dde9826c37e70fed6db0..bcf734cfb2617b99d94d9f09d95d79ec799cefcd 100644 --- a/aleksis/core/static/public/style.scss +++ b/aleksis/core/static/public/style.scss @@ -4,7 +4,8 @@ background-color: $primary-color !important; } -.primary-color-text, .primary-color-text a { +.primary-color-text, +.primary-color-text a { color: $primary-color !important; } @@ -12,7 +13,8 @@ background-color: $secondary-color !important; } -.secondary-color-text, .secondary-color-text a { +.secondary-color-text, +.secondary-color-text a { color: $secondary-color !important; } @@ -24,8 +26,12 @@ rect#background { background-color: lighten($primary-color, 5%); } +.waves-effect.waves-secondary .waves-ripple { + background-color: lighten($secondary-color, 5%); +} + .success { - @extend .light-green, .lighten-3 + @extend .light-green, .lighten-3; } .success-text { @@ -60,16 +66,22 @@ body { flex-direction: column; } -header, main, footer { +header, +main, +footer { margin-left: 300px; } -.without-menu header, .without-menu main, .without-menu footer { +.without-menu header, +.without-menu main, +.without-menu footer { margin-left: 0; } @media only screen and (max-width: 992px) { - header, main, footer { + header, + main, + footer { margin-left: 0; } } @@ -77,6 +89,12 @@ header, main, footer { .materialize-circle { @extend .circle; } +.collection + .collection-item.avatar + > .materialize-circle + > .materialize-circle { + left: 0; +} /**********/ /* HEADER */ @@ -91,7 +109,6 @@ header, main, footer { width: auto; } - /********/ /* MAIN */ /********/ @@ -108,17 +125,15 @@ main { /* SIDENAV */ /***********/ -ul.sidenav.sidenav-fixed li.logo { - margin-top: 32px; - margin-bottom: 50px; -} - ul.sidenav.sidenav-fixed .brand-logo { margin: 0; + height: 100%; } .logo img { - width: 250px; + width: 268px; + margin-block: 1em; + vertical-align: middle; } .sidenav a:not(.collapsible-header) { @@ -129,11 +144,18 @@ ul.sidenav li.logo > a:hover { background: none !important; } -.sidenav .collapsible-body > ul:not(.collapsible) > li.active a > i, .sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active a > i { +.sidenav .collapsible-body > ul:not(.collapsible) > li.active a > i, +.sidenav.sidenav-fixed + .collapsible-body + > ul:not(.collapsible) + > li.active + a + > i { color: #fff; } -.sidenav .collapsible-body > ul:not(.collapsible) > li.active, .sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { +.sidenav .collapsible-body > ul:not(.collapsible) > li.active, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { background-color: lighten($primary-color, 5%); } @@ -156,8 +178,8 @@ ul.sidenav li.logo > a:hover { border-top: 1px solid rgba(0, 0, 0, 0.14); border-bottom: 1px solid rgba(0, 0, 0, 0.14); - -webkit-transition: margin .25s ease; - transition: margin .25s ease; + -webkit-transition: margin 0.25s ease; + transition: margin 0.25s ease; } .sidenav li.search .search-wrapper input#search { @@ -210,26 +232,6 @@ div#search-results { right: 10px; } - -// Sidenav trigger - -header a.sidenav-trigger { - position: absolute; - left: 7.5%; - top: 0; - - height: 64px; - font-size: 38px; - - float: none; - - text-align: center; - color: white; - - z-index: 2; -} - - // Footer .footer-icon { @@ -237,7 +239,6 @@ header a.sidenav-trigger { vertical-align: middle; } - @media only screen and (min-width: 1384px) { .footer-row-large { display: flex; @@ -294,10 +295,17 @@ h1 { h2 { font-weight: 300; - font-size: 3.0rem; + font-size: 3rem; } -p, h1, h2, h3, h4, h5, h6, .card-title { +p, +h1, +h2, +h3, +h4, +h5, +h6, +.card-title { overflow-wrap: break-word; hyphens: auto; } @@ -308,7 +316,6 @@ ul.collection .collection-item .title { font-weight: bold; } - // Forms form .row { @@ -331,7 +338,7 @@ label.chips-checkbox { height: 32px; font-size: 13px; font-weight: 500; - color: rgba(0, 0, 0, .6); + color: rgba(0, 0, 0, 0.6); line-height: 32px; padding: 0 12px; border-radius: 16px; @@ -417,24 +424,29 @@ span.badge .material-icons { font-size: 2rem; } -.btn.primary, .btn-large.primary, .btn-small.primary { +.btn.primary, +.btn-large.primary, +.btn-small.primary { background-color: rgba(0, 0, 0, 0.05) !important; color: black !important; } -.btn.primary:hover, .btn-large.primary:hover, .btn-small.primary { +.btn.primary:hover, +.btn-large.primary:hover, +.btn-small.primary { background-color: $primary-color !important; color: whitesmoke !important; } - /* Table*/ .table-container { overflow-x: auto; } -table.striped > tbody > tr:nth-child(odd), table tr.striped, table tbody.striped tr { +table.striped > tbody > tr:nth-child(odd), +table tr.striped, +table tbody.striped tr { background-color: rgba(208, 208, 208, 0.5); } @@ -445,41 +457,18 @@ th.orderable > a { height: inherit; } -th.orderable > a::after { - @extend .material-icons; - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - -moz-osx-font-smoothing: grayscale; - font-feature-settings: 'liga'; - float: right; - content: "unfold_more"; +th.orderable { + background: no-repeat right center; + background-image: url("../../__icons__/mdi/unfold-more-horizontal.svg"); + background-size: 24px; } -th.orderable.asc > a { - color: inherit; - - &::after { - content: "expand_less"; - } +th.orderable.asc { + background-image: url("../../__icons__/mdi/chevron-up.svg"); } -th.orderable.desc > a { - color: inherit; - - &::after { - content: "expand_more"; - } +th.orderable.desc { + background-image: url("../../__icons__/mdi/chevron-down.svg"); } /*+++++++*/ @@ -498,7 +487,9 @@ th.orderable.desc > a { font-size: 15px; } - header, main, footer { + header, + main, + footer { margin-left: 0; } @@ -525,11 +516,14 @@ th.orderable.desc > a { padding: 15px; } - main, header { + main, + header { padding: 0; } - footer, footer .footer-copyright, footer .container { + footer, + footer .footer-copyright, + footer .container { background-color: white !important; color: black !important; } @@ -538,7 +532,8 @@ th.orderable.desc > a { display: none; } - .footer-copyright, .footer-copyright .container { + .footer-copyright, + .footer-copyright .container { padding: 0 !important; margin: 0 !important; } @@ -550,7 +545,8 @@ th.orderable.desc > a { // Alerts -.alert ul, .alert p { +.alert ul, +.alert p { margin: 0; } @@ -674,7 +670,6 @@ main figure.alert { margin-bottom: 5px; } - /* Dashboard */ .card-action-badge { @@ -756,7 +751,6 @@ main figure.alert { } } - .dashboard-cards .card { display: inline-block; overflow: visible; @@ -792,14 +786,15 @@ main figure.alert { } /* Tabs with icons */ -.tabs-icons, .tabs-icons .tab, .tabs-icons a { +.tabs-icons, +.tabs-icons .tab, +.tabs-icons a { height: 72px; } .tabs-icons .tab { display: inline-flex; flex-direction: column; - } .tabs-icons .tab a { @@ -815,10 +810,11 @@ main figure.alert { line-height: 1; height: 24px; margin-bottom: 8px; + width: 100%; } /* Person overview */ -$person-logo-size: 20vh; +$person-logo-size: 15em; .clip-circle:not(.active) { width: $person-logo-size; @@ -828,13 +824,14 @@ $person-logo-size: 20vh; & img { border-radius: 50%; - width: 20vh; - height: 20vh; + width: 100%; + height: 100%; object-fit: cover; } } -.clip-circle.no-image, .clip-circle.no-image > i.material-icons { +.clip-circle.no-image, +.clip-circle.no-image > i.material-icons { font-size: calc(#{$person-logo-size} * 0.5); color: #6f6f6f; background: #f2f2f2; @@ -844,20 +841,79 @@ $person-logo-size: 20vh; user-select: none; cursor: default; border-radius: 50%; + height: unset; +} + +.nav-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1rem; + > a { + position: static !important; + transform: none !important; + } + & .nav-spacer { + width: 60px; + } + & ul.account-nav { + display: flex; + margin-inline: 7.5px; + & > li > a { + padding: 0 7.5px; + } + } +} + +.nav-wrapper .navbar-dropdown-trigger { + cursor: pointer; + height: 100%; + display: grid; +} + +.navbar-dropdown-trigger .clip-circle { + margin: auto; + width: $navbar-height * 0.75; + height: $navbar-height * 0.75; + cursor: pointer; + + &.no-image, + &.no-image > i.material-icons { + font-size: calc(#{$navbar-height} * 0.75 * 0.5); + color: #6f6f6f; + background: #f2f2f2; + line-height: $navbar-height * 0.75; + width: $navbar-height * 0.75; + cursor: pointer; + } +} + +a.new-notification { + position: relative; + &:after { + content: ""; + position: absolute; + width: 10px; + height: 10px; + bottom: 30%; + right: 19%; + background-color: $secondary-color; + border-radius: 50%; + } } #hero-bg { position: absolute; width: calc(100% + #{$main-padding-lr}); - height: 30vh; + height: 18em; left: -$main-padding-lr; top: 0; overflow: hidden; background-color: lighten($primary-color, 30%); z-index: -1; box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14) inset, - 0 1px 10px 0 rgba(0, 0, 0, 0.12) inset, - 0 2px 4px -1px rgba(0, 0, 0, 0.3) inset; + 0 1px 10px 0 rgba(0, 0, 0, 0.12) inset, + 0 2px 4px -1px rgba(0, 0, 0, 0.3) inset; } .person-buttons { @@ -889,7 +945,7 @@ $person-logo-size: 20vh; } .person-container { - margin: calc(30vh - #{$main-padding-tb} - #{$navbar-height} - 10vh) 0 0 0; + margin: calc(18em - #{$main-padding-tb} - 7.5em) 0 0 0; display: flex; align-items: center; flex-wrap: wrap; @@ -932,8 +988,46 @@ $person-logo-size: 20vh; height: 20vh; } - .application-circle img { @extend .application-circle; object-fit: cover; } + +svg.iconify { + @extend i; +} + +.btn .iconify.material-icons, +.btn-flat .iconify.material-icons { + height: $button-height; +} + +// Login Page +.login-card-action { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + row-gap: 0.7rem; + & *:last-child { + grid-column: -2; + text-align: center; + } +} + +.btn-small-line-height { + line-height: $button-small-height; +} + +.btn-smaller-padding { + padding: 0 8px; +} + +p.ical-description { + margin: 0; + font-weight: 300; +} + +.table-circle, +.table-circle .materialize-circle { + height: 4em; + width: 4em; +} diff --git a/aleksis/core/static/public/theme.scss b/aleksis/core/static/public/theme.scss index 1b38e9bda22c7b63601a4a227d58981e2e3a8d45..3850e4c17da80967b7729bd5feebf937ee3cee5e 100644 --- a/aleksis/core/static/public/theme.scss +++ b/aleksis/core/static/public/theme.scss @@ -29,28 +29,30 @@ // 23. Collections // 24. Progress Bar - - // 1. Colors // ========================================================================== -$primary-color: adjust-color(get-colour(get-preference(theme, primary)), $alpha: 1); +$primary-color: adjust-color( + get-colour(get-preference(theme, primary)), + $alpha: 1 +); $primary-color-light: lighten($primary-color, 15%) !default; $primary-color-dark: darken($primary-color, 15%) !default; -$secondary-color: adjust-color(get-colour(get-preference(theme, secondary)), $alpha: 1); +$secondary-color: adjust-color( + get-colour(get-preference(theme, secondary)), + $alpha: 1 +); $success-color: color("green", "base") !default; $error-color: color("red", "base") !default; $link-color: color("light-blue", "darken-1") !default; - // 2. Badges // ========================================================================== $badge-bg-color: $secondary-color !default; $badge-height: 22px !default; - // 3. Buttons // ========================================================================== @@ -64,12 +66,15 @@ $button-padding: 0 16px !default; $button-radius: 2px !default; // Disabled styles -$button-disabled-background: #DFDFDF !default; -$button-disabled-color: #9F9F9F !default; +$button-disabled-background: #dfdfdf !default; +$button-disabled-color: #9f9f9f !default; // Raised buttons $button-raised-background: $secondary-color !default; -$button-raised-background-hover: lighten($button-raised-background, 5%) !default; +$button-raised-background-hover: lighten( + $button-raised-background, + 5% +) !default; $button-raised-color: #fff !default; // Large buttons @@ -81,8 +86,8 @@ $button-floating-large-size: 56px !default; // Small buttons $button-small-font-size: 13px !default; $button-small-icon-font-size: 1.2rem !default; -$button-small-height: $button-height * .9 !default; -$button-floating-small-size: $button-height * .9 !default; +$button-small-height: $button-height * 0.9 !default; +$button-floating-small-size: $button-height * 0.9 !default; // Flat buttons $button-flat-color: #343434 !default; @@ -95,7 +100,6 @@ $button-floating-color: #fff !default; $button-floating-size: 40px !default; $button-floating-radius: 50% !default; - // 4. Cards // ========================================================================== @@ -104,7 +108,6 @@ $card-bg-color: #fff !default; $card-link-color: $primary-color !default; $card-link-color-light: lighten($card-link-color, 20%) !default; - // 5. Carousel // ========================================================================== @@ -112,7 +115,6 @@ $carousel-height: 400px !default; $carousel-item-height: $carousel-height / 2 !default; $carousel-item-width: $carousel-item-height !default; - // 6. Collapsible // ========================================================================== @@ -121,7 +123,6 @@ $collapsible-line-height: $collapsible-height !default; $collapsible-header-color: #fff !default; $collapsible-border-color: #ddd !default; - // 7. Chips // ========================================================================== @@ -130,26 +131,30 @@ $chip-border-color: #9e9e9e !default; $chip-selected-color: $primary-color !default; $chip-margin: 5px !default; - // 8. Date + Time Picker // ========================================================================== $datepicker-display-font-size: 2.8rem; $datepicker-calendar-header-color: #999; -$datepicker-weekday-color: rgba(0, 0, 0, .87) !default; +$datepicker-weekday-color: rgba(0, 0, 0, 0.87) !default; $datepicker-weekday-bg: darken($secondary-color, 7%) !default; $datepicker-date-bg: $secondary-color !default; -$datepicker-year: rgba(255, 255, 255, .7) !default; -$datepicker-focus: rgba(0,0,0, .05) !default; +$datepicker-year: rgba(255, 255, 255, 0.7) !default; +$datepicker-focus: rgba(0, 0, 0, 0.05) !default; $datepicker-selected: $secondary-color !default; -$datepicker-selected-outfocus: desaturate(lighten($secondary-color, 35%), 15%) !default; -$datepicker-day-focus: transparentize(desaturate($secondary-color, 5%), .75) !default; -$datepicker-disabled-day-color: rgba(0, 0, 0, .3) !default; - -$timepicker-clock-color: rgba(0, 0, 0, .87) !default; +$datepicker-selected-outfocus: desaturate( + lighten($secondary-color, 35%), + 15% +) !default; +$datepicker-day-focus: transparentize( + desaturate($secondary-color, 5%), + 0.75 +) !default; +$datepicker-disabled-day-color: rgba(0, 0, 0, 0.3) !default; + +$timepicker-clock-color: rgba(0, 0, 0, 0.87) !default; $timepicker-clock-plate-bg: #eee !default; - // 9. Dropdown // ========================================================================== @@ -158,7 +163,6 @@ $dropdown-hover-bg-color: #eee !default; $dropdown-color: $secondary-color !default; $dropdown-item-height: 50px !default; - // 10. Forms // ========================================================================== @@ -174,8 +178,8 @@ $input-font-size: 16px !default; $input-margin-bottom: 8px; $input-margin: 0 0 $input-margin-bottom 0 !default; $input-padding: 0 !default; -$label-font-size: .8rem !default; -$input-disabled-color: rgba(0,0,0, .42) !default; +$label-font-size: 0.8rem !default; +$input-disabled-color: rgba(0, 0, 0, 0.42) !default; $input-disabled-solid-color: #949494 !default; $input-disabled-border: 1px dotted $input-disabled-color !default; $input-invalid-border: 1px solid $input-error-color !default; @@ -194,23 +198,25 @@ $track-height: 3px !default; // Select $select-border: 1px solid #f2f2f2 !default; -$select-background: rgba(255, 255, 255, 0.90) !default; +$select-background: rgba(255, 255, 255, 0.9) !default; $select-focus: 1px solid lighten($secondary-color, 47%) !default; -$select-option-hover: rgba(0,0,0,.08) !default; -$select-option-focus: rgba(0,0,0,.08) !default; -$select-option-selected: rgba(0,0,0,.03) !default; +$select-option-hover: rgba(0, 0, 0, 0.08) !default; +$select-option-focus: rgba(0, 0, 0, 0.08) !default; +$select-option-selected: rgba(0, 0, 0, 0.03) !default; $select-padding: 5px !default; $select-radius: 2px !default; -$select-disabled-color: rgba(0,0,0,.3) !default; +$select-disabled-color: rgba(0, 0, 0, 0.3) !default; // Switches $switch-bg-color: $secondary-color !default; -$switch-checked-lever-bg: desaturate(lighten($switch-bg-color, 25%), 25%) !default; -$switch-unchecked-bg: #F1F1F1 !default; -$switch-unchecked-lever-bg: rgba(0,0,0,.38) !default; +$switch-checked-lever-bg: desaturate( + lighten($switch-bg-color, 25%), + 25% +) !default; +$switch-unchecked-bg: #f1f1f1 !default; +$switch-unchecked-lever-bg: rgba(0, 0, 0, 0.38) !default; $switch-radius: 15px !default; - // 11. Global // ========================================================================== @@ -229,15 +235,13 @@ $small-and-down: "only screen and (max-width : #{$small-screen})" !default; $medium-and-down: "only screen and (max-width : #{$medium-screen})" !default; $medium-only: "only screen and (min-width : #{$small-screen-up}) and (max-width : #{$medium-screen})" !default; - // 12. Grid // ========================================================================== $num-cols: 12 !default; $gutter-width: 1.5rem !default; $element-top-margin: $gutter-width/3 !default; -$element-bottom-margin: ($gutter-width*2)/3 !default; - +$element-bottom-margin: ($gutter-width * 2)/3 !default; // 13. Navigation Bar // ========================================================================== @@ -255,27 +259,24 @@ $navbar-brand-font-size: 2.1rem !default; $sidenav-width: 300px !default; $sidenav-font-size: 14px !default; -$sidenav-font-color: rgba(0,0,0,.87) !default; +$sidenav-font-color: rgba(0, 0, 0, 0.87) !default; $sidenav-bg-color: #fff !default; $sidenav-padding: 16px !default; $sidenav-item-height: 48px !default; $sidenav-line-height: $sidenav-item-height !default; - // 15. Photo Slider // ========================================================================== -$slider-bg-color: color('grey', 'base') !default; -$slider-bg-color-light: color('grey', 'lighten-2') !default; -$slider-indicator-color: color('green', 'base') !default; - +$slider-bg-color: color("grey", "base") !default; +$slider-bg-color-light: color("grey", "lighten-2") !default; +$slider-indicator-color: color("green", "base") !default; // 16. Spinners | Loaders // ========================================================================== $spinner-default-color: $secondary-color !default; - // 17. Tabs // ========================================================================== @@ -283,14 +284,12 @@ $tabs-underline-color: $primary-color-light !default; $tabs-text-color: $primary-color !default; $tabs-bg-color: #fff !default; - // 18. Tables // ========================================================================== -$table-border-color: rgba(0,0,0,.12) !default; +$table-border-color: rgba(0, 0, 0, 0.12) !default; $table-striped-color: rgba(242, 242, 242, 0.5) !default; - // 19. Toasts // ========================================================================== @@ -299,11 +298,11 @@ $toast-color: #323232 !default; $toast-text-color: #fff !default; $toast-action-color: #eeff41; - // 20. Typography // ========================================================================== -$font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !default; +$font-stack: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, + Ubuntu, Cantarell, "Helvetica Neue", sans-serif !default; $off-black: rgba(0, 0, 0, 0.87) !default; // Header Styles $h1-fontsize: 4.2rem !default; @@ -313,24 +312,21 @@ $h4-fontsize: 2.28rem !default; $h5-fontsize: 1.64rem !default; $h6-fontsize: 1.15rem !default; - // 21. Footer // ========================================================================== $footer-font-color: #fff !default; $footer-bg-color: $primary-color !default; -$footer-copyright-font-color: rgba(255,255,255,.8) !default; -$footer-copyright-bg-color: rgba(51,51,51,.08) !default; - +$footer-copyright-font-color: rgba(255, 255, 255, 0.8) !default; +$footer-copyright-bg-color: rgba(51, 51, 51, 0.08) !default; // 22. Flow Text // ========================================================================== -$range : $large-screen - $small-screen !default; +$range: $large-screen - $small-screen !default; $intervals: 20 !default; $interval-size: $range / $intervals !default; - // 23. Collections // ========================================================================== @@ -342,7 +338,6 @@ $collection-hover-bg-color: #ddd !default; $collection-link-color: $secondary-color !default; $collection-line-height: 1.5rem !default; - // 24. Progress Bar // ========================================================================== diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py index f08460bd8654907cb56f655e01014342f8e59ab5..c912d13477c607e3374b3c8b4619338a8cb8a6a0 100644 --- a/aleksis/core/tables.py +++ b/aleksis/core/tables.py @@ -1,5 +1,6 @@ from textwrap import wrap +from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ import django_tables2 as tables @@ -31,12 +32,65 @@ class PersonsTable(tables.Table): """Table to list persons.""" class Meta: + model = Person attrs = {"class": "highlight"} + fields = [] first_name = tables.LinkColumn("person_by_id", args=[A("id")]) last_name = tables.LinkColumn("person_by_id", args=[A("id")]) +class FullPersonsTable(PersonsTable): + """Table to list persons.""" + + photo = tables.Column(verbose_name=_("Photo"), accessor="pk", orderable=False) + address = tables.Column(verbose_name=_("Address"), accessor="pk", orderable=False) + + class Meta(PersonsTable.Meta): + fields = ( + "photo", + "short_name", + "date_of_birth", + "sex", + "email", + "user__username", + ) + sequence = ("photo", "first_name", "last_name", "short_name", "...") + + def render_photo(self, value, record): + return render_to_string( + "core/partials/avatar_content.html", + { + "person_or_user": record, + "class": "materialize-circle table-circle", + "img_class": "materialize-circle", + }, + self.request, + ) + + def render_address(self, value, record): + return render_to_string( + "core/partials/address.html", + { + "person": record, + }, + self.request, + ) + + def before_render(self, request): + """Hide columns if user has no permission to view them.""" + if not self.request.user.has_perm("core.view_person_rule"): + self.columns.hide("date_of_birth") + self.columns.hide("sex") + if not self.request.user.has_perm("core.view_contact_details_rule"): + self.columns.hide("email") + if not self.request.user.has_perm("core.view_address"): + self.columns.hide("street") + self.columns.hide("housenumber") + self.columns.hide("postal_code") + self.columns.hide("place") + + class GroupsTable(tables.Table): """Table to list groups.""" @@ -102,7 +156,7 @@ class PersonColumn(tables.Column): """Returns person object from given id.""" def render(self, value): - return Person.objects.get(user__id=value) + return Person.objects.get(pk=value) class InvitationCodeColumn(tables.Column): diff --git a/aleksis/core/tasks.py b/aleksis/core/tasks.py index 847fc41281a0266cff16bbe2117e326e13abc0dd..c7c6e1997daf2b01c569605ce3965c1948c59eb5 100644 --- a/aleksis/core/tasks.py +++ b/aleksis/core/tasks.py @@ -1,9 +1,11 @@ +import time from datetime import timedelta from django.conf import settings from django.core import management from .celery import app +from .util.notifications import _send_due_notifications as _send_due_notifications from .util.notifications import send_notification as _send_notification @@ -48,3 +50,27 @@ def clear_oauth_tokens(): from oauth2_provider.models import clear_expired # noqa return clear_expired() + + +@app.task(run_every=timedelta(minutes=5)) +def send_notifications(): + """Send due notifications to users.""" + _send_due_notifications() + + +@app.task +def send_notification_for_done_task(task_id): + """Send a notification for a done task.""" + from aleksis.core.models import TaskUserAssignment + + # Wait five seconds to ensure that the client has received the final status + time.sleep(5) + + try: + assignment = TaskUserAssignment.objects.get(task_result__task_id=task_id) + except TaskUserAssignment.DoesNotExist: + # No foreground task + return + + if not assignment.result_fetched: + assignment.create_notification() diff --git a/aleksis/core/templates/403.html b/aleksis/core/templates/403.html index cbc962a93da9f8e8efd91d1af1b493c254834281..03e600b49e533de68bd25e8f07ea6ed4dbc8fb51 100644 --- a/aleksis/core/templates/403.html +++ b/aleksis/core/templates/403.html @@ -6,7 +6,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> <span class="card-title"> {% if exception %} {{ exception }} diff --git a/aleksis/core/templates/404.html b/aleksis/core/templates/404.html index cf68c12bf63624ecf40107ee6f3994b288548c3c..969166bea0fb127705f19d8462569a60b4ae88ea 100644 --- a/aleksis/core/templates/404.html +++ b/aleksis/core/templates/404.html @@ -6,7 +6,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> <span class="card-title">{{ exception }}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html index 2abf1445494da40885904252ecbd0aa5bffed077..d008cd5405f4e5eee73ddf175cab87057e563785 100644 --- a/aleksis/core/templates/500.html +++ b/aleksis/core/templates/500.html @@ -6,9 +6,9 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> <span class="card-title">{% trans "Error" %} (500): {% blocktrans %}An unexpected error has - occured.{% endblocktrans %}</span> + occurred.{% endblocktrans %}</span> <p> {% blocktrans %} Your site administrators will automatically be notified about this @@ -16,6 +16,10 @@ {% endblocktrans %} </p> {% include "core/partials/admins_list.html" %} + <a href="javascript:window.location.reload()" class="btn green waves-effect waves-light"> + <i class="material-icons left">refresh</i> + {% trans "Retry" %} + </a> </div> </div> </div> diff --git a/aleksis/core/templates/503.html b/aleksis/core/templates/503.html index 97d76caa4fab9e641bf522779f7c282a9ab2d2dd..21578e63238f09081e35081b4ed45cf1e0a47a1c 100644 --- a/aleksis/core/templates/503.html +++ b/aleksis/core/templates/503.html @@ -6,7 +6,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> <span class="card-title">{% blocktrans %}The maintenance mode is currently enabled. Please try again later.{% endblocktrans %}</span> <p> diff --git a/aleksis/core/templates/account/account_inactive.html b/aleksis/core/templates/account/account_inactive.html index 5c328abcfbca48c6499f71b4b11fac5f1f91ccad..e5fc162e6eea9c1a3418d2a151880dfcdd9003f9 100644 --- a/aleksis/core/templates/account/account_inactive.html +++ b/aleksis/core/templates/account/account_inactive.html @@ -10,7 +10,7 @@ <div class="card red"> <div class="card-content white-text"> <div class="card-title"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> {% blocktrans %}Account inactive.{% endblocktrans %} </div> <p> diff --git a/aleksis/core/templates/account/email_confirm.html b/aleksis/core/templates/account/email_confirm.html index 0f560556b6567f0a2133d0efb5c324730761243c..189df8516b9446550783fd8ecb7d2751e38dd2d3 100644 --- a/aleksis/core/templates/account/email_confirm.html +++ b/aleksis/core/templates/account/email_confirm.html @@ -15,13 +15,13 @@ {% csrf_token %} {% form form=form %}{% endform %} {% trans "Confirm" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-plus-outline" %} </form> {% else %} {% url "account_email" as email_url %} <div class="alert warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% blocktrans %}This e-mail confirmation link expired or is invalid. Please <a href="{{ email_url }}">issue a new e-mail confirmation request</a>.{% endblocktrans %} </p> </div> diff --git a/aleksis/core/templates/account/password_change.html b/aleksis/core/templates/account/password_change.html index be331751b31187a792b72cf97a178ddddf4de42b..3bcf728890412e39f69929db3d85c945343a5126 100644 --- a/aleksis/core/templates/account/password_change.html +++ b/aleksis/core/templates/account/password_change.html @@ -8,7 +8,7 @@ {% block content %} <div class="alert warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% trans "Forgot your current password? Click here to reset it:" %} <a href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>. </p> </div> @@ -17,7 +17,7 @@ {% csrf_token %} {% form form=form %}{% endform %} {% trans "Change password" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %} </form> {% endblock %} diff --git a/aleksis/core/templates/account/password_change_disabled.html b/aleksis/core/templates/account/password_change_disabled.html index 131df489102ec8d257f584892ceb94f04d8e93b1..996ecfa9fa6368ab45772be4064dc058ac59567f 100644 --- a/aleksis/core/templates/account/password_change_disabled.html +++ b/aleksis/core/templates/account/password_change_disabled.html @@ -9,7 +9,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> + <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div> <span class="card-title">{% blocktrans %}Changing of password disabled.{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/account/password_reset.html b/aleksis/core/templates/account/password_reset.html index 4e93262643e0e28919e405c9b2f0465bf2a2bcf8..6253e0df3643b9fb6434bee35944583c40056b15 100644 --- a/aleksis/core/templates/account/password_reset.html +++ b/aleksis/core/templates/account/password_reset.html @@ -15,13 +15,13 @@ <div class="card-title">{% trans "Reset password" %}</div> <p class="margin-bottom"> {% blocktrans %}Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it.{% endblocktrans %} - </p> + </p> {% csrf_token %} {% form form=form %}{% endform %} - </div> + </div> <div class="card-action-light"> {% trans "Reset password" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %} </div> </form> </div> diff --git a/aleksis/core/templates/account/password_reset_done.html b/aleksis/core/templates/account/password_reset_done.html index ddd8b3871c242e8ee2eb9b22cc472778a3b096b9..f97816fea191b4435d53ea6ea61884186883ccbb 100644 --- a/aleksis/core/templates/account/password_reset_done.html +++ b/aleksis/core/templates/account/password_reset_done.html @@ -11,7 +11,7 @@ <div class="card green"> <div class="card-content white-text"> <div class="card-title"> - <i class="material-icons small left">check_circle</i> + <i class="material-icons iconify small left" data-icon="mdi:check-circle-outline"></i> {% blocktrans %}Password reset mail sent{% endblocktrans %} </div> <p> diff --git a/aleksis/core/templates/account/password_reset_from_key.html b/aleksis/core/templates/account/password_reset_from_key.html index 4b2b91a28c875e7c1337fd0543646eae881da356..7afae12f4b0141d0a8a9af2ba2ecb33e893c41a0 100644 --- a/aleksis/core/templates/account/password_reset_from_key.html +++ b/aleksis/core/templates/account/password_reset_from_key.html @@ -11,7 +11,7 @@ <div class="card red"> <div class="card-content white-text"> <div class="card-title"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> {% blocktrans %}Bad token{% endblocktrans %} </div> <p> @@ -44,7 +44,7 @@ {% form form=form %}{% endform %} <div class="card-action-light"> {% trans "Change password" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %} </div> </div> </form> @@ -52,7 +52,7 @@ </div> <div class="alert success"> <p> - <i class="material-icons left">success</i> + <i class="material-icons iconify left" data-icon="mdi:check"></i> {% blocktrans %} Your password is now changed! {% endblocktrans %} diff --git a/aleksis/core/templates/account/password_reset_from_key_done.html b/aleksis/core/templates/account/password_reset_from_key_done.html index b32538e53ee5b1b0f2115e645d0f955d235ba958..8fdd9232f065d093549358c485b523a40d83a996 100644 --- a/aleksis/core/templates/account/password_reset_from_key_done.html +++ b/aleksis/core/templates/account/password_reset_from_key_done.html @@ -9,7 +9,7 @@ <div class="container"> <div class="card green"> <div class="card-content white-text"> - <div class="material-icons small left">success</div> + <i class="material-icons iconify small left" data-icon="mdi:check"></i> <span class="card-title">{% blocktrans %}Password changed!{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/account/password_set.html b/aleksis/core/templates/account/password_set.html index 08819c1e0904f53e62f11d86bd2e82ccef7b2469..2c550502354719da4959adb7c9b12739378b1c23 100644 --- a/aleksis/core/templates/account/password_set.html +++ b/aleksis/core/templates/account/password_set.html @@ -10,7 +10,7 @@ {% csrf_token %} {% form form=form %}{% endform %} {% trans "Set password" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="priority_high" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:exclamation" %} </form> {% endblock %} diff --git a/aleksis/core/templates/account/signup.html b/aleksis/core/templates/account/signup.html index 8885e3902af13c609a69a595df3d125b66dc79ce..eb606114eae4fbbab8cab0543a59ce549e7bb35d 100644 --- a/aleksis/core/templates/account/signup.html +++ b/aleksis/core/templates/account/signup.html @@ -8,7 +8,7 @@ {% block content %} <div class="alert warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %} </p> </div> @@ -20,7 +20,7 @@ <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" /> {% endif %} {% trans "Sign up" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:account-plus-outline" %} </form> {% endblock %} diff --git a/aleksis/core/templates/account/signup_closed.html b/aleksis/core/templates/account/signup_closed.html index 0d5cbd51095e9c24fceacbc4ba8f6a510a5705a9..ca0a124ec3922d6a530bec9548863cb981a0b629 100644 --- a/aleksis/core/templates/account/signup_closed.html +++ b/aleksis/core/templates/account/signup_closed.html @@ -10,7 +10,7 @@ <div class="card red"> <div class="card-content white-text"> <div class="card-title"> - <i class="material-icons small left">error_outline</i> + <i class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></i> {% blocktrans %}Signup closed.{% endblocktrans %} </div> <p> diff --git a/aleksis/core/templates/account/verification_email_required.html b/aleksis/core/templates/account/verification_email_required.html index b1a4a482a3ee64b0f2c6339e76ed44c66b29ef50..d1f826fff71270f8b207e03e070ac1373ec85924 100644 --- a/aleksis/core/templates/account/verification_email_required.html +++ b/aleksis/core/templates/account/verification_email_required.html @@ -10,7 +10,7 @@ <div class="container"> <div class="card green"> <div class="card-content white-text"> - <div class="material-icons small left">success</div> + <div class="material-icons iconify small left" data-icon="mdi:check"></div> <span class="card-title">{% blocktrans %}Password reset mail sent!{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/account/verification_sent.html b/aleksis/core/templates/account/verification_sent.html index df3ae47c82911a01997ac9f4d7919c9e1b95a36e..65bb4c188c3279a5d2bf4bdab37edf92b9fa7760 100644 --- a/aleksis/core/templates/account/verification_sent.html +++ b/aleksis/core/templates/account/verification_sent.html @@ -10,7 +10,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> + <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div> <span class="card-title">{% blocktrans %}Verify your email!{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/components/materialize-chips.html b/aleksis/core/templates/components/materialize-chips.html index e02662adc354dcb1e3784804fdf46783b282ea39..c4bea23ae6ec79b4e3598053b81348cb6286254f 100644 --- a/aleksis/core/templates/components/materialize-chips.html +++ b/aleksis/core/templates/components/materialize-chips.html @@ -3,10 +3,10 @@ <img class="{{ img_classes }}" src="{{ img }}" alt="{{ alt }}"> {% endif %} {% if icon %} - <i class="material-icons left">{{ icon }}</i> + <i class="material-icons iconify left" data-icon="{{ icon }}"></i> {% endif %} {{ content }} {% if close %} - <i class="close material-icons"></i> + <i class="material-icons iconify" data-icon="mdi:close"></i> {% endif %} </div> diff --git a/aleksis/core/templates/components/msgbox.html b/aleksis/core/templates/components/msgbox.html index 8903ebd1a750f1965326cd59499605872b997fc0..de7b12e5eafdfa0974989c20a86dfda3c8372517 100644 --- a/aleksis/core/templates/components/msgbox.html +++ b/aleksis/core/templates/components/msgbox.html @@ -2,7 +2,7 @@ <div class="alert {{ status }}"> <div> {% if icon != "" %} - <i class="material-icons left">{{ icon }}</i> + <i class="material-icons iconify left" data-icon="{{ icon }}"></i> {% endif %} {{ msg }} </div> diff --git a/aleksis/core/templates/components/pagination.html b/aleksis/core/templates/components/pagination.html index 5eb33cdf8fff272d766a628e1656c109ed87e32c..03d05ecf053ddb498d6ab5181f1b774b24e9884a 100644 --- a/aleksis/core/templates/components/pagination.html +++ b/aleksis/core/templates/components/pagination.html @@ -5,7 +5,7 @@ {% if page.has_previous %} <li class="waves-effect"> <a href="?page={{ page.previous_page_number }}" class="page-link"> - <i class="material-icons">chevron_left</i> + <i class="material-icons iconify" data-icon="mdi:chevron-right"></i> </a> </li> {% endif %} @@ -21,7 +21,7 @@ {% if page.has_next %} <li class="waves-effect"> <a href="?page={{ page.next_page_number }}" class="page-link"> - <i class="material-icons">chevron_right</i> + <i class="material-icons iconify" data-icon="mdi:chevron-right"></i> </a> </li> {% endif %} diff --git a/aleksis/core/templates/components/text_collapsible.html b/aleksis/core/templates/components/text_collapsible.html index 7096e8e9311d7fdcd5f6cffb6af0934fa9d56977..bceac0eb58eb83cc9def914fce97d625ac13802a 100644 --- a/aleksis/core/templates/components/text_collapsible.html +++ b/aleksis/core/templates/components/text_collapsible.html @@ -3,11 +3,11 @@ {% include template with item=qs.first %} – {% include template with item=qs.last %} </span> - <i class="material-icons open-icon" title="Show more">add_circle_outline</i> + <i class="material-icons iconify open-icon" title="Show more">plus-circle-outline</i> <span class="b"> {% for item in qs %} {% include template with item=item %} {% endfor %} </span> - <i class="material-icons close-icon" title="Show less">remove_circle_outline</i> + <i class="material-icons iconify close-icon" title="Show less">minus-circle-outline</i> </span> diff --git a/aleksis/core/templates/core/additional_field/list.html b/aleksis/core/templates/core/additional_field/list.html index 1ba2a77a32c528b8443f4dc5a4c201b5739414fe..13f320520f2c695e315dd28cec9c78d367d1b6bf 100644 --- a/aleksis/core/templates/core/additional_field/list.html +++ b/aleksis/core/templates/core/additional_field/list.html @@ -10,7 +10,7 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url 'create_additional_field' %}"> - <i class="material-icons left">add</i> + <i class="material-icons left iconify" data-icon="mdi:add"></i> {% trans "Create additional field" %} </a> diff --git a/aleksis/core/templates/core/announcement/form.html b/aleksis/core/templates/core/announcement/form.html index 44d60280c6d358f74c60cb9c5ccff2c7aba89b07..60d573d0f0de3cc2f4e3e8409beab1716690715c 100644 --- a/aleksis/core/templates/core/announcement/form.html +++ b/aleksis/core/templates/core/announcement/form.html @@ -30,8 +30,8 @@ {% form form=form %}{% endform %} <button type="submit" class="btn green waves-effect waves-light"> - <i class="material-icons left">save</i> - {% trans "Save und publish announcement" %} + <i class="material-icons left iconify" data-icon="mdi:content-save-outline"></i> + {% trans "Save and publish announcement" %} </button> </form> {% include_js "select2-materialize" %} diff --git a/aleksis/core/templates/core/announcement/list.html b/aleksis/core/templates/core/announcement/list.html index 9f84617e255c78b7ee37e502c212e0704aa1da5e..763f4f10cce6c240f80812502c7a378bbdb3a0f7 100644 --- a/aleksis/core/templates/core/announcement/list.html +++ b/aleksis/core/templates/core/announcement/list.html @@ -9,7 +9,7 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url "add_announcement" %}"> - <i class="material-icons left">add</i> + <i class="material-icons left iconify" data-icon="mdi:add"></i> {% trans "Publish new announcement" %} </a> <table class="highlight"> @@ -32,13 +32,13 @@ <td> <a class="btn-flat waves-effect waves-orange orange-text" href="{% url "edit_announcement" announcement.id %}"> - <i class="material-icons left">edit</i> + <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i> {% trans "Edit" %} </a> <form action="{% url "delete_announcement" announcement.id %}" method="post"> {% csrf_token %} <button class="btn-flat waves-effect waves-re red-text" type="submit"> - <i class="material-icons left">delete</i> + <i class="material-icons left iconify" data-icon="mdi:delete-outline"></i> {% trans "Delete" %} </button> </form> diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html index 745a6668cdc42eb265536950a0acbecfb57ee537..8adfdd6a0f9cdcbbd25dc088969ccd1a5fe252e1 100644 --- a/aleksis/core/templates/core/base.html +++ b/aleksis/core/templates/core/base.html @@ -1,6 +1,6 @@ {# -*- engine:django -*- #} -{% load i18n menu_generator static sass_tags any_js rules %} +{% load i18n static sass_tags any_js rules %} {% get_current_language as LANGUAGE_CODE %} @@ -9,13 +9,6 @@ <head> {% include "core/partials/meta.html" %} - <title> - {% block no_browser_title %} - {% block browser_title %}{% endblock %} — - {% endblock %} - {{ request.site.preferences.general__title }} - </title> - {# CSS #} {% include_css "material-design-icons" %} {% include_css "Roboto100" %} @@ -26,9 +19,6 @@ {% include_css "Roboto900" %} <link rel="stylesheet" href="{% sass_src 'public/style.scss' %}"> - {# Add JS URL resolver #} - <script src="{% url "js_reverse" %}" type="text/javascript"></script> - {# Add i18n names for calendar (for use in datepicker) #} {# Passing the locale is not necessary for the scripts to work, but prevents caching issues #} <script src="{% url "javascript-catalog" %}?locale={{ LANGUAGE_CODE }}" type="text/javascript"></script> @@ -53,93 +43,24 @@ </script> {% endif %} + <script type="text/javascript" src="{% url 'config.js' %}"></script> + {% include_js "iconify" %} + {# Include jQuery early to provide $(document).ready #} {% include_js "jQuery" %} + <title> + {% block no_browser_title %} + {% block browser_title %}{% endblock %} + {% endblock %} + </title> + + {% block extra_head %}{% endblock %} </head> -<body {% if no_menu %}class="without-menu"{% endif %}> - -<header> - <!-- Menu button (sidenav) --> - <div class="container"> - <a href="#" data-target="slide-out" class="top-nav sidenav-trigger hide-on-large-only"> - <i class="material-icons">menu</i> - </a> - </div> - - <!-- Nav bar (logged in as, logout) --> - <nav class="nav-extended"> - <div class="nav-wrapper"> - <a class="brand-logo" href="/">{{ request.site.preferences.general__title }}</a> - - <ul id="nav-mobile" class="right hide-on-med-and-down"> - {% if user.is_authenticated %} - <li>{% trans "Logged in as" %} {{ user.get_username }}</li> - <li> - <a href="{% url 'logout' %}">{% trans "Logout" %} <i class="material-icons right">exit_to_app</i></a> - </li> - {% endif %} - </ul> - </div> - <div class="nav-content"> - {% block nav_content %}{% endblock %} - </div> - </nav> - - <!-- Main nav (sidenav) --> - {% if not no_menu %} - <ul id="slide-out" class="sidenav sidenav-fixed"> - <li class="logo"> - {% static "img/aleksis-banner.svg" as aleksis_banner %} - <a id="logo-container" href="/" class="brand-logo"> - <img src="{% firstof request.site.preferences.theme__logo.url aleksis_banner %}" - alt="{{ request.site.preferences.general__title }} – Logo"> - </a> - </li> - {% has_perm 'core.search_rule' user as search %} - {% if search %} - <li class="search"> - <form method="get" action="{% url "haystack_search" %}" id="search-form" class="autocomplete"> - <div class="search-wrapper"> - <input id="search" name="q" type="search" enterkeyhint="search" placeholder="{% trans "Search" %}"> - <button class="btn btn-flat search-button" type="submit" aria-label="{% trans "Search" %}"> - <i class="material-icons">search</i> - </button> - <div class="progress" id="search-loader"> - <div class="indeterminate"></div> - </div> - </div> - </form> - </li> - {% endif %} - <li class="no-padding"> - {% include "core/partials/sidenav.html" %} - </li> - </ul> - {% endif %} -</header> - - -<main role="main"> - {% include 'core/partials/no_person.html' %} - - {% if messages %} - {% for message in messages %} - <figure class="alert {% if message.tags %}{{ message.tags }}{% else %}info{% endif %}"> - {% if message.tags == "success" %} - <i class="material-icons left">check_circle</i> - {% elif message.tags == "info" %} - <i class="material-icons left">info</i> - {% elif message.tags == "warning" %} - <i class="material-icons left">warning</i> - {% elif message.tags == "error" %} - <i class="material-icons left">error</i> - {% endif %} - {{ message }} - </figure> - {% endfor %} - {% endif %} +<body class="without-menu"> + +<main role="main" id="mainReduced"> {% block no_page_title %} <h1>{% block page_title %}{% endblock %}</h1> @@ -148,64 +69,47 @@ {% block content %}{% endblock %} </main> - -<footer class="page-footer"> - <div class="container"> - <div class="row no-margin footer-row-large"> - <div class="col l6 s12 no-pad-left height-inherit"> - <div class="white-text valign-bot"> - {% include 'core/partials/language_form.html' %} - </div> - </div> - <div class="col xl15 l6 offset-xl01 s12 no-pad-right"> - <ul class="no-margin right"> - {% include "core/partials/footer-menu.html" %} - </ul> - </div> - </div> - <div class="row no-margin footer-row-small"> - <div class="white-text make-it-higher"> - {% include 'core/partials/language_form.html' %} - </div> - <ul class="no-margin footer-ul"> - {% include "core/partials/footer-menu.html" %} - </ul> - </div> - </div> - <div class="footer-copyright"> - <div class="container"> - <div class="left"> - <a class="blue-text text-lighten-4" href="{% url "about_aleksis" %}"> - {% trans "About AlekSIS® — The Free School Information System" %} - </a> - © The AlekSIS Team - </div> - <div class="right"> - <span id="doit"></span> - {% if request.site.preferences.footer__imprint_url %} - <a class="blue-text text-lighten-4" href="{{ request.site.preferences.footer__imprint_url }}"> - {% trans "Imprint" %} - </a> - {% endif %} - {% if request.site.preferences.footer__privacy_url and request.site.preferences.footer__imprint_url %} - · - {% endif %} - {% if request.site.preferences.footer__privacy_url %} - <a class="blue-text text-lighten-4" href="{{ request.site.preferences.footer__privacy_url }}"> - {% trans "Privacy Policy" %} - </a> - {% endif %} - </div> - </div> - </div> -</footer> - - {% include_js "luxon" %} {% include_js "materialize" %} {% include_js "sortablejs" %} {% include_js "jquery-sortablejs" %} -<script type="text/javascript" src="{% static 'js/search.js' %}"></script> <script type="text/javascript" src="{% static 'js/main.js' %}"></script> +<script> + $(document).ready(function () { + window.parent.postMessage({height: $(document).height()}); + + function documentResizePostMessage() { + window.parent.postMessage({height: $(document).height()}); + }; + window.onresize = documentResizePostMessage; + + function findLink(el) { + if (el.href) { + return el.href; + } else if (el.parentElement) { + return findLink(el.parentElement); + } else { + return null; + } + }; + + function clickCallback(e) { + const link = findLink(e.target); + if (link == null) { + return; + } + + const newUrl = new URL(link); + const currentUrl = new URL(window.location.href); + if(newUrl.origin !== currentUrl.origin) { + console.debug("External link clicked. Redirecting to " + link + " in new tab."); + e.preventDefault(); + window.open(link, '_blank'); + } + }; + + document.addEventListener('click', clickCallback, false); + }) +</script> </body> </html> diff --git a/aleksis/core/templates/core/base_simple_print.html b/aleksis/core/templates/core/base_simple_print.html new file mode 100644 index 0000000000000000000000000000000000000000..6e66e28983679acebdd2df0993ae7b5fdf64e621 --- /dev/null +++ b/aleksis/core/templates/core/base_simple_print.html @@ -0,0 +1,52 @@ +{% load static i18n any_js sass_tags %} +{% get_current_language as LANGUAGE_CODE %} + +<!DOCTYPE html> +<html lang="{{ LANGUAGE_CODE }}"> +<head> + {% include "core/partials/meta.html" %} + + <title> + {% block no_browser_title %} + {% block browser_title %}{% endblock %} — + {% endblock %} + {{ SITE_PREFERENCES.general__title }} + </title> + + {% include_css "material-design-icons" %} + {% include_css "Roboto100" %} + {% include_css "Roboto300" %} + {% include_css "Roboto400" %} + {% include_css "Roboto500" %} + {% include_css "Roboto700" %} + {% include_css "Roboto900" %} + {% include_css "paper-css" %} + <link rel="stylesheet" href="{% sass_src 'public/style.scss' %}"/> + <link rel="stylesheet" href="{% static "print-simple.css" %}"/> + + {% block size %} + <style> + @page { + size: {{ width }}mm {{ height }}mm; + } + + @media print { + html, body { + width: {{ width }}mm; + } + } + + .sheet { + width: {{ width }}mm; + height: {{ height|add:-1 }}.83mm; + } + </style> + {% endblock %} + + {% block extra_head %}{% endblock %} +</head> + +<body> +{% block content %}{% endblock %} +</body> +</html> diff --git a/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html b/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html index 23a18714637bf90d9610547210b412eec6fae729..950f925e138e1f3583e0099926fbcbaf79f581e3 100644 --- a/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html +++ b/aleksis/core/templates/core/dashboard_widget/dashboardwidget_broken.html @@ -2,7 +2,7 @@ <div class="card horizontal"> <div class="card-image"> - <i class="material-icons large red-text stacked-card-icon">assignment_late</i> + <i class="material-icons large red-text stacked-card-icon iconify" data-icon="mdi:clipboard-alert-outline"></i> </div> <div class="card-stacked"> <div class="card-content"> diff --git a/aleksis/core/templates/core/dashboard_widget/external_link_widget.html b/aleksis/core/templates/core/dashboard_widget/external_link_widget.html index bfbb5bda23e0e5034425ff745efab7f630119355..4f2a940b7b59b84b3fa03a9a3dbc10a0045cf51e 100644 --- a/aleksis/core/templates/core/dashboard_widget/external_link_widget.html +++ b/aleksis/core/templates/core/dashboard_widget/external_link_widget.html @@ -1,6 +1,6 @@ <div class="card"> <div class="card-image"> - <img src="{{ icon_url }}" alt="{{ title }}" /> + <a href="{{ url }}"><img src="{{ icon_url }}" alt="{{ title }}" /></a> </div> <div class="card-action"> <a href="{{ url }}">{{ title }}</a> diff --git a/aleksis/core/templates/core/dashboard_widget/list.html b/aleksis/core/templates/core/dashboard_widget/list.html index ec5fac70d20c3997d2a02128691b947719eb4309..78356cfed3e3b3cce6358855cbdf615d07712a0d 100644 --- a/aleksis/core/templates/core/dashboard_widget/list.html +++ b/aleksis/core/templates/core/dashboard_widget/list.html @@ -11,7 +11,7 @@ {% block content %} <a class="btn green waves-effect waves-light dropdown-trigger" href="#" data-target="widget-dropdown"> - <i class="material-icons left">add</i> + <i class="material-icons left iconify" data-icon="mdi:add"></i> {% trans "Create dashboard widget" %} </a> <ul id="widget-dropdown" class="dropdown-content"> @@ -28,7 +28,7 @@ {% has_perm "core.edit_default_dashboard_rule" user as can_edit_default_dashboard %} {% if can_edit_default_dashboard %} <a class="btn orange waves-effect waves-light" href="{% url "edit_default_dashboard" %}"> - <i class="material-icons left">edit</i> + <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i> {% trans "Edit default dashboard" %} </a> {% endif %} diff --git a/aleksis/core/templates/core/dashboard_widget/static_content_widget.html b/aleksis/core/templates/core/dashboard_widget/static_content_widget.html new file mode 100644 index 0000000000000000000000000000000000000000..96e5549d5890e4cc95dbe6b4a843f1b1612c5d7f --- /dev/null +++ b/aleksis/core/templates/core/dashboard_widget/static_content_widget.html @@ -0,0 +1,10 @@ +{% load html_helpers %} + +<div class="card" style="padding: 2em"> + <div class="card-title"> + {{ title }} + </div> + <div class="card-text"> + {{ content|add_class_to_el:"ul, browser-default"|safe }} + </div> +</div> diff --git a/aleksis/core/templates/core/data_check/list.html b/aleksis/core/templates/core/data_check/list.html index 36d83d4cd7d3c917db98c104586bd2aa9c82c139..b192dcdc1623a05fa3ad7b3568b4b8bdc3622abf 100644 --- a/aleksis/core/templates/core/data_check/list.html +++ b/aleksis/core/templates/core/data_check/list.html @@ -11,14 +11,14 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url "data_check_run" %}"> - <i class="material-icons left">refresh</i> + <i class="material-icons left iconify" data-icon="mdi:refresh"></i> {% trans "Check data again" %} </a> {% if results %} <div class="card"> <div class="card-content"> - <i class="material-icons left medium red-text">warning</i> + <i class="material-icons left medium red-text iconify" data-icon="mdi:alert-outline"></i> <span class="card-title">{% trans "The system detected some problems with your data." %}</span> <p>{% blocktrans %}Please go through all data and check whether some extra action is needed.{% endblocktrans %}</p> @@ -27,7 +27,7 @@ {% else %} <div class="card"> <div class="card-content"> - <i class="material-icons left medium green-text">check_circle</i> + <i class="material-icons left medium green-text iconify" data-icon="mdi:check-circle-outline"></i> <span class="card-title">{% trans "Everything is fine." %}</span> <p>{% blocktrans %}The system hasn't detected any problems with your data.{% endblocktrans %}</p> </div> @@ -86,7 +86,7 @@ <div class="card-title">{% trans "Registered checks" %}</div> <div class="alert primary"> <div> - <i class="material-icons left">info</i> + <i class="material-icons left iconify" data-icon="mdi:information-outline"></i> {% blocktrans %} The system will check for the following problems: {% endblocktrans %} @@ -95,7 +95,7 @@ <ul class="collection"> {% for check in registered_checks %} <li class="collection-item"> - <i class="material-icons left">check</i> + <i class="material-icons left iconify" data-icon="mdi:check"></i> {{ check.verbose_name }} </li> {% endfor %} diff --git a/aleksis/core/templates/core/edit_dashboard.html b/aleksis/core/templates/core/edit_dashboard.html index da50adeea4b2380075113753a9626ef3cbb30fbe..ba4614db61abf50ba8c4bfbabb5383175351c8d8 100644 --- a/aleksis/core/templates/core/edit_dashboard.html +++ b/aleksis/core/templates/core/edit_dashboard.html @@ -19,7 +19,7 @@ {% block content %} <div class="alert primary"> <p> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% if not default_dashboard %} {% blocktrans %} On this page you can arrange your personal dashboard. You can drag any items from "Available widgets" to "Your diff --git a/aleksis/core/templates/core/empty.html b/aleksis/core/templates/core/empty.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/aleksis/core/templates/core/group/child_groups.html b/aleksis/core/templates/core/group/child_groups.html index 900df71a59f24817bbec128b5ec15748b5a9d752..a9b93355b8d775b32d3c20123980828fdcae0fd7 100644 --- a/aleksis/core/templates/core/group/child_groups.html +++ b/aleksis/core/templates/core/group/child_groups.html @@ -14,7 +14,7 @@ {% if not page %} <div class="alert info"> <p> - <i class="material-icons left">info</i> + <i class="material-icons left iconify" data-icon="mdi:information-outline"></i> {% blocktrans %} You can use this to assign child groups to groups. Please use the filters below to select groups you want to change and click "Next". @@ -27,11 +27,11 @@ {% form form=filter.form %}{% endform %} <button type="submit" class="btn green waves-effect waves-light"> - <i class="material-icons left">refresh</i> + <i class="material-icons left iconify" data-icon="mdi:refresh"></i> {% trans "Update selection" %} </button> <a href="{% url "groups_child_groups" %}" class="btn red waves-effect waves-light"> - <i class="material-icons left">clear</i> + <i class="material-icons left iconify" data-icon="mdi:close"></i> {% trans "Clear all filters" %} </a> </form> @@ -50,14 +50,14 @@ {% csrf_token %} <button class="btn btn-primary waves-effect waves-light" type="submit" name="page" value="1"> {% trans "Start assigning child groups for this groups" %} - <i class="material-icons right">arrow_forward</i> + <i class="material-icons left iconify" data-icon="mdi:arrow-right"></i> </button> </form> </p> {% else %} <div class="alert warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i> {% blocktrans %} Please select some groups in order to go on with assigning. {% endblocktrans %} diff --git a/aleksis/core/templates/core/group/full.html b/aleksis/core/templates/core/group/full.html index 65d94ad13a7e563302e9ae283fe4df24c6135353..34b5e647590806e72666701ae0bd1ca1196d9638 100644 --- a/aleksis/core/templates/core/group/full.html +++ b/aleksis/core/templates/core/group/full.html @@ -9,7 +9,9 @@ {% block browser_title %}{{ group.name }}{% endblock %} {% block content %} - <h1>{{ group.name }} <small class="grey-text">{{ group.short_name }}</small></h1> + <h1>{{ group.name }} + <small class="grey-text">{{ group.short_name }}</small> + </h1> {% has_perm 'core.edit_group_rule' user group as can_change_group %} {% has_perm 'core.change_group_preferences_rule' user group as can_change_group_preferences %} @@ -20,21 +22,21 @@ <p> {% if can_change_group %} <a href="{% url 'edit_group_by_id' group.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">edit</i> + <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i> {% trans "Edit" %} </a> {% endif %} {% if can_delete_group %} <a href="{% url 'delete_group_by_id' group.id %}" class="btn waves-effect waves-light red"> - <i class="material-icons left">delete</i> + <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> {% trans "Delete" %} </a> {% endif %} {% if can_change_group_preferences %} <a href="{% url "preferences_group" group.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">settings</i> + <i class="material-icons iconify left" data-icon="mdi:cog-outline"></i> {% trans "Change preferences" %} </a> {% endif %} @@ -44,39 +46,57 @@ <table> <tr> <th> - <i class="material-icons center" title="{% trans "Group type" %}">category</i> + <i class="material-icons iconify left" data-icon="mdi:shape-outline"></i> + {% trans "Group type" %} </th> <td> - {{ group.group_type }} + {{ group.group_type|default:"–" }} </td> </tr> <tr> <th> - <i class="material-icons center" title="{% trans "Parent groups" %}">vertical_align_top</i> + <i class="material-icons iconify left" data-icon="mdi:format-vertical-align-top"></i> + {% trans "Parent groups" %} </th> <td> - {{ group.parent_groups.all|join:", " }} + {{ group.parent_groups.all|join:", "|default:"–" }} </td> </tr> </table> {% if can_view_group_stats %} <h2>{% blocktrans %}Statistics{% endblocktrans %}</h2> - <ul> - <li> - {% trans "Count of members" %}: {{ stats.members }} - </li> + <table> + <tr> + <th> + <i class="material-icons iconify left" data-icon="mdi:account-group-outline"></i> + {% trans "Count of members" %} + </th> + <td>{{ stats.members }}</td> + </tr> {% if stats.age_avg %} - <li> - {% trans "Average age" %}: {{ stats.age_avg|floatformat }} - </li> + <tr> + <th> + <i class="material-icons iconify left" data-icon="mdi:cake-variant-outline"></i> + {% trans "Average age" %} + </th> + <td>{{ stats.age_avg|floatformat }}</td> + </tr> {% endif %} {% if stats.age_range_min %} - <li> - {% trans "Age range" %}: {{ stats.age_range_min }} {% trans "years to" %} {{ stats.age_range_max }} {% trans "years "%} - </li> + <tr> + <th> + <i class="material-icons iconify left" data-icon="mdi:calendar-range-outline"></i> + {% trans "Age range" %} + </th> + <td> + {% blocktrans with min=stats.age_range_min max=stats.age_range_max %} + {{ min }} years to {{ max }} years + {% endblocktrans %} + </td> + </tr> {% endif %} - </ul> + </table> {% endif %} <h2>{% blocktrans %}Owners{% endblocktrans %}</h2> diff --git a/aleksis/core/templates/core/group/list.html b/aleksis/core/templates/core/group/list.html index 9fe2c925f79f423cba0e8d195fb0299cca1c906b..38391cad82a3ff007b02bdca0f6cdda06d53ca2c 100644 --- a/aleksis/core/templates/core/group/list.html +++ b/aleksis/core/templates/core/group/list.html @@ -10,7 +10,7 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url 'create_group' %}"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:add"></i> {% trans "Create group" %} </a> @@ -20,7 +20,7 @@ {% trans "Search" as caption %} {% include "core/partials/save_button.html" with caption=caption icon="search" %} <button type="reset" class="btn red waves-effect waves-light"> - <i class="material-icons left">clear</i> + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Clear" %} </button> </form> diff --git a/aleksis/core/templates/core/group_type/list.html b/aleksis/core/templates/core/group_type/list.html index 6344416b1a8292fd5400e57d63c056e1b2839ef8..e862cb0191533178546b7b481b0db3ce26fa70a0 100644 --- a/aleksis/core/templates/core/group_type/list.html +++ b/aleksis/core/templates/core/group_type/list.html @@ -10,7 +10,7 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url 'create_group_type' %}"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:add"></i> {% trans "Create group type" %} </a> diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html index 7c9c018ca8102172dbd6e46c41048bcbcff4d46f..5a6b975ab5886dd47f528365ba056fe9a40e4d6c 100644 --- a/aleksis/core/templates/core/index.html +++ b/aleksis/core/templates/core/index.html @@ -13,27 +13,12 @@ {% if can_edit_dashboard and show_edit_dashboard_button %} <div class="row no-margin"> <a class="btn-flat waves-effect waves-light right" href="{% url "edit_dashboard" %}"> - <i class="material-icons left">edit</i> + <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i> {% trans "Edit dashboard" %} </a> </div> {% endif %} - {% for notification in unread_notifications %} - <figure class="alert primary scale-transition"> - <i class="material-icons left">info</i> - - <div class="right"> - <a class="btn-flat waves-effect" href="{% url "notification_mark_read" notification.id %}"> - <i class="material-icons center">close</i> - </a> - </div> - - <figcaption>{{ notification.title }}</figcaption> - <p>{{ notification.description|linebreaks }}</p> - </figure> - {% endfor %} - {% include "core/partials/announcements.html" with announcements=announcements %} <div class="row" id="live_load"> @@ -53,9 +38,9 @@ </div> {% endif %} - {% if activities or notifications %} + {% if activities %} <div class="row"> - <div class="col s12 m6"> + <div class="col s12"> <h2>{% blocktrans %}Last activities{% endblocktrans %}</h2> {% if activities %} @@ -65,7 +50,7 @@ <span class="badge new primary-color">{{ activity.app }}</span> <span class="title">{{ activity.title }}</span> <p> - <i class="material-icons left">access_time</i> {{ activity.created }} + <i class="material-icons left iconify" data-icon="mdi:clock-outline"></i> {{ activity.created }} </p> <p> {{ activity.description }} @@ -77,34 +62,6 @@ <p>{% blocktrans %}No activities available yet.{% endblocktrans %}</p> {% endif %} </div> - - <div class="col s12 m6"> - <h2>{% blocktrans %}Recent notifications{% endblocktrans %}</h2> - - {% if notifications %} - <ul class="collection"> - {% for notification in notifications %} - <li class="collection-item"> - <span class="badge new primary-color">{{ notification.sender }}</span> - <span class="title">{{ notification.title }}</span> - <p> - <i class="material-icons left">access_time</i> {{ notification.created }} - </p> - <p> - {{ notification.description }} - </p> - {% if notification.link %} - <p> - <a href="{{ notification.link }}">{% blocktrans %}More information →{% endblocktrans %}</a> - </p> - {% endif %} - </li> - {% endfor %} - </ul> - {% else %} - <p>{% blocktrans %}No notifications available yet.{% endblocktrans %}</p> - {% endif %} - </div> </div> {% endif %} diff --git a/aleksis/core/templates/core/management/data_management.html b/aleksis/core/templates/core/management/data_management.html deleted file mode 100644 index fa8e61f5dac1d1e01e5a773b68015cc9befe8d8f..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/management/data_management.html +++ /dev/null @@ -1,12 +0,0 @@ -{# -*- engine:django -*- #} -{% extends "core/base.html" %} -{% load i18n menu_generator %} - - -{% block browser_title %}{% blocktrans %}Data management{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Data management{% endblocktrans %}{% endblock %} - -{% block content %} - {% get_menu "DATA_MANAGEMENT_MENU" as menu %} - {% include "core/partials/on_page_menu.html" %} -{% endblock %} diff --git a/aleksis/core/templates/core/notifications.html b/aleksis/core/templates/core/notifications.html deleted file mode 100644 index 499bbcc4c866142ce9062efd75fab039dbd303f6..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/notifications.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends 'core/base.html' %} -{% load i18n static dashboard %} - -{% block browser_title %}{% blocktrans %}Notifications{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Notifications{% endblocktrans %}{% endblock %} - - -{% block content %} - {% if object_list %} - <ul class="collection"> - {% for notification in object_list %} - <li class="collection-item"> - <span class="badge new primary-color">{{ notification.sender }}</span> - <span class="title">{{ notification.title }}</span> - <p> - <i class="material-icons left">access_time</i> {{ notification.created }} - </p> - <p> - {{ notification.description|linebreaks }} - </p> - {% if notification.link %} - <p> - <a href="{{ notification.link }}">{% blocktrans %}More information →{% endblocktrans %}</a> - </p> - {% endif %} - </li> - {% endfor %} - </ul> - {% else %} - <p>{% blocktrans %}No notifications available yet.{% endblocktrans %}</p> - {% endif %} -{% endblock %} diff --git a/aleksis/core/templates/core/pages/about.html b/aleksis/core/templates/core/pages/about.html deleted file mode 100644 index 6c44d90cbfe51df457f2bd09f600dfb676b7b97d..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/pages/about.html +++ /dev/null @@ -1,127 +0,0 @@ -{# -*- engine:django -*- #} -{% extends "core/base.html" %} -{% load i18n %} - - -{% block browser_title %}{% blocktrans %}About AlekSIS®{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}AlekSIS® – The Free School Information System{% endblocktrans %}{% endblock %} - -{% block content %} - - <div class="row"> - <div class="col s12"> - <div class="card"> - <div class="card-content"> - <span class="card-title">{% blocktrans %}About AlekSIS{% endblocktrans %}</span> - <p> - {% blocktrans %} - This platform is powered by AlekSIS®, a web-based school information system (SIS) which can be used - to manage and/or publish organisational artifacts of educational institutions. AlekSIS is free software and - can be used by anyone. - {% endblocktrans %} - </p> - <p> - {% blocktrans %} - AlekSIS® is a registered trademark of the AlekSIS open source project, represented by Teckids e.V. - {% endblocktrans %} - </p> - </div> - <div class="card-action"> - <a class="" href="https://aleksis.org/">{% trans "Website of AlekSIS" %}</a> - <a class="" href="https://edugit.org/AlekSIS/">{% trans "Source code" %}</a> - </div> - </div> - </div> - </div> - <div class="row"> - <div class="col s12"> - <div class="card"> - <div class="card-content"> - <span class="card-title">{% trans "Licence information" %}</span> - <p> - {% blocktrans %} - The core and the official apps of AlekSIS are licenced under the EUPL, version 1.2 or later. For licence - information from third-party apps, if installed, refer to the respective components below. The - licences are marked like this: - {% endblocktrans %} - </p> - <br/> - <p> - <span class="chip green white-text">{% trans "Free/Open Source Licence" %}</span> - <span class="chip orange white-text">{% trans "Other Licence" %}</span> - </p> - </div> - <div class="card-action"> - <a href="https://eupl.eu">{% trans "Full licence text" %}</a> - <a href="https://joinup.ec.europa.eu/collection/eupl/guidelines-users-and-developers">{% trans "More information about the EUPL" %}</a> - </div> - </div> - </div> - </div> - - <div class="row"> - {% for app_config in app_configs %} - <div class="col s12 m12 l6"> - <div class="card " id="{{ app_config.name }}"> - <div class="card-content"> - {% if app_config.get_licence.1.isFsfLibre %} - <span class="chip green white-text right">Free Software</span> - {% elif app_config.get_licence.1.isOsiApproved %} - <span class="chip green white-text right">Open Source</span> - {% endif %} - - <span class="card-title">{{ app_config.get_name }} <small>{{ app_config.get_version }}</small></span> - - {% if app_config.get_copyright %} - <p> - {% for holder in app_config.get_copyright %} - Copyright © {{ holder.0 }} - - {% if holder.2 %} - <a href="mailto:{{ holder.2 }}">{{ holder.1 }}</a> - {% else %} - {{ holder.1 }} - {% endif %} - - <br/> - {% endfor %} - </p> - <br/> - {% endif %} - - {% if app_config.get_licence %} - {% with licence=app_config.get_licence %} - <p> - {% blocktrans with licence=licence.0 %} - This app is licenced under {{ licence }}. - {% endblocktrans %} - </p> - <br/> - <p> - {% for l in licence.2 %} - <a class="chip white-text {% if l.isOsiApproved or l.isFsfLibre %}green{% else %}orange{% endif %}" - href="{{ l.url }}"> - {{ l.name }} - </a> - {% endfor %} - </p> - {% endwith %} - {% endif %} - </div> - {% if app_config.get_urls %} - <div class="card-action"> - {% for url_name, url in app_config.get_urls.items %} - <a href="{{ url }}">{{ url_name }}</a> - {% endfor %} - </div> - {% endif %} - </div> - </div> - {% if forloop.counter|divisibleby:2 %} - </div> - <div class="row"> - {% endif %} - {% endfor %} - </div> - -{% endblock %} diff --git a/aleksis/core/templates/core/pages/delete.html b/aleksis/core/templates/core/pages/delete.html index db64ee8fc3b977ed9cb74333e1a25834ce3e58b7..9cbe50ca73913a6cd06ac1eca32b39f88941ee78 100644 --- a/aleksis/core/templates/core/pages/delete.html +++ b/aleksis/core/templates/core/pages/delete.html @@ -18,7 +18,7 @@ <form method="post" action=""> {% csrf_token %} <button type="submit" class="btn red waves-effect waves-light"> - <i class="material-icons left">delete</i> + <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> {% trans "Delete" %} </button> </form> diff --git a/aleksis/core/templates/core/pages/progress.html b/aleksis/core/templates/core/pages/progress.html deleted file mode 100644 index fca1ddfc2ebe5980ee132de77bdf1baafce24ae0..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/pages/progress.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "core/base.html" %} -{% load i18n static %} - -{% block browser_title %} - {{ title }} -{% endblock %} -{% block page_title %} - {{ title }} -{% endblock %} - -{% block content %} - - <div class="container"> - <div class="row"> - <div class="progress center"> - <div class="indeterminate" style="width: 0;" id="progress-bar"></div> - </div> - <h6 class="center"> - {{ progress.title }} - </h6> - </div> - <div class="row"> - <noscript> - <div class="alert warning"> - <p> - <i class="material-icons left">warning</i> - {% blocktrans %} - Without activated JavaScript the progress status can't be updated. - {% endblocktrans %} - </p> - </div> - </noscript> - - <div id="messages"></div> - - <div id="result-box" style="display: none;"> - <div class="alert" id="result-alert"> - <div> - <i class="material-icons left" id="result-icon">check_circle</i> - <p id="result-text"></p> - </div> - </div> - - {% url "index" as index_url %} - <a class="btn waves-effect waves-light" href="{{ back_url|default:index_url }}"> - <i class="material-icons left">arrow_back</i> - {% trans "Go back" %} - </a> - {% if additional_button %} - <a class="btn waves-effect waves-light" href="{{ additional_button.href }}" id="result-button" style="display: none;"> - <i class="material-icons left">{{ additional_button.icon|default:"" }}</i> - {{ additional_button.caption }} - </a> - {% endif %} - </div> - </div> - </div> - - {{ progress|json_script:"progress_options" }} - <script src="{% static "js/helper.js" %}"></script> - <script src="{% static "celery_progress/celery_progress.js" %}"></script> - <script src="{% static "js/progress.js" %}"></script> -{% endblock %} diff --git a/aleksis/core/templates/core/pages/system_status.html b/aleksis/core/templates/core/pages/system_status.html index 89c6ed65e3982a0318838a66ef7f6716935d0af3..7f0e7bff0840029b500620662cd4681ac6bddded 100644 --- a/aleksis/core/templates/core/pages/system_status.html +++ b/aleksis/core/templates/core/pages/system_status.html @@ -15,21 +15,23 @@ <div class="row"> {% if maintenance_mode %} <a class="btn-flat btn-flat-medium right waves-effect waves-red no-padding" - href="{% url 'maintenance_mode_off' %}"><i - class="material-icons small red-text center">power_settings_new</i></a> + href="{% url 'maintenance_mode_off' %}"> + <i class="material-icons iconify small red-text center" data-icon="mdi:power"></i> + </a> <div> <p class="flow-text">{% blocktrans %}Maintenance mode enabled{% endblocktrans %}</p> <p class="grey-text"> {% blocktrans %} - Only admin and visitors from internal IPs can access thesite. + Only admin and visitors from internal IPs can access the site. {% endblocktrans %} </p> </div> <span class="badge badge-danger mdi mdi-power"><a href="{% url 'maintenance_mode_off' %}"></a></span> {% else %} <a class="btn-flat btn-flat-medium right waves-effect waves-green no-padding" - href="{% url 'maintenance_mode_on' %}"><i - class="material-icons small green-text center">power_settings_new</i></a> + href="{% url 'maintenance_mode_on' %}"> + <i class="material-icons iconify small green-text center" data-icon="mdi:power"></i> + </a> <div> <p class="flow-text">{% blocktrans %}Maintenance mode disabled{% endblocktrans %}</p> <p class="grey-text">{% blocktrans %}Everyone can access the site.{% endblocktrans %}</p> @@ -40,7 +42,7 @@ {# Debug mode #} <div class="row"> {% if DEBUG %} - <i class="material-icons small red-text right">power_settings_new</i> + <i class="material-icons iconify small red-text right" data-icon="mdi:power"></i> <div> <p class="flow-text">{% blocktrans %}Debug mode enabled{% endblocktrans %}</p> <p class="grey-text"> @@ -49,7 +51,7 @@ {% endblocktrans %}</p> </div> {% else %} - <i class="material-icons small green-text right">power_settings_new</i> + <i class="material-icons iconify small green-text right" data-icon="mdi:power"></i> <div> <p class="flow-text">{% blocktrans %}Debug mode disabled{% endblocktrans %}</p> <p class="grey-text"> @@ -82,11 +84,13 @@ <tr> <td> <a class="tooltipped" data-position="top" data-tooltip="{{ plugin.pretty_status }}"> - {% if plugin.status %} - <i class="material-icons green-text" aria-hidden="true" title="{{ plugin.pretty_status }}">check</i> - {% else %} - <i class="material-icons red-text" aria-hidden="true" title="{{ plugin.pretty_status }}">warning</i> - {% endif %} + {% if plugin.status %} + <i class="material-icons iconify green-text" aria-hidden="true" title="{{ plugin.pretty_status }}" + data-icon="mdi:check"></i> + {% else %} + <i class="material-icons iconify red-text" aria-hidden="true" title="{{ plugin.pretty_status }}" + data-icon="mdi:alert-outline"></i> + {% endif %} </a> </td> <td>{{ plugin.identifier }}</td> @@ -126,32 +130,32 @@ {% if task.status == "PENDING" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons orange-text">hourglass_empty</i> + <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand-empty"></i> </a> {% elif task.status == "STARTED" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons orange-text">directions_run</i> + <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand"></i> </a> {% elif task.status == "SUCCESS" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons green-text">done</i> + <i class="material-icons iconify green-text" data-icon="mdi:check"></i> </a> {% elif task.status == "FAILURE" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons red-text">error</i> + <i class="material-icons iconify red-text" data-icon="mdi:alert-octagon-outline"></i> </a> {% elif task.status == "RETRY" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons orange-text">hourglass_full</i> + <i class="material-icons iconify orange-text" data-icon="mdi:timer-sand-full"></i> </a> {% elif task.status == "REVOKED" %} <a class="tooltipped" data-position="top" data-tooltip="{{ task.status }}"> - <i class="material-icons red-text">clear</i> + <i class="material-icons iconify red-text" data-icon="mdi:close"></i> </a> {% endif %} </td> diff --git a/aleksis/core/templates/core/pages/test_pdf.html b/aleksis/core/templates/core/pages/test_pdf.html index f0c0a6169c85a6f37252136b3777dc0967350e43..1730d10e655759ad193cd7282654374795951721 100644 --- a/aleksis/core/templates/core/pages/test_pdf.html +++ b/aleksis/core/templates/core/pages/test_pdf.html @@ -10,7 +10,7 @@ {% block content %} <div class="alert primary"> <p> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% blocktrans %} This simple view can be used to ensure the correct function of the built-in PDF generation system. {% endblocktrans %} diff --git a/aleksis/core/templates/core/partials/address.html b/aleksis/core/templates/core/partials/address.html new file mode 100644 index 0000000000000000000000000000000000000000..74a01bde2494d94256432923f5f27c279da2e564 --- /dev/null +++ b/aleksis/core/templates/core/partials/address.html @@ -0,0 +1,2 @@ +{{ person.street }} {{ person.housenumber }}<br> +{{ person.postal_code }} {{ person.place }} diff --git a/aleksis/core/templates/core/partials/announcements.html b/aleksis/core/templates/core/partials/announcements.html index e3dcd5165f4149e3d5fa2016487ef771ad84f12d..4a286a5d79224023995f48dc38a43fb27f2988d7 100644 --- a/aleksis/core/templates/core/partials/announcements.html +++ b/aleksis/core/templates/core/partials/announcements.html @@ -16,7 +16,7 @@ </em> {% endif %} - <i class="material-icons left">announcement</i> + <i class="material-icons iconify left" data-icon="mdi:message-alert-outline"></i> {% if show_recipients and announcement.recipients %} <p> diff --git a/aleksis/core/templates/core/partials/avatar_content.html b/aleksis/core/templates/core/partials/avatar_content.html new file mode 100644 index 0000000000000000000000000000000000000000..f480098078abf246dcc5014cf2990f99e51b46f4 --- /dev/null +++ b/aleksis/core/templates/core/partials/avatar_content.html @@ -0,0 +1,28 @@ +{% load rules i18n %} +{% has_perm 'core.view_avatar_rule' request.user person_or_user as can_view_avatar %} +{% has_perm 'core.view_photo_rule' request.user person_or_user as can_view_photo %} +{% if SITE_PREFERENCES.account__person_prefer_photo and person_or_user.photo and can_view_photo %} + <div class="{% firstof class "clip-circle" %}"> + <img class="{% firstof img_class "hundred-percent" %}" src="{{ person_or_user.photo.url }}" + alt="{{ person_or_user.full_name }}" {% if title %} title="{{ person_or_user.full_name }}"{% endif %}/> + </div> +{% elif person_or_user.identicon_url %} + {# If this is a person #} + <div class="{% firstof class "clip-circle" %}"> + {% if can_view_avatar %} + <img class="{% firstof img_class "hundred-percent" %}" src="{{ person_or_user.avatar_url }}" + alt="{{ person_or_user.full_name }} ({% trans "Avatar" %})" {% if title %} + title="{{ person_or_user.full_name }} ({% trans "Avatar" %})"{% endif %}/> + {% else %} + <img class="{% firstof img_class "hundred-percent" %}" src="{{ person_or_user.identicon_url }}" + alt="{{ person_or_user.full_name }} ({% trans "Identicon" %})" {% if title %} + title="{{ person_or_user.full_name }} ({% trans "Identicon" %})"{% endif %} /> + {% endif %} + </div> + +{% else %} + {# There is a user without a person #} + <div class="{% firstof class "clip-circle" %} no-image"> + <i class="material-icons">person</i> + </div> +{% endif %} diff --git a/aleksis/core/templates/core/partials/copy_button.html b/aleksis/core/templates/core/partials/copy_button.html new file mode 100644 index 0000000000000000000000000000000000000000..2ca0168333bc7215a580b05316c4556db436bb12 --- /dev/null +++ b/aleksis/core/templates/core/partials/copy_button.html @@ -0,0 +1,5 @@ +<button type="button" data-target="{{ target }}" + class="{{ classes }} copy-button waves-effect waves-secondary"> + <i class="material-icons iconify copy-icon-copy" data-icon="mdi:content-copy"></i> + <i class="material-icons iconify copy-icon-success" style="display: none" data-icon="mdi:check"></i> +</button> diff --git a/aleksis/core/templates/core/partials/crud_events.html b/aleksis/core/templates/core/partials/crud_events.html index b0edf14d154690e33a2fac523f5fa38429fcdb5e..d0eba480a1cceec09117f96d7e18c4141729be45 100644 --- a/aleksis/core/templates/core/partials/crud_events.html +++ b/aleksis/core/templates/core/partials/crud_events.html @@ -5,9 +5,9 @@ <div class="collection-item"> <div class="left" style="margin-right: 10px;"> {% if forloop.first %} - <i class="material-icons">add_circle</i> + <i class="material-icons iconify" data-icon="mdi:plus-circle-outline"></i> {% else %} - <i class="material-icons">edit</i> + <i class="material-icons iconify" data-icon="mdi:pencil-circle-outline"></i> {% endif %} </div> <strong> diff --git a/aleksis/core/templates/core/partials/edit_dashboard_widget.html b/aleksis/core/templates/core/partials/edit_dashboard_widget.html index b842c0937f05c4e90a4d7337871460130fa43012..1a469c9cee2a129334bc93779521084c6297074c 100644 --- a/aleksis/core/templates/core/partials/edit_dashboard_widget.html +++ b/aleksis/core/templates/core/partials/edit_dashboard_widget.html @@ -2,7 +2,7 @@ data-pk="{{ widget.pk }}"> <div class="card placeholder"> <div class="card-content"> - <i class="material-icons left small">drag_handle</i> + <i class="material-icons iconify left small" data-icon="mdi:drag-horizontal-variant"></i> <span class="card-title">{{ widget.title }}</span> </div> </div> diff --git a/aleksis/core/templates/core/partials/footer-menu.html b/aleksis/core/templates/core/partials/footer-menu.html deleted file mode 100644 index 5a1d268ea2916899bb3d5bddd47e26d4962734ba..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/partials/footer-menu.html +++ /dev/null @@ -1,10 +0,0 @@ -{# -*- engine:django -*- #} - -{% for item in FOOTER_MENU.items.all %} - <a class="blue-text text-lighten-4 btn-flat" href="{{ item.url }}"> - {% if item.icon %} - <i class="material-icons footer-icon left">{{ item.icon }}</i> - {% endif %} - {{ item.name }} - </a> -{% endfor %} diff --git a/aleksis/core/templates/core/partials/hero_background.html b/aleksis/core/templates/core/partials/hero_background.html deleted file mode 100644 index 33a4890586a18f5f0b5e486d6fb750707ac805e8..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/partials/hero_background.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load static %} -<div id="hero-bg" style="background-image: url('{% static "img/hero.svg" %}'); background-size: 3840px"></div> diff --git a/aleksis/core/templates/core/partials/language_form.html b/aleksis/core/templates/core/partials/language_form.html deleted file mode 100644 index 197906bb09d6c43d187c63f118261eaf6bbead9e..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/partials/language_form.html +++ /dev/null @@ -1,30 +0,0 @@ -{# -*- engine:django -*- #} - -{% load i18n %} - - -<form action="{% url 'set_language' %}" method="post" class="language-form"> - {% csrf_token %} - <input name="next" type="hidden" value="{{ request.get_full_path }}"> - - {% get_current_language as LANGUAGE_CODE %} - {% get_language_info_list for request.site.preferences.internationalisation__languages as languages %} - - {# Select #} - <div class="input-field language-field"> - <span>{% trans "Language" %}</span> - <select name="language"> - {% for language in languages %} - <option value="{{ language.code }}" {% if language.code == LANGUAGE_CODE %} - selected {% endif %}>{{ language.name_local }}</option> - {% endfor %} - </select> - </div> - - {# Submit button (only visible if JS isn't activated #} - <p class="language-submit-p"> - <button type="submit" class="btn-flat waves-effect waves-light white-text"> - {% trans "Select language" %} - </button> - </p> -</form> diff --git a/aleksis/core/templates/core/partials/no_person.html b/aleksis/core/templates/core/partials/no_person.html deleted file mode 100644 index 62b398a1af779b0fc17eef8aa2c0e845760a4e5d..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/partials/no_person.html +++ /dev/null @@ -1,29 +0,0 @@ -{# -*- engine:django -*- #} - -{% load i18n %} - -{% if user.person.is_dummy or not user.person and not user.is_anonymous %} - <div class="alert error"> - <div> - <i class="material-icons left">error</i> - - {% if user.person.is_dummy %} - <p> - {% blocktrans %} - Your administrator account is not linked to any person. Therefore, - a dummy person has been linked to your account. - {% endblocktrans %} - </p> - {% else %} - <p> - {% blocktrans %} - Your user account is not linked to a person. This means you - cannot access any school-related information. Please contact - the managers of AlekSIS at your school. - {% endblocktrans %} - </p> - {% endif %} - - </div> - </div> -{% endif %} diff --git a/aleksis/core/templates/core/partials/save_button.html b/aleksis/core/templates/core/partials/save_button.html index ebc48f2db3d4529f292e3352dbf0cd45ccec2868..3a43323677c44ab6e393c818b451c2b8b846610c 100644 --- a/aleksis/core/templates/core/partials/save_button.html +++ b/aleksis/core/templates/core/partials/save_button.html @@ -1,5 +1,6 @@ {% load i18n %} <button type="submit" class="btn waves-effect waves-light green"> {% trans "Save" as default %} - <i class="material-icons left">{{ icon|default:"save" }}</i> {{ caption|default:default }} + <i class="material-icons left iconify" data-icon="{{ icon|default:"mdi:content-save-outline" }}"></i> + {{ caption|default:default }} </button> diff --git a/aleksis/core/templates/core/partials/sidenav.html b/aleksis/core/templates/core/partials/sidenav.html deleted file mode 100644 index 9b3be97059ca834238d39a4dd6f6bfe35205a9d2..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/partials/sidenav.html +++ /dev/null @@ -1,63 +0,0 @@ -{# -*- engine:django -*- #} - -{% load menu_generator data_helpers %} - -{% get_menu "NAV_MENU_CORE" as core_menu %} - -<ul class="collapsible collapsible-accordion"> - - {% for item in core_menu %} - {% if not item.submenu %} - <li class="{% if item.selected %} active {% endif %}"> - <a class="truncate" {% if item.new_tab %} target="_blank" {% endif %} href="{{ item.url }}"> - {% if item.icon_class %} - <i class="{{ item.icon_class }}"></i> - {% elif item.icon %} - <i class="material-icons">{{ item.icon }}</i> - {% endif %} - {{ item.name }} - {% build_badge item as badge %} - {% if badge %} - <span class="new badge sidenav-badge"> {{ badge }}</span> - {% endif %} - </a> - </li> - {% endif %} - {% if item.submenu %} - <li class="bold {% if item.selected %} active {% endif %}"> - <a class="collapsible-header waves-effect waves-primary truncate" {% if item.new_tab %} target="_blank" {% endif %} href="{{ item.url|default:"#" }}"> - {% if item.icon_class %} - <i class="{{ item.icon_class }}"></i> - {% elif item.icon %} - <i class="material-icons">{{ item.icon }}</i> - {% endif %} - {{ item.name }} - {% build_badge item as badge %} - {% if badge %} - <span class="new badge sidenav-badge"> {{ badge }}</span> - {% endif %} - </a> - <div class="collapsible-body"> - <ul> - {% for menu in item.submenu %} - <li class="{% if menu.selected %} active {% endif %}"> - <a class="truncate" href="{{ menu.url }}"> - {% if menu.icon_class %} - <i class="{{ menu.icon_class }}"></i> - {% elif menu.icon %} - <i class="material-icons">{{ menu.icon }}</i> - {% endif %} - {{ menu.name }} - {% build_badge item as badge %} - {% if badge %} - <span class="new badge sidenav-badge"> {{ badge }}</span> - {% endif %} - </a> - </li> - {% endfor %} - </ul> - </div> - </li> - {% endif %} - {% endfor %} -</ul> diff --git a/aleksis/core/templates/core/partials/splash_screen.html b/aleksis/core/templates/core/partials/splash_screen.html new file mode 100644 index 0000000000000000000000000000000000000000..f3491141c1d0bb48b1b767e382ce66ff87239936 --- /dev/null +++ b/aleksis/core/templates/core/partials/splash_screen.html @@ -0,0 +1,112 @@ +{% load any_js i18n %} +{% include_css "Roboto400" %} +<div id="logo-container"> + <img + src="{% url "logo" %}" + alt="{{ request.site.preferences.general__title }} – Logo" + id="logo" + width="600" + > + <noscript> + {% blocktrans %} + This webbrowser doesn't support JavaScript, or its execution is blocked. Please use another browser to continue. + {% endblocktrans %} + </noscript> +</div> +<div class="lds-ellipsis"> + <div></div> + <div></div> + <div></div> + <div></div> +</div> + +<style> + #logo { + width: 100%; + max-height: inherit; + } + + #logo-container { + width: min(80vw, 600px); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + max-height: calc(100vh - 10vh - calc(2 * min(85px, 15vh))); + } + + noscript { + font-family: Roboto, sans-serif; + font-weight: 400; + } + + .lds-ellipsis { + display: inline-block; + position: absolute; + bottom: 5vh; + left: 50%; + transform: translate(-50%); + aspect-ratio: 1; + height: min(15vh, 85px); + } + + .lds-ellipsis div { + position: absolute; + top: 41.25%; + width: 16.25%; + height: 16.25%; + border-radius: 50%; + aspect-ratio: 1; + background: {{ request.site.preferences.theme__primary }}; + animation-timing-function: cubic-bezier(0, 1, 1, 0); + } + + .lds-ellipsis div:nth-child(1) { + left: 10%; + animation: lds-ellipsis1 0.6s infinite; + } + + .lds-ellipsis div:nth-child(2) { + left: 10%; + animation: lds-ellipsis2 0.6s infinite; + } + + .lds-ellipsis div:nth-child(3) { + left: 40%; + animation: lds-ellipsis2 0.6s infinite; + } + + .lds-ellipsis div:nth-child(4) { + left: 70%; + animation: lds-ellipsis3 0.6s infinite; + } + + @keyframes lds-ellipsis1 { + 0% { + transform: scale(0); + } + 100% { + transform: scale(1); + } + } + + @keyframes lds-ellipsis3 { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0); + } + } + + @keyframes lds-ellipsis2 { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(calc(0.3 * min(15vh, 85px)), 0); + } + } + +</style> diff --git a/aleksis/core/templates/core/partials/turnable.html b/aleksis/core/templates/core/partials/turnable.html index e122b2fa4396282fe0941376161fe3086cda4deb..dabfcbb93ddce6d9323a84757c3753e713c8efea 100644 --- a/aleksis/core/templates/core/partials/turnable.html +++ b/aleksis/core/templates/core/partials/turnable.html @@ -2,9 +2,9 @@ <div class="row"> <a href="{{ url_prev }}" class="btn-flat left"> - <i class="material-icons small">chevron_left</i> + <i class="material-icons iconify small"data-icon="mdi:chevron-left"></i> </a> <a href="{{ url_next }}" class="btn-flat right"> - <i class="material-icons small">chevron_right</i> + <i class="material-icons iconify small" data-icon="mdi:chevron-right"></i> </a> </div> diff --git a/aleksis/core/templates/core/perms/assign.html b/aleksis/core/templates/core/perms/assign.html index 1833ece952d04f01f2f38440cc0fe8fc1d509bf7..75ca29dbad18c1b84e79638cf1c192a7b6b9707d 100644 --- a/aleksis/core/templates/core/perms/assign.html +++ b/aleksis/core/templates/core/perms/assign.html @@ -22,7 +22,7 @@ <input type="hidden" name="step" value="{{ step }}"> {% form form=form %}{% endform %} <button type="submit" class="btn green waves-effect waves-light"> - <i class="material-icons left">save</i> + <i class="material-icons left iconify" data-icon="mdi:content-save-outline"></i> {% trans "Assign" %} </button> </form> diff --git a/aleksis/core/templates/core/perms/list.html b/aleksis/core/templates/core/perms/list.html index 73dcfb8730d5e2235b3b398a4ef0f0fd70c8c31b..319b00285f10753a966047df23669ac40d5b4c95 100644 --- a/aleksis/core/templates/core/perms/list.html +++ b/aleksis/core/templates/core/perms/list.html @@ -54,7 +54,7 @@ {% csrf_token %} {% form form=filter.form %}{% endform %} <button type="submit" class="btn waves-effect waves-light"> - <i class="material-icons left">refresh</i> + <i class="material-icons left iconify" data-icon="mdi:refresh"></i> {% trans "Update" %} </button> </form> diff --git a/aleksis/core/templates/core/person/collection.html b/aleksis/core/templates/core/person/collection.html index fb8518e97e3e8d770260c8e6b004df420d8efa15..c86da61e43ae19ceaa0f601c2f3ec012357bc04d 100644 --- a/aleksis/core/templates/core/person/collection.html +++ b/aleksis/core/templates/core/person/collection.html @@ -3,13 +3,7 @@ <div class="collection person-collection"> {% for person in persons %} <a class="collection-item avatar waves-effect" href="{% url "person_by_id" person.pk %}"> - {% has_perm 'core.view_photo_rule' user person as can_view_photo %} - {% if person.photo and can_view_photo %} - <img class="circle" src="{{ person.photo.url }}" - alt="{{ person.first_name }} {{ person.last_name }}"/> - {% else %} - <i class="material-icons materialize-circle">person</i> - {% endif %} + {% include "core/partials/avatar_content.html" with person_or_user=person class="materialize-circle" img_class="materialize-circle" %} {{ person }} </a> {% endfor %} diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html deleted file mode 100644 index 23f8ba29b30188dd4cdf5b76af23991a0f618119..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/person/full.html +++ /dev/null @@ -1,263 +0,0 @@ -{# -*- engine:django -*- #} - -{% extends "core/base.html" %} - -{% load i18n static rules material_form %} -{% load render_table from django_tables2 %} - -{% block browser_title %}{{ person.first_name }} {{ person.last_name }}{% endblock %} -{% block no_page_title%}{% endblock %} - -{% block content %} - - {% has_perm 'core.edit_person_rule' user person as can_change_person %} - {% has_perm 'core.change_person_preferences_rule' user person as can_change_person_preferences %} - {% has_perm 'core.delete_person_rule' user person as can_delete_person %} - {% has_perm "core.impersonate_rule" user person as can_impersonate %} - {% has_perm "core.can_invite" user person as can_invite %} - - {% include "core/partials/hero_background.html" %} - - {% if can_change_person or can_change_person_preferences or can_delete_person or can_impersonate or can_invite %} - <p class="person-buttons hide-on-med-and-down"> - {% if can_change_person %} - <a href="{% url 'edit_person_by_id' person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">edit</i> - {% trans "Edit" %} - </a> - {% endif %} - - {% if can_delete_person %} - <a href="{% url 'delete_person_by_id' person.id %}" class="btn waves-effect waves-light red"> - <i class="material-icons left">delete</i> - {% trans "Delete" %} - </a> - {% endif %} - - {% if can_change_person_preferences %} - <a href="{% url 'preferences_person' person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">settings</i> - {% trans "Change preferences" %} - </a> - {% endif %} - - {% if can_impersonate and person.user %} - <a href="{% url 'impersonate-start' person.user.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">portrait</i> - {% trans "Impersonate" %} - </a> - {% endif %} - - {% if invite_enabled and can_invite and not person.user %} - <a href="{% url "invite_person_by_id" person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left">card_giftcard</i> - {% trans "Invite user" %} - </a> - {% endif %} - </p> - {% endif %} - - <header class="person-container"> - <div class="image-wrapper"> - {% has_perm 'core.view_avatar_rule' user person as can_view_avatar %} - {% if person.avatar and can_view_avatar %} - <div class="clip-circle materialboxed z-depth-2"> - <img class="hundred-percent" src="{{ person.avatar.url }}" - alt="{{ person.first_name }} {{ person.last_name }}"/> - </div> - - {% else %} - - <div class="clip-circle no-image z-depth-2"> - {{ person.initials }} - </div> - {% endif %} - </div> - <h1> - {{ person.first_name }} {{ person.last_name }} - {% if person.user %} - <small class="grey-text">{{ person.user.username }}</small> - {% endif %} - </h1> - </header> - - <div class="row"> - {% if person.description %} - <div class="col s12"> - <p class="container center-align"> - {{ person.description }} - </p> - </div> - {% endif %} - {% if can_change_person or can_change_person_preferences or can_delete_person or can_impersonate or can_invite %} - <div class="col s12 hide-on-large-only"> - <div class="collection"> - {% if can_change_person %} - <a href="{% url 'edit_person_by_id' person.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons left">edit</i> - {% trans "Edit" %} - </a> - {% endif %} - - {% if can_delete_person %} - <a href="{% url 'delete_person_by_id' person.id %}" class="collection-item waves-effect waves-red red-text"> - <i class="material-icons left">delete</i> - {% trans "Delete" %} - </a> - {% endif %} - - {% if can_change_person_preferences %} - <a href="{% url 'preferences_person' person.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons left">settings</i> - {% trans "Change preferences" %} - </a> - {% endif %} - - {% if can_impersonate and person.user %} - <a href="{% url 'impersonate-start' person.user.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons left">portrait</i> - {% trans "Impersonate" %} - </a> - {% endif %} - - {% if can_invite and not person.user %} - <a href="{% url "invite_person_by_id" person.id %}" class="collection-item waves-effect waves-light"> - <i class="material-icons left">card_giftcard</i> - {% trans "Invite user" %} - </a> - {% endif %} - </div> - </div> - {% endif %} - <div class="col s12 l4"> - <h2>{% blocktrans %}Contact details{% endblocktrans %}</h2> - <div class="card-panel"> - <table class="highlight"> - <tr> - <td> - <i class="material-icons small">person</i> - </td> - <td>{{ person.first_name }} {{ person.additional_name }} {{ person.last_name }}</td> - </tr> - <tr> - <td> - <i class="material-icons small">face</i> - </td> - <td>{% firstof person.get_sex_display "–" %}</td> - </tr> - {% has_perm 'core.view_address_rule' user person as can_view_address %} - {% if can_view_address %} - <tr> - <td rowspan="2"> - <i class="material-icons small">home</i> - </td> - <td>{% firstof person.street "–" %} {{ person.housenumber }}</td> - </tr> - <tr> - <td>{{ person.postal_code }} {% firstof person.place "–" %}</td> - </tr> - {% endif %} - {% has_perm 'core.view_contact_details_rule' user person as can_view_contact_details %} - {% if can_view_contact_details %} - <tr> - <td rowspan="2"> - <i class="material-icons small">phone</i> - </td> - <td> - {% if person.phone_number %} - <a href="{{ person.phone_number.as_rfc3966 }}">{{ person.phone_number.as_international }}</a> - {% else %} - – - {% endif %} - <small>({% trans "Home phone" %})</small> - </td> - </tr> - <tr> - <td> - {% if person.mobile_number %} - <a href="{{ person.mobile_number.as_rfc3966 }}">{{ person.mobile_number.as_international }}</a> - {% else %} - – - {% endif %} - <small>({% trans "Mobile phone" %})</small> - </td> - </tr> - <tr> - <td> - <i class="material-icons small">email</i> - </td> - <td> - {% if person.email %} - <a href="mailto:{{ person.email }}">{{ person.email }}</a> - {% else %} - – - {% endif %} - </td> - </tr> - {% endif %} - {% has_perm 'core.view_personal_details_rule' user person as can_view_personal_details %} - {% if can_view_personal_details %} - <tr> - <td> - <i class="material-icons small">cake</i> - </td> - <td> - <time datetime="{{ person.date_of_birth|date:'c' }}">{{ person.date_of_birth|date }}</time> - {% firstof person.place_of_birth "–" %} - </td> - </tr> - {% endif %} - </table> - </div> - {% has_perm 'core.view_photo_rule' user person as can_view_photo %} - {% if person.photo and can_view_photo %} - <div class="card"> - <div class="card-image"> - <img src="{{ person.photo.url }}" alt="{{ person.first_name }} {{ person.last_name }}" class="materialboxed"> - <span class="card-title">{{ person.first_name }} {{ person.last_name }}</span> - </div> - </div> - - {% else %} - <div class="card-panel"> - <i class="material-icons left">image_not_supported</i> - {% trans "This person didn't upload a personal photo." %} - </div> - {% endif %} - </div> - - {% if person.children.all or person.guardians.all and can_view_personal_details %} - <div class="col s12 m6 l4"> - {% if person.children.all and can_view_personal_details %} - <h2>{% trans "Children" %}</h2> - <div class="card-panel"> - {% include "core/person/collection.html" with persons=person.children.all %} - </div> - {% endif %} - - {% if person.guardians.all and can_view_personal_details %} - <h2>{% trans "Guardians / Parents" %}</h2> - <div class="card-panel"> - {% include "core/person/collection.html" with persons=person.guardians.all %} - </div> - {% endif %} - </div> - {% endif %} - - {% has_perm 'core.view_person_groups_rule' user person as can_view_groups %} - {% if can_view_groups and groups %} - <div class="col s12 m6 l4"> - <h2>{% blocktrans %}Groups{% endblocktrans %}</h2> - <div class="card-panel"> - <div class="collection"> - {% for group in groups %} - <a href="{{ group.get_absolute_url }}" class="collection-item"> - {{ group.name }} ({{ group.school_term }}) - </a> - {% endfor %} - </div> - </div> - </div> - {% endif %} - </div> -{% endblock %} diff --git a/aleksis/core/templates/core/person/list.html b/aleksis/core/templates/core/person/list.html index ca441cac485847cf6a4975071d73787473804694..acafd75bad5762e3367f4f00b50010987c4f3fae 100644 --- a/aleksis/core/templates/core/person/list.html +++ b/aleksis/core/templates/core/person/list.html @@ -13,7 +13,7 @@ {% if can_create_person %} <a class="btn green waves-effect waves-light" href="{% url 'create_person' %}"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:add"></i> {% trans "Create person" %} </a> {% endif %} @@ -22,9 +22,9 @@ <form method="get"> {% form form=persons_filter.form %}{% endform %} {% trans "Search" as caption %} - {% include "core/partials/save_button.html" with caption=caption icon="search" %} + {% include "core/partials/save_button.html" with caption=caption icon="mdi:search" %} <button type="reset" class="btn red waves-effect waves-light"> - <i class="material-icons left">clear</i> + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Clear" %} </button> </form> diff --git a/aleksis/core/templates/core/school_term/list.html b/aleksis/core/templates/core/school_term/list.html index 14aa2f0a697a3efd54b27154b431ef3f424923de..9df6af9727b868e13d43a75c42730b375ff6aa47 100644 --- a/aleksis/core/templates/core/school_term/list.html +++ b/aleksis/core/templates/core/school_term/list.html @@ -10,7 +10,7 @@ {% block content %} <a class="btn green waves-effect waves-light" href="{% url 'create_school_term' %}"> - <i class="material-icons left">add</i> + <i class="material-icons left iconify" data-icon="mdi:add"></i> {% trans "Create school term" %} </a> diff --git a/aleksis/core/templates/core/vue_index.html b/aleksis/core/templates/core/vue_index.html new file mode 100644 index 0000000000000000000000000000000000000000..b39da47ea2154318d13ce0d60428f175299ee562 --- /dev/null +++ b/aleksis/core/templates/core/vue_index.html @@ -0,0 +1,34 @@ +{# -*- engine:django -*- #} +{% load django_vite i18n any_js %} +{% get_current_language as LANGUAGE_CODE %} +<!DOCTYPE html> + +<html> + <head> + <base href="{{ BASE_URL }}"> + + {% include "core/partials/meta.html" %} + <title>{{ request.site.preferences.general__title }}</title> + + {% if SENTRY_ENABLED %} + {% if SENTRY_TRACE_ID %} + <meta name="sentry-trace" content="{{ SENTRY_TRACE_ID }}"/> + {% endif %} + {% endif %} + + {{ FRONTEND_SETTINGS|json_script:"frontend_settings" }} + + {% vite_hmr_client %} + </head> + + <body> + <main id="app"> + <!-- HTML and CSS in #app will be replaced by vue --> + {% include "core/partials/splash_screen.html" %} + + <app ref="aleksisApp"></app> + </main> + + {% vite_asset 'aleksis/core/frontend/index.js' %} + </body> +</html> diff --git a/aleksis/core/templates/django_tables2/materialize.html b/aleksis/core/templates/django_tables2/materialize.html index 8901c2d5d9dfddf14934195dee11641bca9bcb8d..b472a5b0c9d5e185482959c7536c5c6dd513f211 100644 --- a/aleksis/core/templates/django_tables2/materialize.html +++ b/aleksis/core/templates/django_tables2/materialize.html @@ -66,7 +66,7 @@ <li class="waves-effect"> <a href="{% querystring table.prefixed_page_field=table.page.previous_page_number %}" class="page-link"> - <i class="material-icons">chevron_left</i> + <i class="material-icons iconify" data-icon="mdi:chevron-left"></i> </a> </li> {% endblock pagination.previous %} @@ -86,7 +86,7 @@ {% block pagination.next %} <li class="waves-effect"> <a href="{% querystring table.prefixed_page_field=table.page.next_page_number %}" class="page-link"> - <i class="material-icons">chevron_right</i> + <i class="material-icons iconify" data-icon="mdi:chevron-right"></i> </a> </li> {% endblock pagination.next %} diff --git a/aleksis/core/templates/material/fields/colorfield_colorwidget.html b/aleksis/core/templates/material/fields/colorfield_colorwidget.html index ab8bc7f955126d365be64085b7be740ef70a398f..5fff8c00ac913134abcb8e869464aeb7fe1e6330 100644 --- a/aleksis/core/templates/material/fields/colorfield_colorwidget.html +++ b/aleksis/core/templates/material/fields/colorfield_colorwidget.html @@ -2,7 +2,7 @@ {% part bound_field.field %} <div class="row"> <div class="input-field col s12{% if widget.attrs.required %} required{% endif %}"> - <i class="material-icons prefix" id="{{ bound_field.html_name }}_preview" style="color: {% firstof bound_field.value field.widget.attrs.default '' %};">color_lens</i> + <i class="material-icons iconify prefix" id="{{ bound_field.html_name }}_preview" style="color: {% firstof bound_field.value field.widget.attrs.default '' %};" data-icon="mdi:palette-outline"></i> {% part field prefix %}{% endpart %}{% part field control %} <input type="text" diff --git a/aleksis/core/templates/material/non_field_errors.html b/aleksis/core/templates/material/non_field_errors.html index c8a92eb7ef813325580738a7819fccf6da2dfa70..b64aa87982a9285f6ee023cff210bbff1ae6b67a 100644 --- a/aleksis/core/templates/material/non_field_errors.html +++ b/aleksis/core/templates/material/non_field_errors.html @@ -1,7 +1,7 @@ {% if form.non_field_errors %} <div class="alert error"> {% for error in form.non_field_errors %} - <div><i class="material-icons left">error</i> {{ error }}</div> + <div><i class="material-icons iconify left" data-icon="mdi:alert-octagon-outline"></i> {{ error }}</div> {% endfor %} </div> {% endif %} diff --git a/aleksis/core/templates/oauth2_provider/application/create.html b/aleksis/core/templates/oauth2_provider/application/create.html index 73b94677206d38fca163858551536d575b2dce3d..683c81fa25966dea43c5737537ff090b4b042f01 100644 --- a/aleksis/core/templates/oauth2_provider/application/create.html +++ b/aleksis/core/templates/oauth2_provider/application/create.html @@ -11,7 +11,7 @@ {% form form=form %}{% endform %} {% include "core/partials/save_button.html" %} <a class="btn waves-effect red waves-light" href="{% url "oauth2_applications" %}"> - <i class="material-icons left">clear</i> {% trans "Cancel" %} + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %} </a> </form> {% endblock %} diff --git a/aleksis/core/templates/oauth2_provider/application/detail.html b/aleksis/core/templates/oauth2_provider/application/detail.html index 28e2af7d70ff4b6dd5d93b46b8ec52d31bc36538..1a7709f14dacdef5ab414d516ec35d72cbc1e5f8 100644 --- a/aleksis/core/templates/oauth2_provider/application/detail.html +++ b/aleksis/core/templates/oauth2_provider/application/detail.html @@ -6,18 +6,18 @@ {% block page_title %} <a href="{% url "oauth2_applications" %}" class="btn-flat primary-color-text waves-light waves-effect"> - <i class="material-icons left">chevron_left</i> {% trans "Back" %} + <i class="material-icons iconify left" data-icon="mdi:chevron-left"></i> {% trans "Back" %} </a> {{ application.name }} {% endblock %} {% block content %} <a class="btn orange waves-effect waves-light btn-margin" href="{% url "edit_oauth2_application" application.id %}"> - <i class="material-icons left">edit</i> + <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i> {% trans "Edit" %} </a> <a class="btn red waves-effect waves-light btn-margin" href="{% url "delete_oauth2_application" application.id %}"> - <i class="material-icons left">delete</i> + <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> {% trans "Delete" %} </a> <table class="responsive-table"> @@ -79,7 +79,7 @@ {% trans "Skip Authorisation" %} </th> <td> - <i class="material-icons">{{ application.skip_authorization|yesno:"check,close" }}</i> + <i class="material-icons iconify" data-icon="mdi:{{ application.skip_authorization|yesno:"check,close" }}"></i> </td> </tr> </tbody> diff --git a/aleksis/core/templates/oauth2_provider/application/edit.html b/aleksis/core/templates/oauth2_provider/application/edit.html index 30f50fff94e330e941d7b4730fe7d875b039d74e..e4d837a32d713ef07b05656425e97979efef92cd 100644 --- a/aleksis/core/templates/oauth2_provider/application/edit.html +++ b/aleksis/core/templates/oauth2_provider/application/edit.html @@ -11,7 +11,7 @@ {% form form=form %}{% endform %} {% include "core/partials/save_button.html" %} <a class="btn waves-effect red waves-light" href="{% url "oauth2_application" application.id %}"> - <i class="material-icons left">clear</i> {% trans "Cancel" %} + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %} </a> </form> {% endblock %} diff --git a/aleksis/core/templates/oauth2_provider/application/list.html b/aleksis/core/templates/oauth2_provider/application/list.html index ced7d718dfe1b561c2ea8253e25658a9f449024d..1525dc99c28326701d5b91a59c1992a23abff439 100644 --- a/aleksis/core/templates/oauth2_provider/application/list.html +++ b/aleksis/core/templates/oauth2_provider/application/list.html @@ -7,7 +7,7 @@ {% block content %} <a href="{% url "register_oauth_application" %}" class="btn green waves-effect waves-light"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:add"></i> {% blocktrans %}Register new application{% endblocktrans %} </a> <div class="collection"> diff --git a/aleksis/core/templates/oauth2_provider/authorize.html b/aleksis/core/templates/oauth2_provider/authorize.html index c90d5e8dd9d3d72cff9e19ce167487900e904636..09293713fc126ec63fadec4e470206f78177a475 100644 --- a/aleksis/core/templates/oauth2_provider/authorize.html +++ b/aleksis/core/templates/oauth2_provider/authorize.html @@ -25,7 +25,7 @@ <p class="margin-bottom">{% trans "The application requests access to the following scopes:" %}</p> {% for scope in scopes_descriptions %} <p class="margin-bottom"> - <i class="material-icons left">check</i> + <i class="material-icons iconify left" data-icon="mdi:check"></i> {{ scope }} </p> {% endfor %} @@ -37,10 +37,10 @@ {% part form.allow %}<input type="hidden" value="true" name="allow">{% endpart %} {% endform %} <button type="submit" class="btn green waves-effect waves-light btn-margin"> - <i class="material-icons left">done_all</i> {% trans "Allow" %} + <i class="material-icons iconify left" data-icon="mdi:check-all"></i> {% trans "Allow" %} </button> <a class="btn red waves-effect waves-light btn-margin" href="{% block app-form-back-url %}{% url "oauth2_application" application.id %}{% endblock app-form-back-url %}"> - <i class="material-icons left">cancel</i> {% trans "Disallow" %} + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Disallow" %} </a> </form> </div> @@ -50,7 +50,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> + <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div> <span class="card-title">{% trans "Error" %}: {{ error.error }}</span> <p> {{ error.description }} diff --git a/aleksis/core/templates/oauth2_provider/authorized-oob.html b/aleksis/core/templates/oauth2_provider/authorized-oob.html deleted file mode 100644 index 3e95b0bf3a25691e0fc84e36dbcf71559cf86dc1..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/oauth2_provider/authorized-oob.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "core/base.html" %} - -{% load i18n %} - -{% block content %} - - {% if not error %} - <div class="container"> - <div class="card green"> - <div class="card-content white-text"> - <div class="material-icons small left">check</div> - <span class="card-title">{% blocktrans %}Success!{% endblocktrans %}</span> - <p> - {% trans "Please return to your application and enter this code:" %} {{ code }} - </p> - </div> - </div> - </div> - {% else %} - <div class="container"> - <div class="card red"> - <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> - <span class="card-title">{% trans "Error" %}: {{ error.error }}</span> - <p> - {{ error.description }} - </p> - <p> - Please verify if the application is configured correctly or contact one of your site administrators: - </p> - {% include "core/partials/admins_list.html" %} - </div> - </div> - </div> - {% endif %} -{% endblock %} diff --git a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html index 7f6f25920bebcbbaad7bb93fd486db617f25d662..ece2011b6e6170bd8ed845f8464302bb1e6fb8fb 100644 --- a/aleksis/core/templates/oauth2_provider/authorized-token-delete.html +++ b/aleksis/core/templates/oauth2_provider/authorized-token-delete.html @@ -8,7 +8,7 @@ {% block content %} <div class="alert info"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% trans "Are you sure to revoke the access for this application?" %} </p> </div> @@ -16,11 +16,11 @@ <form method="post"> {% csrf_token %} <a class="btn waves-effect waves-light red" href="{% url "oauth2_applications" %}"> - <i class="material-icons left">delete</i> + <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> {% trans "Revoke" %} </a> <a class="btn waves-effect waves-light" href="{% url "oauth2_applications" %}"> - <i class="material-icons left">cancel</i> + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %} </a> </form> diff --git a/aleksis/core/templates/oauth2_provider/authorized-tokens.html b/aleksis/core/templates/oauth2_provider/authorized-tokens.html index 46b0ce570a5ec1077825b283a244b6652045c437..dfe058056fb4ffaabd2a44eaac04adaa8aa3ad3b 100644 --- a/aleksis/core/templates/oauth2_provider/authorized-tokens.html +++ b/aleksis/core/templates/oauth2_provider/authorized-tokens.html @@ -29,7 +29,7 @@ {% else %} <div class="alert info"> <p> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% trans "No authorized applications." %} </p> </div> diff --git a/aleksis/core/templates/offline.html b/aleksis/core/templates/offline.html index bd741268a8902ac6708f33e353337695c03158a3..77537353bc1615426bab6e836519954c4a803da6 100644 --- a/aleksis/core/templates/offline.html +++ b/aleksis/core/templates/offline.html @@ -5,12 +5,14 @@ {% block browser_title %}{% blocktrans %}Network error{% endblocktrans %}{% endblock %} {% block content %} - <h3><i class="material-icons left medium" style="font-size: 2.92rem;">signal_wifi_off</i>{% blocktrans %}No internet - connection.{% endblocktrans %}</h3> + <h3> + <i class="material-icons iconify left medium" style="font-size: 2.92rem;" data-icon="mdi:wifi-strength-alert-outline"></i> + {% blocktrans %}Page not available offline.{% endblocktrans %} + </h3> <p class="flow-text"> {% blocktrans %} - There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi + This page is not available offline. Since you probably don't have an internet connection, check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators: {% endblocktrans %} diff --git a/aleksis/core/templates/search/search.html b/aleksis/core/templates/search/search.html index 5af1e55cc1076e404a921596da1cbc0774f7dbc3..ca32339d6d88010d2f4dab4d9e7557cd191705fe 100644 --- a/aleksis/core/templates/search/search.html +++ b/aleksis/core/templates/search/search.html @@ -18,7 +18,7 @@ <p> <button type="submit" class="btn waves-effect waves-light green"> - <i class="material-icons left">search</i> + <i class="material-icons iconify left" data-icon="mdi:search"></i> {% blocktrans %}Search{% endblocktrans %} </button> </p> @@ -29,7 +29,7 @@ <div class="collection"> {% for result in page_obj.object_list %} <a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item"> - <i class="material-icons left">{{ result.object.icon_ }}</i> + <i class="material-icons iconify left" data-icon="mdi:{{ result.object.icon_ }}"></i> {{ result.object }} </a> {% empty %} @@ -46,12 +46,12 @@ {% if page_obj.has_previous %} <li class="waves-effect"> <a href="?q={{ query }}&page={{ page_obj.previous_page_number }}"> - <i class="material-icons">chevron_left</i> + <i class="material-icons iconify" data-icon="mdi:chevron-left"></i> </a> </li> {% else %} <li class="disabled"> - <a href="#"><i class="material-icons">chevron_left</i></a> + <a href="#"><i class="material-icons iconify" data-icon="mdi:chevron-left"></i></a> </li> {% endif %} @@ -70,12 +70,12 @@ {% if page_obj.has_next %} <li class="waves-effect"> <a href="?q={{ query }}&page={{ page_obj.next_page_number }}"> - <i class="material-icons">chevron_right</i> + <i class="material-icons iconify" data-icon="mdi:chevron-right"></i> </a> </li> {% else %} <li class="disabled"> - <a href="#"><i class="material-icons">chevron_right</i></a> + <a href="#"><i class="material-icons iconify" data-icon="mdi:chevron-right"></i></a> </li> {% endif %} </ul> diff --git a/aleksis/core/templates/search/searchbar_snippet.html b/aleksis/core/templates/search/searchbar_snippet.html index b5b7188c6a1e0381fd30f41b6fccc7e587949a30..d0ec278c2b232f701e6231e337c14c10c0096839 100644 --- a/aleksis/core/templates/search/searchbar_snippet.html +++ b/aleksis/core/templates/search/searchbar_snippet.html @@ -1,4 +1,4 @@ <a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item search-item"> {{ result.object }} - <i class="material-icons secondary-content search-result-icon">{{ result.object.icon_ }}</i> + <i class="material-icons secondary-content search-result-icon iconify" data-icon="mdi:{{ result.object.icon_ }}"></i> </a> diff --git a/aleksis/core/templates/socialaccount/authentication_error.html b/aleksis/core/templates/socialaccount/authentication_error.html index 00901daf7fc3542ba07490381f7903e8f6d14048..43288dbc00e6ce84139254bf1b15d0781074d9eb 100644 --- a/aleksis/core/templates/socialaccount/authentication_error.html +++ b/aleksis/core/templates/socialaccount/authentication_error.html @@ -9,7 +9,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> + <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div> <span class="card-title">{% blocktrans %}Third-party Account Login Failure.{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/socialaccount/login.html b/aleksis/core/templates/socialaccount/login.html index 1630b01fa4104f563a92663bc7fd386a2abd5266..6f9747e82978371eda6bbda59d1e195d399fc782 100644 --- a/aleksis/core/templates/socialaccount/login.html +++ b/aleksis/core/templates/socialaccount/login.html @@ -8,7 +8,7 @@ {% block content %} {% if process == "connect" %} <p class="flow-text"> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% blocktrans with provider.name as provider %}You are about to connect a new third party account from {{ provider }}.{% endblocktrans %} </p> <form method="post"> @@ -19,7 +19,7 @@ </form> {% else %} <p class="flow-text"> - <i class="material-icons left small">info</i> + <i class="material-icons iconify left small" data-icon="mdi:information-outline"></i> {% blocktrans with provider.name as provider %}You are about to sign in using a third party account from {{ provider }}.{% endblocktrans %} </p> <form method="post"> diff --git a/aleksis/core/templates/socialaccount/login_cancelled.html b/aleksis/core/templates/socialaccount/login_cancelled.html index bc1ebb6cb31a6b15a9d448cb93fa40a7cccb7d26..cb56d41b013e43c56853a3816ad63d8047e08a29 100644 --- a/aleksis/core/templates/socialaccount/login_cancelled.html +++ b/aleksis/core/templates/socialaccount/login_cancelled.html @@ -9,7 +9,7 @@ <div class="container"> <div class="card red"> <div class="card-content white-text"> - <div class="material-icons small left">error_outline</div> + <div class="material-icons iconify small left" data-icon="mdi:alert-octagon-outline"></div> <span class="card-title">{% blocktrans %}Login cancelled{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/socialaccount/signup.html b/aleksis/core/templates/socialaccount/signup.html index df79ecce459fa0ea7bcd8fe83ea21f530944c49b..7b11a3c40537933c4c4425a51b8c8913d3d0f8aa 100644 --- a/aleksis/core/templates/socialaccount/signup.html +++ b/aleksis/core/templates/socialaccount/signup.html @@ -8,7 +8,7 @@ {% block content %} <div class="alert success"> <p> - <i class="material-icons left">check_circle_outline</i> + <i class="material-icons iconify left" data-icon="mdi:check-circle-outline"></i> {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to {{site_name}}. As a final step, please complete the following form:{% endblocktrans %} </p> diff --git a/aleksis/core/templates/socialaccount/snippets/provider_list.html b/aleksis/core/templates/socialaccount/snippets/provider_list.html index 9d9a9c87712076d8954ebce192ea2ac38383cc48..ea75c04fbd6d323308144e11a511a9e2fa7d4770 100644 --- a/aleksis/core/templates/socialaccount/snippets/provider_list.html +++ b/aleksis/core/templates/socialaccount/snippets/provider_list.html @@ -5,9 +5,9 @@ {% for provider in socialaccount_providers %} {% if provider.id == "openid" %} {% for brand in provider.get_brands %} - <a title="{{brand.name}}" + <a title="{{brand.name}}" class="socialaccount_provider {{provider.id}} {{brand.id}} - btn-large waves-effect waves-light primary-color" + btn-large waves-effect waves-light primary-color margin-bottom" href="{% provider_login_url provider.id openid=brand.openid_url process=process %}"> {% blocktrans with name=brand.name %} Login with {{ name }} @@ -16,7 +16,7 @@ {% endfor %} {% endif %} <a title="{{provider.name}}" class="socialaccount_provider {{provider.id}} - btn hundred-percent waves-effect waves-light primary-color" + btn hundred-percent waves-effect waves-light primary-color margin-bottom" href="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params %}"> {% blocktrans with name=provider.name %} Login with {{ name }} @@ -26,7 +26,7 @@ {% else %} <div class="alert primary"> <div> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% blocktrans %} No third-party account providers available. {% endblocktrans %} diff --git a/aleksis/core/templates/templated_email/email.css b/aleksis/core/templates/templated_email/email.css index 8cd112624c0c0b78f663027841895f4e07ce608b..465da3dd073bf681eb3146a077ea17d46f643fca 100644 --- a/aleksis/core/templates/templated_email/email.css +++ b/aleksis/core/templates/templated_email/email.css @@ -1,41 +1,45 @@ body { - line-height: 1.5; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - font-weight: normal; - color: rgba(0, 0, 0, 0.87); - display: flex; - justify-content: center; - align-items: center; + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-weight: normal; + color: rgba(0, 0, 0, 0.87); + display: flex; + justify-content: center; + align-items: center; } -table, tr { - width: 100%; +table, +tr { + width: 100%; } .main { - max-width: 700px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); - -webkit-transition: -webkit-box-shadow .25s; - transition: -webkit-box-shadow .25s; - transition: box-shadow .25s; - transition: box-shadow .25s, -webkit-box-shadow .25s; - border-radius: 2px; - background-color: #fff; - margin: 30px; - padding: 20px; + max-width: 700px; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); + -webkit-transition: -webkit-box-shadow 0.25s; + transition: -webkit-box-shadow 0.25s; + transition: box-shadow 0.25s; + transition: box-shadow 0.25s, -webkit-box-shadow 0.25s; + border-radius: 2px; + background-color: #fff; + margin: 30px; + padding: 20px; } .first th { - border-bottom: 1px solid; + border-bottom: 1px solid; } - -td, th { - padding-left: 5px; - padding-right: 5px; +td, +th { + padding-left: 5px; + padding-right: 5px; } .align-center { - text-align: center; + text-align: center; } diff --git a/aleksis/core/templates/two_factor/_wizard_actions.html b/aleksis/core/templates/two_factor/_wizard_actions.html index 95be950552fe6abf47e481bd507e6c28899986b0..dc4a046d6ce3ac4aa1a390b444f0080267a865d4 100644 --- a/aleksis/core/templates/two_factor/_wizard_actions.html +++ b/aleksis/core/templates/two_factor/_wizard_actions.html @@ -2,7 +2,7 @@ {% if cancel_url %} <a href="{{ cancel_url }}" class="btn red waves-effect waves-light"> - <i class="material-icons left">cancel</i> + <i class="material-icons iconify left" data-icon="mdi:close"></i> {% trans "Cancel" %} </a> {% endif %} @@ -11,17 +11,17 @@ <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}" class="btn grey waves-effect waves-light"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i> {% trans "Back" %} </button> {% else %} <button disabled name="" type="button" class="btn grey disabled"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i> {% trans "Back" %} </button> {% endif %} <button type="submit" class="btn green waves-effect waves-light"> - <i class="material-icons right">arrow_forward</i> + <i class="material-icons iconify right" data-icon="mdi:arrow-right"></i> {% trans "Next" %} </button> diff --git a/aleksis/core/templates/two_factor/core/backup_tokens.html b/aleksis/core/templates/two_factor/core/backup_tokens.html index b85450747fbe00623900af8d2832c0060446a042..94631e14d0bd993341bd51b3fdb493254fbb23e3 100644 --- a/aleksis/core/templates/two_factor/core/backup_tokens.html +++ b/aleksis/core/templates/two_factor/core/backup_tokens.html @@ -10,7 +10,7 @@ <div class="alert info"> <p> - <i class="material-icons left">info</i> + <i class="material-icons iconify left" data-icon="mdi:information-outline"></i> {% blocktrans %} Backup tokens can be used when your primary and backup phone numbers aren't available. The backup tokens below can be used @@ -29,7 +29,7 @@ </ul> <div class="alert warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% blocktrans %} Print these tokens and keep them somewhere safe. {% endblocktrans %} @@ -41,11 +41,11 @@ <form method="post">{% csrf_token %}{{ form }} <a href="{% url 'two_factor:profile' %}" class="btn primary waves-effect waves-light"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i> {% trans "Back to Account Security" %} </a> <button class="btn green waves-effect waves-light" type="submit"> - <i class="material-icons left">vpn_key</i> + <i class="material-icons iconify left" data-icon="mdi:key-outline"></i> {% trans "Generate Tokens" %} </button> </form> diff --git a/aleksis/core/templates/two_factor/core/login.html b/aleksis/core/templates/two_factor/core/login.html index 834c4b98b543bd994542b105aec1b99932f7d186..6145855229d9fec9f15edbd8ee597811250e2140 100644 --- a/aleksis/core/templates/two_factor/core/login.html +++ b/aleksis/core/templates/two_factor/core/login.html @@ -1,6 +1,6 @@ {# -*- engine:django -*- #} {% extends "two_factor/_base_focus.html" %} -{% load i18n two_factor account socialaccount %} +{% load i18n phonenumber account socialaccount %} {% block browser_title %} {% trans "Login" %} @@ -90,13 +90,13 @@ {% include "two_factor/_wizard_forms.html" %} </div> - <div class="card-action-light"> + <div class="card-action-light login-card-action"> <button type="submit" class="btn green waves-effect waves-light"> {% trans "Login" %} <i class="material-icons right">send</i> </button> - {% if request.site.preferences.auth__allow_password_change and wizard.steps.current == "auth" %} - <a href="{% url "account_reset_password" %}" class="btn-flat right waves-effect waves-light"> + {% if request.site.preferences.auth__allow_password_reset and wizard.steps.current == "auth" %} + <a href="{% url "account_reset_password" %}" class="btn-flat right waves-effect waves-red"> {% trans "Reset password" %} </a> {% endif %} @@ -111,7 +111,8 @@ <p>{% trans "Or, alternatively, use one of your backup phones:" %}</p> <p> {% for other in other_devices %} - <button name="challenge_device" value="{{ other.persistent_id }}" class="btn" type="submit"> + <button name="challenge_device" value="{{ other.persistent_id }}" class="btn margin-bottom" + type="submit"> {{ other|device_action }} </button> {% endfor %} diff --git a/aleksis/core/templates/two_factor/core/setup_complete.html b/aleksis/core/templates/two_factor/core/setup_complete.html index df3f5e93acb1ded3138b9aea2375ce7d529c9033..afd9f1722b168bfe30807f5e8a4d4cb49c4bc900 100644 --- a/aleksis/core/templates/two_factor/core/setup_complete.html +++ b/aleksis/core/templates/two_factor/core/setup_complete.html @@ -10,7 +10,7 @@ <div class="alert success"> <p> - <i class="material-icons left">check_circle</i> + <i class="material-icons iconify left" data-icon="mdi:check-circle-outline"></i> {% blocktrans %} Congratulations, you've successfully enabled two-factor authentication. {% endblocktrans %} @@ -20,17 +20,17 @@ {% if not phone_methods %} <a href="{% url 'two_factor:profile' %}" class="btn btn-primary waves-effect waves-light"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i> {% trans "Back to Profile" %} </a> <a href="{% url 'two_factor:backup_tokens' %}" class="btn green waves-effect waves-light"> - <i class="material-icons left">vpn_key</i> + <i class="material-icons iconify left" data-icon="mdi:key-outline"></i> {% trans "Generate backup codes" %} </a> {% else %} <div class="warning"> <p> - <i class="material-icons left">warning</i> + <i class="material-icons iconify left" data-icon="mdi:alert-outline"></i> {% blocktrans %} However, it might happen that you don't have access to your primary token device. To enable account recovery, generate backup codes @@ -40,15 +40,15 @@ </div> <a href="{% url 'two_factor:profile' %}" class="btn btn-primary waves-effect waves-light"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons iconify left" data-icon="mdi:arrow-left"></i> {% trans "Back to Profile" %} </a> <a href="{% url 'two_factor:backup_tokens' %}" class="btn green waves-effect waves-light"> - <i class="material-icons left">vpn_key</i> + <i class="material-icons iconify left" data-icon="mdi:key-outline"></i> {% trans "Generate backup codes" %} </a> <a href="{% url 'two_factor:phone_create' %}" class="btn green waves-effect waves-light"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:phone-plus"></i> {% trans "Add Phone Number" %} </a> {% endif %} diff --git a/aleksis/core/templates/two_factor/profile/disable.html b/aleksis/core/templates/two_factor/profile/disable.html index 56bf20164b16b75a2b1d7e0759c9d43ba8d5b242..4fe45187e3bbb9ae4ffadb5807f0d26a8bafff9a 100644 --- a/aleksis/core/templates/two_factor/profile/disable.html +++ b/aleksis/core/templates/two_factor/profile/disable.html @@ -22,7 +22,7 @@ </p> <button class="btn red waves-effect waves-light" type="submit"> - <i class="material-icons left">power_settings_new</i> + <i class="material-icons iconify left" data-icon="mdi:power"></i> {% trans "Disable" %} </button> </form> diff --git a/aleksis/core/templates/two_factor/profile/profile.html b/aleksis/core/templates/two_factor/profile/profile.html index eaaa0ff6a5a1bde9463682100dfb9cc6f6b0f3dc..fe96135d0dfae6fd16ffad4fece50148115c8b69 100644 --- a/aleksis/core/templates/two_factor/profile/profile.html +++ b/aleksis/core/templates/two_factor/profile/profile.html @@ -1,5 +1,5 @@ {% extends "two_factor/_base_focus.html" %} -{% load i18n two_factor %} +{% load i18n phonenumber %} {% block browser_title %} {% trans "Account Security" %} @@ -37,7 +37,7 @@ </ul> <p> <a href="{% url 'two_factor:phone_create' %}" class="btn green waves-effect waves-light"> - <i class="material-icons left">add</i> + <i class="material-icons iconify left" data-icon="mdi:phone-plus"></i> {% trans "Add Phone Number" %} </a> </p> @@ -55,7 +55,7 @@ </p> <p> <a href="{% url 'two_factor:backup_tokens' %}" class="btn primary waves-effect waves-light"> - <i class="material-icons left">vpn_key</i> + <i class="material-icons iconify left" data-icon="mdi:key-outline"></i> {% trans "Show Codes" %} </a> </p> @@ -69,7 +69,7 @@ </p> <p> <a class="btn red waves-effect waves-light" href="{% url 'two_factor:disable' %}"> - <i class="material-icons left">power_settings_new</i> + <i class="material-icons iconify left" data-icon="mdi:power"></i> {% trans "Disable Two-Factor Authentication" %} </a> </p> @@ -84,6 +84,7 @@ <p> <a href="{% url 'two_factor:setup' %}" class="green btn waves-effect waves-light "> + <i class="material-icons iconify left" data-icon="mdi:key-outline"></i> {% trans "Enable Two-Factor Authentication" %} </a> </p> diff --git a/aleksis/core/templatetags/data_helpers.py b/aleksis/core/templatetags/data_helpers.py index 5e263ba370bb732a80cb9d6c5d64880842ff5bb5..ab2309f260dd6b039cc722bae86fa71637967a1f 100644 --- a/aleksis/core/templatetags/data_helpers.py +++ b/aleksis/core/templatetags/data_helpers.py @@ -51,14 +51,3 @@ def parse_json(value: Optional[str] = None) -> Union[dict, None]: if not value: return None return json.loads(value) - - -@register.simple_tag(takes_context=True) -def build_badge(context: dict, item: dict) -> Any: - """Get menu badge content from django-menu-generator dict.""" - request = context["request"] - badge = item.get("badge") - if callable(badge): - return badge(request) - else: - return badge diff --git a/aleksis/core/templatetags/html_helpers.py b/aleksis/core/templatetags/html_helpers.py index 5f78b1b195f9030cc97d96a0488c14845d450741..8ca5be151d2edc39bf6787e9e51eabb3350714a0 100644 --- a/aleksis/core/templatetags/html_helpers.py +++ b/aleksis/core/templatetags/html_helpers.py @@ -1,4 +1,8 @@ +import random +import string + from django import template +from django.shortcuts import reverse from bs4 import BeautifulSoup @@ -22,3 +26,24 @@ def add_class_to_el(value: str, arg: str) -> str: el["class"] = el.get("class", []) + [cls] return str(soup) + + +@register.simple_tag +def generate_random_id(prefix: str, length: int = 10) -> str: + """Generate a random ID for templates. + + :Example: + + .. code-block:: + + {% generate_random_id "prefix-" %} + """ + return prefix + "".join( + random.choice(string.ascii_lowercase) for i in range(length) # noqa: S311 + ) + + +@register.simple_tag(takes_context=True) +def absolute_url(context, view_name, *args, **kwargs): + request = context["request"] + return request.build_absolute_uri(reverse(view_name, args=args, kwargs=kwargs)) diff --git a/aleksis/core/tests/browser/test_selenium.py b/aleksis/core/tests/browser/test_selenium.py index e14ad8b9f123cd612848af566790d7e649d47bcc..e35fc5bd59eb83527c1efc3649a3109b894ebd05 100644 --- a/aleksis/core/tests/browser/test_selenium.py +++ b/aleksis/core/tests/browser/test_selenium.py @@ -7,6 +7,8 @@ from django.test.selenium import SeleniumTestCase, SeleniumTestCaseBase from django.urls import reverse import pytest +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from aleksis.core.models import Person @@ -43,17 +45,25 @@ class SeleniumTests(SeleniumTestCase): self._screenshot("login_default_superuser_blank.png") # Find login form input fields and enter defined credentials - self.selenium.find_element_by_xpath( - '//label[contains(text(), "Username")]/../input' + WebDriverWait(self.selenium, 10).until( + EC.element_to_be_clickable( + (By.XPATH, '//label[contains(text(), "Username")]/../input'), + ) ).send_keys(username) - self.selenium.find_element_by_xpath( - '//label[contains(text(), "Password")]/../input' + WebDriverWait(self.selenium, 10).until( + EC.element_to_be_clickable( + (By.XPATH, '//label[contains(text(), "Password")]/../input'), + ) ).send_keys(password) if with_screenshots: self._screenshot("login_default_superuser_filled.png") # Submit form by clicking django-two-factor-auth's Next button - self.selenium.find_element_by_xpath('//button[contains(text(), "Login")]').click() + WebDriverWait(self.selenium, 10).until( + EC.element_to_be_clickable( + (By.XPATH, '//button[contains(text(), "Login")]'), + ) + ).click() if with_screenshots: self._screenshot("login_default_superuser_submitted.png") @@ -73,9 +83,11 @@ class SeleniumTests(SeleniumTestCase): # Should redirect away from login page and not put up an alert about wrong credentials assert "Please enter a correct username and password." not in self.selenium.page_source - def test_pdf_generation(self): - self._login() - self._create_person() - self.selenium.get(self.live_server_url + reverse("test_pdf")) - el = WebDriverWait(self.selenium, 20).until(lambda d: ".pdf" in self.selenium.current_url) - self._screenshot("pdf.png") + # Deactivated for now as Selenium test infrastructure needs a complete rethinking + # because of the new Vue frontend + # def test_pdf_generation(self): + # self._login() + # self._create_person() + # self.selenium.get(self.live_server_url + reverse("test_pdf")) + # el = WebDriverWait(self.selenium, 20).until(lambda d: ".pdf" in self.selenium.current_url) + # self._screenshot("pdf.png") diff --git a/aleksis/core/tests/models/test_notification.py b/aleksis/core/tests/models/test_notification.py index 1b1a6df054fe24f06bd363e825df3f1259af53e8..d262df91ce68c1a21fa0e0783941087161b08f4a 100644 --- a/aleksis/core/tests/models/test_notification.py +++ b/aleksis/core/tests/models/test_notification.py @@ -1,11 +1,85 @@ +from datetime import timedelta +from time import sleep +from unittest.mock import patch + +from django.test import override_settings +from django.utils import timezone + import pytest +from freezegun import freeze_time from aleksis.core.models import Notification, Person +from aleksis.core.util.notifications import _send_due_notifications pytestmark = pytest.mark.django_db -def test_email_notification(mailoutbox): +def test_send_notification(): + email = "doe@example.com" + recipient = Person.objects.create(first_name="Jane", last_name="Doe", email=email) + + sender = "Foo" + title = "There is happened something." + description = "Here you get some more information." + link = "https://aleksis.org/" + icon = "account-outline" + + notification = Notification( + sender=sender, + recipient=recipient, + title=title, + description=description, + link=link, + icon=icon, + ) + + with patch("aleksis.core.models.Notification.send") as patched_send: + patched_send.assert_not_called() + + notification.save() + + patched_send.assert_called() + + +def test_send_scheduled_notification(): + email = "doe@example.com" + recipient = Person.objects.create(first_name="Jane", last_name="Doe", email=email) + + sender = "Foo" + title = "There is happened something." + description = "Here you get some more information." + link = "https://aleksis.org/" + icon = "clock-outline" + + notification = Notification( + sender=sender, + recipient=recipient, + title=title, + description=description, + link=link, + send_at=timezone.now() + timedelta(days=1), + icon=icon, + ) + notification.save() + + with patch("aleksis.core.models.Notification.send") as patched_send: + patched_send.assert_not_called() + + _send_due_notifications() + + patched_send.assert_not_called() + + with freeze_time(timezone.now() + timedelta(days=1)): + _send_due_notifications() + + patched_send.assert_called() + + +@override_settings(CELERY_BROKER_URL="memory://localhost//") +@pytest.mark.django_db( + databases=["default", "default_oot"], serialized_rollback=True, transaction=True +) +def test_email_notification(mailoutbox, celery_worker): email = "doe@example.com" recipient = Person.objects.create(first_name="Jane", last_name="Doe", email=email) @@ -19,6 +93,9 @@ def test_email_notification(mailoutbox): ) notification.save() + sleep(3) + + notification.refresh_from_db() assert notification.sent assert len(mailoutbox) == 1 diff --git a/aleksis/core/tests/regression/test_regression.py b/aleksis/core/tests/regression/test_regression.py index b9d33e6981312817324b92d4fe67176b96763cda..d1a3446379f77fc4cbefb62e11bf7bbc6d840e60 100644 --- a/aleksis/core/tests/regression/test_regression.py +++ b/aleksis/core/tests/regression/test_regression.py @@ -1,10 +1,16 @@ +import base64 + from django.contrib.auth import get_user_model import pytest -from aleksis.core.models import Group, Person +from aleksis.core.models import Group, OAuthApplication, Person pytestmark = pytest.mark.django_db +from django.http import HttpResponse +from django.test import override_settings +from django.urls import path, reverse +from django.views.generic import View def test_all_settigns_registered(): @@ -82,3 +88,78 @@ def test_reassign_user_to_person(): assert user2.groups.count() == 1 assert user1.groups.first().name == "Group 2" assert user2.groups.first().name == "Group 1" + + +@override_settings(ROOT_URLCONF="aleksis.core.tests.regression.view_oauth") +def test_no_access_oauth2_client_credentials_without_allowed_scopes(client): + """Tests that ClientProtectedResourceMixin doesn't allow access if no allowed scopes are set. + + https://edugit.org/AlekSIS/official/AlekSIS-Core/-/issues/688 + """ + + wrong_application = OAuthApplication( + name="Test Application", + allowed_scopes=[], + authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS, + client_type=OAuthApplication.CLIENT_CONFIDENTIAL, + redirect_uris=["http://localhost:8000/"], + ) + wrong_application_secret = wrong_application.client_secret + wrong_application.save() + wrong_application_2 = OAuthApplication( + name="Test Application", + allowed_scopes=["read"], + authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS, + client_type=OAuthApplication.CLIENT_CONFIDENTIAL, + redirect_uris=["http://localhost:8000/"], + ) + wrong_application_2_secret = wrong_application_2.client_secret + wrong_application_2.save() + correct_application = OAuthApplication( + name="Test Application", + allowed_scopes=["write"], + authorization_grant_type=OAuthApplication.GRANT_CLIENT_CREDENTIALS, + client_type=OAuthApplication.CLIENT_CONFIDENTIAL, + redirect_uris=["http://localhost:8000/"], + ) + correct_application_secret = correct_application.client_secret + correct_application.save() + + url = reverse("client_protected_resource_mixin_test") + auth_header = ( + "Basic " + + base64.b64encode( + f"{wrong_application.client_id}:{wrong_application_secret}".encode() + ).decode() + ) + r = client.get(url, HTTP_AUTHORIZATION=auth_header) + assert r.status_code == 403 + + auth_header = ( + "Basic " + + base64.b64encode( + f"{wrong_application_2.client_id}:{wrong_application_2_secret}".encode() + ).decode() + ) + r = client.get(url, HTTP_AUTHORIZATION=auth_header) + assert r.status_code == 403 + + auth_header = ( + "Basic " + + base64.b64encode( + f"{correct_application.client_id}:{correct_application_secret}".encode() + ).decode() + ) + r = client.get(url, HTTP_AUTHORIZATION=auth_header) + assert r.status_code == 200 + + +def test_change_password_not_logged_in(client): + """Tests that CustomPasswordChangeView redirects to login when accessed unauthenticated. + + https://edugit.org/AlekSIS/official/AlekSIS-Core/-/issues/703 + """ + response = client.get(reverse("account_change_password"), follow=True) + + assert response.status_code == 200 + assert "Please login to see this page." in response.content.decode("utf-8") diff --git a/aleksis/core/tests/regression/view_oauth.py b/aleksis/core/tests/regression/view_oauth.py new file mode 100644 index 0000000000000000000000000000000000000000..d5671208e127e79c30d7bb179bbf2e82a35616fb --- /dev/null +++ b/aleksis/core/tests/regression/view_oauth.py @@ -0,0 +1,24 @@ +from django.http import HttpResponse +from django.test import override_settings +from django.urls import path, reverse +from django.views.generic import View + +from oauth2_provider.views.mixins import ScopedResourceMixin + +from aleksis.core.util.auth_helpers import ClientProtectedResourceMixin + + +class TestViewClientProtectedResourceMixin(ScopedResourceMixin, ClientProtectedResourceMixin, View): + required_scopes = ["write"] + + def get(self, request): + return HttpResponse("OK") + + +urlpatterns = [ + path( + "client_protected_resource_mixin_test/", + TestViewClientProtectedResourceMixin.as_view(), + name="client_protected_resource_mixin_test", + ), +] diff --git a/aleksis/core/tests/views/test_account.py b/aleksis/core/tests/views/test_account.py index ae598ab72826d403e94531ef2bf7194b4ee5225c..fa55e8465bfa50b2a12479f6c72ee747cd1f2ef6 100644 --- a/aleksis/core/tests/views/test_account.py +++ b/aleksis/core/tests/views/test_account.py @@ -20,25 +20,12 @@ LDAP_SETTINGS = { def test_index_not_logged_in(client): - response = client.get("/") + response = client.get("/django/") assert response.status_code == 302 assert response["Location"].startswith(reverse(settings.LOGIN_URL)) -def test_login_without_person(client, django_user_model): - username = "foo" - password = "bar" - - django_user_model.objects.create_user(username=username, password=password) - client.login(username=username, password=password) - - response = client.get("/", follow=True) - - assert response.status_code == 200 - assert "Your user account is not linked to a person." in response.content.decode("utf-8") - - def test_logout(client, django_user_model): username = "foo" password = "bar" @@ -46,7 +33,7 @@ def test_logout(client, django_user_model): django_user_model.objects.create_user(username=username, password=password) client.login(username=username, password=password) - response = client.get("/", follow=True) + response = client.get("/django/", follow=True) assert response.status_code == 200 response = client.get(reverse("logout"), follow=True) diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index c91bae7f29c978d30e96361f92213eec7c5679d1..035fe1610a41c842e4a516a6d40aaa492dde474c 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -2,13 +2,14 @@ from django.apps import apps from django.conf import settings from django.contrib import admin from django.contrib.auth import views as auth_views -from django.urls import include, path +from django.urls import include, path, re_path +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import TemplateView from django.views.i18n import JavaScriptCatalog import calendarweek.django -import debug_toolbar from ckeditor_uploader import views as ckeditor_uploader_views -from django_js_reverse.views import urls_js +from graphene_django.views import GraphQLView from health_check.urls import urlpatterns as health_urls from oauth2_provider.views import ConnectDiscoveryInfoView from rules.contrib.views import permission_required @@ -17,304 +18,374 @@ from two_factor.urls import urlpatterns as tf_urls from . import views urlpatterns = [ - path("", include("django_prometheus.urls")), - path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")), + path("", TemplateView.as_view(template_name="core/vue_index.html"), name="vue_app"), path("manifest.json", views.ManifestView.as_view(), name="manifest"), - path("serviceworker.js", views.ServiceWorkerView.as_view(), name="service_worker"), - path("offline/", views.OfflineView.as_view(), name="offline"), - path("about/", views.about, name="about_aleksis"), - path("accounts/signup/", views.AccountRegisterView.as_view(), name="account_signup"), - path("accounts/logout/", auth_views.LogoutView.as_view(), name="logout"), - path( - "accounts/password/change/", - views.CustomPasswordChangeView.as_view(), - name="account_change_password", - ), - path("accounts/", include("allauth.urls")), - path("invitations/send-invite", views.InvitePerson.as_view(), name="invite_person"), - path( - "invitations/code/enter", views.EnterInvitationCode.as_view(), name="enter_invitation_code" - ), - path( - "invitations/code/generate", - views.GenerateInvitationCode.as_view(), - name="generate_invitation_code", - ), - path("invitations/disabled", views.InviteDisabledView.as_view(), name="invite_disabled"), - path("invitations/", include("invitations.urls")), - path( - "accounts/social/connections/<int:pk>/delete", - views.SocialAccountDeleteView.as_view(), - name="delete_social_account_by_pk", + path("sw.js", views.ServiceWorkerView.as_view(), name="service_worker"), + path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")), + path("__icons__/", include("dj_iconify.urls")), + path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True)), name="graphql"), + path("logo", views.LogoView.as_view(), name="logo"), + path( + "django/", + include( + [ + path("", include("django_prometheus.urls")), + path("account/login/", views.LoginView.as_view(), name="login"), + path( + "accounts/signup/", views.AccountRegisterView.as_view(), name="account_signup" + ), + path("accounts/logout/", auth_views.LogoutView.as_view(), name="logout"), + path( + "accounts/password/change/", + views.CustomPasswordChangeView.as_view(), + name="account_change_password", + ), + path( + "accounts/password/reset/", + views.CustomPasswordResetView.as_view(), + name="account_reset_password", + ), + path("accounts/", include("allauth.urls")), + path( + "accounts/social/connections/<int:pk>/delete/", + views.SocialAccountDeleteView.as_view(), + name="delete_social_account_by_pk", + ), + path("vue_dummy/", views.vue_dummy, name="vue_dummy"), + path("offline/", views.OfflineView.as_view(), name="offline"), + path( + "invitations/send-invite/", views.InvitePerson.as_view(), name="invite_person" + ), + path( + "invitations/code/enter/", + views.EnterInvitationCode.as_view(), + name="enter_invitation_code", + ), + path( + "invitations/code/generate/", + views.GenerateInvitationCode.as_view(), + name="generate_invitation_code", + ), + path( + "invitations/disabled/", + views.InviteDisabledView.as_view(), + name="invite_disabled", + ), + path("invitations/", include("invitations.urls")), + path("status/", views.SystemStatus.as_view(), name="system_status"), + path("", include(tf_urls)), + path("school_terms/", views.SchoolTermListView.as_view(), name="school_terms"), + path( + "school_terms/create/", + views.SchoolTermCreateView.as_view(), + name="create_school_term", + ), + path( + "school_terms/<int:pk>/", + views.SchoolTermEditView.as_view(), + name="edit_school_term", + ), + path("persons/", views.persons, name="persons"), + path( + "person/", TemplateView.as_view(template_name="core/empty.html"), name="person" + ), + path("persons/create/", views.CreatePersonView.as_view(), name="create_person"), + path( + "persons/<int:id_>/", + TemplateView.as_view(template_name="core/empty.html"), + name="person_by_id", + ), + path( + "persons/<int:pk>/edit/", + views.EditPersonView.as_view(), + name="edit_person_by_id", + ), + path("persons/<int:id_>/delete/", views.delete_person, name="delete_person_by_id"), + path( + "persons/<int:pk>/invite/", + views.InvitePersonByID.as_view(), + name="invite_person_by_id", + ), + path("groups/", views.groups, name="groups"), + path( + "groups/additional_fields/", views.additional_fields, name="additional_fields" + ), + path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"), + path( + "groups/additional_fields/<int:id_>/edit/", + views.edit_additional_field, + name="edit_additional_field_by_id", + ), + path( + "groups/additional_fields/create/", + views.edit_additional_field, + name="create_additional_field", + ), + path( + "groups/additional_fields/<int:id_>/delete/", + views.delete_additional_field, + name="delete_additional_field_by_id", + ), + path("groups/create/", views.edit_group, name="create_group"), + path("groups/<int:id_>/", views.group, name="group_by_id"), + path("groups/<int:id_>/edit/", views.edit_group, name="edit_group_by_id"), + path("groups/<int:id_>/delete/", views.delete_group, name="delete_group_by_id"), + path("", views.index, name="index"), + path("dashboard/edit/", views.EditDashboardView.as_view(), name="edit_dashboard"), + path("groups/group_types/create", views.edit_group_type, name="create_group_type"), + path( + "groups/group_types/<int:id_>/delete/", + views.delete_group_type, + name="delete_group_type_by_id", + ), + path( + "groups/group_types/<int:id_>/edit/", + views.edit_group_type, + name="edit_group_type_by_id", + ), + path("groups/group_types/", views.group_types, name="group_types"), + path("announcements/", views.announcements, name="announcements"), + path("announcements/create/", views.announcement_form, name="add_announcement"), + path( + "announcements/edit/<int:id_>/", + views.announcement_form, + name="edit_announcement", + ), + path( + "announcements/delete/<int:id_>/", + views.delete_announcement, + name="delete_announcement", + ), + path("search/searchbar/", views.searchbar_snippets, name="searchbar_snippets"), + path("search/", views.PermissionSearchView.as_view(), name="haystack_search"), + path("maintenance-mode/", include("maintenance_mode.urls")), + path("impersonate/", include("impersonate.urls")), + path( + ".well-known/openid-configuration/", + ConnectDiscoveryInfoView.as_view(), + name="oidc_configuration", + ), + path( + "oauth/applications/", + views.OAuth2ListView.as_view(), + name="oauth2_applications", + ), + path( + "oauth/applications/register/", + views.OAuth2RegisterView.as_view(), + name="register_oauth_application", + ), + path( + "oauth/applications/<int:pk>/", + views.OAuth2DetailView.as_view(), + name="oauth2_application", + ), + path( + "oauth/applications/<int:pk>/delete/", + views.OAuth2DeleteView.as_view(), + name="delete_oauth2_application", + ), + path( + "oauth/applications/<int:pk>/edit/", + views.OAuth2EditView.as_view(), + name="edit_oauth2_application", + ), + path( + "oauth/authorize/", + views.CustomAuthorizationView.as_view(), + name="oauth2_provider:authorize", + ), + path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")), + path("__i18n__/", include("django.conf.urls.i18n")), + path( + "ckeditor/upload/", + permission_required("core.ckeditor_upload_files_rule")( + ckeditor_uploader_views.upload + ), + name="ckeditor_upload", + ), + path( + "ckeditor/browse/", + permission_required("core.ckeditor_upload_files_rule")( + ckeditor_uploader_views.browse + ), + name="ckeditor_browse", + ), + path("select2/", include("django_select2.urls")), + path( + "calendarweek_i18n.js", calendarweek.django.i18n_js, name="calendarweek_i18n_js" + ), + path("gettext.js", JavaScriptCatalog.as_view(), name="javascript-catalog"), + path( + "preferences/site/", + views.preferences, + {"registry_name": "site"}, + name="preferences_site", + ), + path( + "preferences/person/", + views.preferences, + {"registry_name": "person"}, + name="preferences_person", + ), + path( + "preferences/group/", + views.preferences, + {"registry_name": "group"}, + name="preferences_group", + ), + path( + "preferences/site/<int:pk>/", + views.preferences, + {"registry_name": "site"}, + name="preferences_site", + ), + path( + "preferences/person/<int:pk>/", + views.preferences, + {"registry_name": "person"}, + name="preferences_person", + ), + path( + "preferences/group/<int:pk>/", + views.preferences, + {"registry_name": "group"}, + name="preferences_group", + ), + path( + "preferences/site/<int:pk>/<str:section>/", + views.preferences, + {"registry_name": "site"}, + name="preferences_site", + ), + path( + "preferences/person/<int:pk>/<str:section>/", + views.preferences, + {"registry_name": "person"}, + name="preferences_person", + ), + path( + "preferences/group/<int:pk>/<str:section>/", + views.preferences, + {"registry_name": "group"}, + name="preferences_group", + ), + path( + "preferences/site/<str:section>/", + views.preferences, + {"registry_name": "site"}, + name="preferences_site", + ), + path( + "preferences/person/<str:section>/", + views.preferences, + {"registry_name": "person"}, + name="preferences_person", + ), + path( + "preferences/group/<str:section>/", + views.preferences, + {"registry_name": "group"}, + name="preferences_group", + ), + path("health/", include(health_urls)), + path("health/pdf/", views.TestPDFGenerationView.as_view(), name="test_pdf"), + path( + "data_checks/", + views.DataCheckView.as_view(), + name="check_data", + ), + path( + "data_checks/run/", + views.RunDataChecks.as_view(), + name="data_check_run", + ), + path( + "data_checks/<int:pk>/<str:solve_option>/", + views.SolveDataCheckView.as_view(), + name="data_check_solve", + ), + path( + "dashboard_widgets/", + views.DashboardWidgetListView.as_view(), + name="dashboard_widgets", + ), + path( + "dashboard_widgets/<int:pk>/edit/", + views.DashboardWidgetEditView.as_view(), + name="edit_dashboard_widget", + ), + path( + "dashboard_widgets/<int:pk>/delete/", + views.DashboardWidgetDeleteView.as_view(), + name="delete_dashboard_widget", + ), + path( + "dashboard_widgets/<str:app>/<str:model>/new/", + views.DashboardWidgetCreateView.as_view(), + name="create_dashboard_widget", + ), + path( + "dashboard_widgets/default/", + views.EditDashboardView.as_view(), + {"default": True}, + name="edit_default_dashboard", + ), + path( + "permissions/global/user/", + views.UserGlobalPermissionsListBaseView.as_view(), + name="manage_user_global_permissions", + ), + path( + "permissions/global/group/", + views.GroupGlobalPermissionsListBaseView.as_view(), + name="manage_group_global_permissions", + ), + path( + "permissions/object/user/", + views.UserObjectPermissionsListBaseView.as_view(), + name="manage_user_object_permissions", + ), + path( + "permissions/object/group/", + views.GroupObjectPermissionsListBaseView.as_view(), + name="manage_group_object_permissions", + ), + path( + "permissions/global/user/<int:pk>/delete/", + views.UserGlobalPermissionDeleteView.as_view(), + name="delete_user_global_permission", + ), + path( + "permissions/global/group/<int:pk>/delete/", + views.GroupGlobalPermissionDeleteView.as_view(), + name="delete_group_global_permission", + ), + path( + "permissions/object/user/<int:pk>/delete/", + views.UserObjectPermissionDeleteView.as_view(), + name="delete_user_object_permission", + ), + path( + "permissions/object/group/<int:pk>/delete/", + views.GroupObjectPermissionDeleteView.as_view(), + name="delete_group_object_permission", + ), + path( + "permissions/assign/", + views.SelectPermissionForAssignView.as_view(), + name="select_permission_for_assign", + ), + path( + "permissions/<int:pk>/assign/", + views.AssignPermissionView.as_view(), + name="assign_permission", + ), + ] + ), ), path("admin/", admin.site.urls), path("admin/uwsgi/", include("django_uwsgi.urls")), - path("data_management/", views.data_management, name="data_management"), - path("status/", views.SystemStatus.as_view(), name="system_status"), - path("account/login/", views.LoginView.as_view(), name="login"), - path("", include(tf_urls)), - path("celery_progress/<str:task_id>/", views.CeleryProgressView.as_view(), name="task_status"), - path("accounts/logout/", auth_views.LogoutView.as_view(), name="logout"), - path("school_terms/", views.SchoolTermListView.as_view(), name="school_terms"), - path("school_terms/create/", views.SchoolTermCreateView.as_view(), name="create_school_term"), - path("school_terms/<int:pk>/", views.SchoolTermEditView.as_view(), name="edit_school_term"), - path("persons", views.persons, name="persons"), - path("person/", views.person, name="person"), - path("person/create/", views.CreatePersonView.as_view(), name="create_person"), - path("person/<int:id_>/", views.person, name="person_by_id"), - path("person/<int:pk>/edit/", views.EditPersonView.as_view(), name="edit_person_by_id"), - path("person/<int:id_>/delete/", views.delete_person, name="delete_person_by_id"), - path("person/<int:pk>/invite/", views.InvitePersonByID.as_view(), name="invite_person_by_id"), - path("groups", views.groups, name="groups"), - path("groups/additional_fields", views.additional_fields, name="additional_fields"), - path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"), - path( - "groups/additional_field/<int:id_>/edit", - views.edit_additional_field, - name="edit_additional_field_by_id", - ), - path( - "groups/additional_field/create", - views.edit_additional_field, - name="create_additional_field", - ), - path( - "groups/additional_field/<int:id_>/delete", - views.delete_additional_field, - name="delete_additional_field_by_id", - ), - path("group/create", views.edit_group, name="create_group"), - path("group/<int:id_>", views.group, name="group_by_id"), - path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"), - path("group/<int:id_>/delete", views.delete_group, name="delete_group_by_id"), - path("", views.index, name="index"), - path("notifications/", views.NotificationsListView.as_view(), name="notifications"), - path("dashboard/edit/", views.EditDashboardView.as_view(), name="edit_dashboard"), - path( - "notifications/mark-read/<int:id_>", - views.notification_mark_read, - name="notification_mark_read", - ), - path("groups/group_type/create", views.edit_group_type, name="create_group_type"), - path( - "groups/group_type/<int:id_>/delete", - views.delete_group_type, - name="delete_group_type_by_id", - ), - path("groups/group_type/<int:id_>/edit", views.edit_group_type, name="edit_group_type_by_id"), - path("groups/group_types", views.group_types, name="group_types"), - path("announcements/", views.announcements, name="announcements"), - path("announcement/create/", views.announcement_form, name="add_announcement"), - path("announcement/edit/<int:id_>/", views.announcement_form, name="edit_announcement"), - path("announcement/delete/<int:id_>/", views.delete_announcement, name="delete_announcement"), - path("search/searchbar/", views.searchbar_snippets, name="searchbar_snippets"), - path("search/", views.PermissionSearchView.as_view(), name="haystack_search"), - path("maintenance-mode/", include("maintenance_mode.urls")), - path("impersonate/", include("impersonate.urls")), - path( - ".well-known/openid-configuration", - ConnectDiscoveryInfoView.as_view(), - name="oidc_configuration", - ), - path("oauth/applications/", views.OAuth2ListView.as_view(), name="oauth2_applications"), - path( - "oauth/applications/register/", - views.OAuth2RegisterView.as_view(), - name="register_oauth_application", - ), - path( - "oauth/applications/<int:pk>/", views.OAuth2DetailView.as_view(), name="oauth2_application" - ), - path( - "oauth/applications/<int:pk>/delete/", - views.OAuth2DeleteView.as_view(), - name="delete_oauth2_application", - ), - path( - "oauth/applications/<int:pk>/edit/", - views.OAuth2EditView.as_view(), - name="edit_oauth2_application", - ), - path( - "oauth/authorize/", - views.CustomAuthorizationView.as_view(), - name="oauth2_provider:authorize", - ), - path("oauth/", include("oauth2_provider.urls", namespace="oauth2_provider")), - path("__i18n__/", include("django.conf.urls.i18n")), - path( - "ckeditor/upload/", - permission_required("core.ckeditor_upload_files_rule")(ckeditor_uploader_views.upload), - name="ckeditor_upload", - ), - path( - "ckeditor/browse/", - permission_required("core.ckeditor_upload_files_rule")(ckeditor_uploader_views.browse), - name="ckeditor_browse", - ), - path("select2/", include("django_select2.urls")), - path("jsreverse.js", urls_js, name="js_reverse"), - path("calendarweek_i18n.js", calendarweek.django.i18n_js, name="calendarweek_i18n_js"), - path("gettext.js", JavaScriptCatalog.as_view(), name="javascript-catalog"), - path( - "preferences/site/", views.preferences, {"registry_name": "site"}, name="preferences_site" - ), - path( - "preferences/person/", - views.preferences, - {"registry_name": "person"}, - name="preferences_person", - ), - path( - "preferences/group/", - views.preferences, - {"registry_name": "group"}, - name="preferences_group", - ), - path( - "preferences/site/<int:pk>/", - views.preferences, - {"registry_name": "site"}, - name="preferences_site", - ), - path( - "preferences/person/<int:pk>/", - views.preferences, - {"registry_name": "person"}, - name="preferences_person", - ), - path( - "preferences/group/<int:pk>/", - views.preferences, - {"registry_name": "group"}, - name="preferences_group", - ), - path( - "preferences/site/<int:pk>/<str:section>/", - views.preferences, - {"registry_name": "site"}, - name="preferences_site", - ), - path( - "preferences/person/<int:pk>/<str:section>/", - views.preferences, - {"registry_name": "person"}, - name="preferences_person", - ), - path( - "preferences/group/<int:pk>/<str:section>/", - views.preferences, - {"registry_name": "group"}, - name="preferences_group", - ), - path( - "preferences/site/<str:section>/", - views.preferences, - {"registry_name": "site"}, - name="preferences_site", - ), - path( - "preferences/person/<str:section>/", - views.preferences, - {"registry_name": "person"}, - name="preferences_person", - ), - path( - "preferences/group/<str:section>/", - views.preferences, - {"registry_name": "group"}, - name="preferences_group", - ), - path("health/", include(health_urls)), - path("health/pdf/", views.TestPDFGenerationView.as_view(), name="test_pdf"), - path( - "data_check/", - views.DataCheckView.as_view(), - name="check_data", - ), - path( - "data_check/run/", - views.RunDataChecks.as_view(), - name="data_check_run", - ), - path( - "data_check/<int:pk>/<str:solve_option>/", - views.SolveDataCheckView.as_view(), - name="data_check_solve", - ), - path("dashboard_widgets/", views.DashboardWidgetListView.as_view(), name="dashboard_widgets"), - path( - "dashboard_widgets/<int:pk>/edit/", - views.DashboardWidgetEditView.as_view(), - name="edit_dashboard_widget", - ), - path( - "dashboard_widgets/<int:pk>/delete/", - views.DashboardWidgetDeleteView.as_view(), - name="delete_dashboard_widget", - ), - path( - "dashboard_widgets/<str:app>/<str:model>/new/", - views.DashboardWidgetCreateView.as_view(), - name="create_dashboard_widget", - ), - path( - "dashboard_widgets/default/", - views.EditDashboardView.as_view(), - {"default": True}, - name="edit_default_dashboard", - ), - path( - "permissions/global/user/", - views.UserGlobalPermissionsListBaseView.as_view(), - name="manage_user_global_permissions", - ), - path( - "permissions/global/group/", - views.GroupGlobalPermissionsListBaseView.as_view(), - name="manage_group_global_permissions", - ), - path( - "permissions/object/user/", - views.UserObjectPermissionsListBaseView.as_view(), - name="manage_user_object_permissions", - ), - path( - "permissions/object/group/", - views.GroupObjectPermissionsListBaseView.as_view(), - name="manage_group_object_permissions", - ), - path( - "permissions/global/user/<int:pk>/delete/", - views.UserGlobalPermissionDeleteView.as_view(), - name="delete_user_global_permission", - ), - path( - "permissions/global/group/<int:pk>/delete/", - views.GroupGlobalPermissionDeleteView.as_view(), - name="delete_group_global_permission", - ), - path( - "permissions/object/user/<int:pk>/delete/", - views.UserObjectPermissionDeleteView.as_view(), - name="delete_user_object_permission", - ), - path( - "permissions/object/group/<int:pk>/delete/", - views.GroupObjectPermissionDeleteView.as_view(), - name="delete_group_object_permission", - ), - path( - "permissions/assign/", - views.SelectPermissionForAssignView.as_view(), - name="select_permission_for_assign", - ), - path( - "permissions/<int:pk>/assign/", - views.AssignPermissionView.as_view(), - name="assign_permission", - ), - path("pdfs/<int:pk>/", views.RedirectToPDFFile.as_view(), name="redirect_to_pdf_file"), ] # Use custom server error handler to get a request object in the template @@ -324,11 +395,7 @@ handler500 = views.server_error if hasattr(settings, "TWILIO_ACCOUNT_SID"): from two_factor.gateways.twilio.urls import urlpatterns as tf_twilio_urls # noqa - urlpatterns += [path("", include(tf_twilio_urls))] - -# Serve javascript-common if in development -if settings.DEBUG: - urlpatterns.append(path("__debug__/", include(debug_toolbar.urls))) + urlpatterns += [path("django/", include(tf_twilio_urls))] # Automatically mount URLs from all installed AlekSIS apps for app_config in apps.app_configs.values(): @@ -336,7 +403,15 @@ for app_config in apps.app_configs.values(): continue try: - urlpatterns.append(path(f"app/{app_config.label}/", include(f"{app_config.name}.urls"))) + urlpatterns.append( + path(f"django/app/{app_config.label}/", include(f"{app_config.name}.urls")) + ) except ModuleNotFoundError: # Ignore exception as app just has no URLs pass # noqa + +urlpatterns.append( + re_path( + r"^(?P<url>.*)/$", TemplateView.as_view(template_name="core/vue_index.html"), name="vue_app" + ) +) diff --git a/aleksis/core/util/apps.py b/aleksis/core/util/apps.py index 5b3898dd835506ade932ebccf30e4cf0de15486e..0889280858a64a61cd8857a0c6eef4f872012cfc 100644 --- a/aleksis/core/util/apps.py +++ b/aleksis/core/util/apps.py @@ -9,9 +9,9 @@ from django.http import HttpRequest from dynamic_preferences.signals import preference_updated from license_expression import Licensing from oauthlib.common import Request as OauthlibRequest -from spdx_license_list import LICENSES from .core_helpers import copyright_years +from .spdx import LICENSES if TYPE_CHECKING: from oauth2_provider.models import AbstractApplication @@ -20,8 +20,13 @@ if TYPE_CHECKING: class AppConfig(django.apps.AppConfig): """An extended version of DJango's AppConfig container.""" + default = False default_auto_field = "django.db.models.BigAutoField" + def __init_subclass__(cls): + super().__init_subclass__() + cls.default = True + def ready(self): super().ready() @@ -128,12 +133,28 @@ class AppConfig(django.apps.AppConfig): # We could not find a valid licence return ("Unknown", [default_dict]) + @classmethod + def get_licence_dict(cls): + """Get licence information of application package.""" + licence = cls.get_licence() + return { + "verbose_name": licence[0], + "flags": licence[1], + "licences": licence[2], + } + @classmethod def get_urls(cls): """Get list of URLs for this application package.""" return getattr(cls, "urls", {}) # TODO Try getting from distribution if not set + @classmethod + def get_urls_dict(cls): + """Get list of URLs for this application package.""" + urls = cls.get_urls() + return [{"name": key, "url": value} for key, value in urls.items()] + @classmethod def get_copyright(cls) -> Sequence[tuple[str, str, str]]: """Get copyright information tuples for application package.""" @@ -155,6 +176,12 @@ class AppConfig(django.apps.AppConfig): return copyrights_processed # TODO Try getting from distribution if not set + @classmethod + def get_copyright_dicts(cls): + """Get copyright information dictionaries for application package.""" + infos = cls.get_copyright() + return [{"years": info[0], "name": info[1], "email": info[2]} for info in infos] + def preference_updated( self, sender: Any, diff --git a/aleksis/core/util/auth_helpers.py b/aleksis/core/util/auth_helpers.py index 056b5156da68233d3b3ee2378ccffdff95cfbcd6..ca80aeae4a59ac069023465559d599f929bab6d8 100644 --- a/aleksis/core/util/auth_helpers.py +++ b/aleksis/core/util/auth_helpers.py @@ -3,6 +3,8 @@ from typing import Any, Optional from django.conf import settings +from django.contrib.auth.validators import ASCIIUsernameValidator +from django.core.validators import RegexValidator from django.http import HttpRequest from allauth.account.adapter import DefaultAccountAdapter @@ -16,6 +18,7 @@ from oauth2_provider.views.mixins import ( from oauthlib.common import Request as OauthlibRequest from .apps import AppConfig +from .core_helpers import get_site_preferences class OurSocialAccountAdapter(DefaultSocialAccountAdapter): @@ -131,6 +134,18 @@ class ClientProtectedResourceMixin(_ClientProtectedResourceMixin): # Verify scopes of configured application # The OAuth request was enriched with a reference to the Application when using the # validator above. + if not oauth_request.client.allowed_scopes: + # If there are no allowed scopes, the client is not allowed to access this resource + return False + required_scopes = set(self.get_scopes() or []) allowed_scopes = set(AppScopes().get_available_scopes(oauth_request.client) or []) return required_scopes.issubset(allowed_scopes) + + +def validate_username_preference_regex(value: str): + regex = get_site_preferences()["auth__allowed_username_regex"] + return RegexValidator(regex)(value) + + +custom_username_validators = [validate_username_preference_regex, ASCIIUsernameValidator()] diff --git a/aleksis/core/util/celery_progress.py b/aleksis/core/util/celery_progress.py index ef42f1692dab60dc9bc88f3c6bba4ce4beef3222..008b979ec37207d05b2b22538a7761591ed8b22c 100644 --- a/aleksis/core/util/celery_progress.py +++ b/aleksis/core/util/celery_progress.py @@ -4,13 +4,13 @@ from typing import Callable, Generator, Iterable, Optional, Sequence, Union from django.apps import apps from django.contrib import messages -from django.http import HttpRequest -from django.shortcuts import render +from django.http import HttpRequest, HttpResponseRedirect from celery.result import AsyncResult from celery_progress.backend import PROGRESS_STATE, AbstractProgressRecorder from ..celery import app +from ..tasks import send_notification_for_done_task class ProgressRecorder(AbstractProgressRecorder): @@ -155,7 +155,13 @@ def recorded_task(orig: Optional[Callable] = None, **kwargs) -> Union[Callable, @wraps(orig) def _inject_recorder(task, *args, **kwargs): recorder = ProgressRecorder(task) - return orig(*args, **kwargs, recorder=recorder) + orig(*args, **kwargs, recorder=recorder) + + # Start notification task to ensure + # that the user is informed about the result in any case + send_notification_for_done_task.delay(task.request.id) + + return recorder._messages # Force bind to True because _inject_recorder needs the Task object kwargs["bind"] = True @@ -202,22 +208,15 @@ def render_progress_page( TaskUserAssignment = apps.get_model("core", "TaskUserAssignment") assignment = TaskUserAssignment.create_for_task_id(task_result.task_id, request.user) - # Prepare context for progress page - context["title"] = title - context["back_url"] = back_url - context["progress"] = { - "task_id": task_result.task_id, - "title": progress_title, - "success": success_message, - "error": error_message, - "redirect_on_success": redirect_on_success_url, - } - - if button_url and button_title: - context["additional_button"] = { - "href": button_url, - "caption": button_title, - "icon": button_icon, - } - - return render(request, "core/pages/progress.html", context) + assignment.title = title + assignment.back_url = back_url or "" + assignment.progress_title = progress_title or "" + assignment.error_message = error_message or "" + assignment.success_message = success_message or "" + assignment.redirect_on_success_url = redirect_on_success_url or "" + assignment.additional_button_title = button_title or "" + assignment.additional_button_url = button_url or "" + assignment.additional_button_icon = button_icon or "" + assignment.save() + + return HttpResponseRedirect(request.build_absolute_uri(assignment.get_absolute_url())) diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index 6988dd53137f2d5ca364bcfd7091d9b1795e7f10..511b6ada19c8ee3bc984ffef7865443142319888 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta from importlib import import_module, metadata from itertools import groupby from operator import itemgetter +from types import ModuleType from typing import Any, Callable, Dict, Optional, Sequence, Union from warnings import warn @@ -12,6 +13,7 @@ from django.core.files import File from django.db.models import Model, QuerySet from django.http import HttpRequest from django.shortcuts import get_object_or_404 +from django.urls import reverse from django.utils import timezone from django.utils.crypto import get_random_string from django.utils.functional import lazy @@ -22,8 +24,8 @@ from cachalot.signals import post_invalidation from cache_memoize import cache_memoize -def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = "–") -> str: - """Take a sequence of integegers and produces a string with ranges. +def copyright_years(years: Sequence[int], separator: str = ", ", joiner: str = "–") -> str: + """Take a sequence of integers and produces a string with ranges. >>> copyright_years([1999, 2000, 2001, 2005, 2007, 2008, 2009]) '1999–2001, 2005, 2007–2009' @@ -37,31 +39,34 @@ def copyright_years(years: Sequence[int], seperator: str = ", ", joiner: str = " for range_ in ranges ] - return seperator.join(years_strs) + return separator.join(years_strs) -def dt_show_toolbar(request: HttpRequest) -> bool: - """Add a helper to determin if Django debug toolbar should be displayed. +def get_app_packages(only_official: bool = False) -> Sequence[str]: + """Find all registered apps from the setuptools entrypoint.""" + apps = [] - Extends the default behaviour by enabling DJDT for superusers independent - of source IP. - """ - from debug_toolbar.middleware import show_toolbar # noqa + for ep in metadata.entry_points().get("aleksis.app", []): + path = f"{ep.module}.{ep.attr}" + if path.startswith("aleksis.apps.") or not only_official: + apps.append(path) - if not settings.DEBUG: - return False + return apps - if show_toolbar(request): - return True - elif hasattr(request, "user") and request.user.is_superuser: - return True - return False +def get_app_module(app: str, name: str) -> Optional[ModuleType]: + """Get a named module of an app.""" + pkg = ".".join(app.split(".")[:-2]) + while "." in pkg: + try: + return import_module(f"{pkg}.{name}") + except ImportError: + # Import errors are non-fatal. + pkg = ".".join(pkg.split(".")[:-1]) -def get_app_packages() -> Sequence[str]: - """Find all registered apps from the setuptools entrypoint.""" - return [f"{ep.module}.{ep.attr}" for ep in metadata.entry_points().get("aleksis.app", [])] + # The app does not have this module + return None def merge_app_settings( @@ -77,18 +82,8 @@ def merge_app_settings( potentially malicious apps! """ for app in get_app_packages(): - pkg = ".".join(app.split(".")[:-2]) - mod_settings = None - while "." in pkg: - try: - mod_settings = import_module(pkg + ".settings") - except ImportError: - # Import errors are non-fatal. - pkg = ".".join(pkg.split(".")[:-1]) - continue - break + mod_settings = get_app_module(app, "settings") if not mod_settings: - # The app does not have settings continue app_setting = getattr(mod_settings, setting, None) @@ -109,6 +104,26 @@ def merge_app_settings( raise TypeError("Only dict and list settings can be merged.") +def get_app_settings_overrides() -> dict[str, Any]: + """Get app settings overrides. + + Official apps (those under the ``aleksis.apps` namespace) can override + or add settings by listing them in their ``settings.overrides``. + """ + overrides = {} + + for app in get_app_packages(True): + mod_settings = get_app_module(app, "settings") + if not mod_settings: + continue + + if hasattr(mod_settings, "overrides"): + for name in mod_settings.overrides: + overrides[name] = getattr(mod_settings, name) + + return overrides + + def get_site_preferences(): """Get the preferences manager of the current site.""" from django.contrib.sites.models import Site # noqa @@ -204,25 +219,35 @@ def has_person(obj: Union[HttpRequest, Model]) -> bool: def custom_information_processor(request: Union[HttpRequest, None]) -> dict: """Provide custom information in all templates.""" - from ..models import CustomMenu - pwa_icons = get_pwa_icons() regrouped_pwa_icons = {} for pwa_icon in pwa_icons: regrouped_pwa_icons.setdefault(pwa_icon.rel, {}) regrouped_pwa_icons[pwa_icon.rel][pwa_icon.size] = pwa_icon + # This dictionary is passed to the frontend and made available as + # `$root.$aleksisFrontendSettings` in Vue. + frontend_settings = { + "sentry": { + "enabled": settings.SENTRY_ENABLED, + }, + "urls": { + "base": settings.BASE_URL, + "graphql": reverse("graphql"), + }, + } + context = { - "FOOTER_MENU": CustomMenu.get_default("footer"), "ADMINS": settings.ADMINS, "PWA_ICONS": regrouped_pwa_icons, "SENTRY_ENABLED": settings.SENTRY_ENABLED, "SITE_PREFERENCES": get_site_preferences(), "BASE_URL": settings.BASE_URL, + "FRONTEND_SETTINGS": frontend_settings, } if settings.SENTRY_ENABLED: - context["SENTRY_SETTINGS"] = settings.SENTRY_SETTINGS + frontend_settings["sentry"].update(settings.SENTRY_SETTINGS) import sentry_sdk @@ -288,11 +313,6 @@ def generate_random_code(length, packet_size) -> str: return get_random_string(packet_size * length).lower() -def unread_notifications_badge(request: HttpRequest) -> int: - """Generate badge content with the number of unread notifications.""" - return request.user.person.unread_notifications_count - - def monkey_patch() -> None: # noqa """Monkey-patch dependencies for special behaviour.""" # Unwrap promises in JSON serializer instead of stringifying diff --git a/aleksis/core/util/frontend_helpers.py b/aleksis/core/util/frontend_helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..5d343acc0533a2509077c0f0d15ca0bc8d1823f9 --- /dev/null +++ b/aleksis/core/util/frontend_helpers.py @@ -0,0 +1,82 @@ +import json +import os +import shutil +from typing import Any, Optional, Sequence + +from django.conf import settings + +from django_yarnpkg.yarn import yarn_adapter + +from .core_helpers import get_app_module, get_app_packages + + +def get_apps_with_frontend(): + """Get a dictionary of apps that ship frontend code/assets.""" + assets = {} + for app in get_app_packages(): + mod = get_app_module(app, "apps") + path = os.path.join(os.path.dirname(mod.__file__), "frontend") + if os.path.isdir(path): + package = ".".join(app.split(".")[:-2]) + assets[package] = path + return assets + + +def write_vite_values(out_path: str) -> dict[str, Any]: + vite_values = { + "static_url": settings.STATIC_URL, + "serverPort": settings.DJANGO_VITE_DEV_SERVER_PORT, + } + # Write rollup entrypoints for all apps + vite_values["appDetails"] = {} + for app, path in get_apps_with_frontend().items(): + if os.path.exists(path): + vite_values["appDetails"][app] = {} + vite_values["appDetails"][app]["name"] = app.split(".")[-1] + vite_values["appDetails"][app]["assetDir"] = path + vite_values["appDetails"][app]["hasMessages"] = os.path.exists( + os.path.join(path, "messages", "en.json") + ) + # Add core entrypoint + vite_values["coreAssetDir"] = os.path.join(settings.BASE_DIR, "aleksis", "core", "frontend") + + # Add directories + vite_values["baseDir"] = settings.BASE_DIR + vite_values["cacheDir"] = settings.CACHE_DIR + vite_values["node_modules"] = settings.JS_ROOT + + with open(out_path, "w") as out: + json.dump(vite_values, out) + + +def run_vite(args: Optional[Sequence[str]] = None) -> None: + args = list(args) if args else [] + + config_path = os.path.join(settings.BASE_DIR, "aleksis", "core", "vite.config.js") + shutil.copy(config_path, settings.NODE_MODULES_ROOT) + + mode = "development" if settings.DEBUG else "production" + args += ["-m", mode] + + log_level = settings.LOGGING["root"]["level"] + if settings.DEBUG or log_level == "DEBUG": + args.append("-d") + log_level = {"INFO": "info", "WARNING": "warn", "ERROR": "error"}.get(log_level, "silent") + args += ["-l", log_level] + + yarn_adapter.call_yarn(["run", "vite"] + args) + + +def get_language_cookie(code: str) -> str: + """Build a cookie string to set a new language.""" + cookie_parts = [f"{settings.LANGUAGE_COOKIE_NAME}={code}"] + args = dict( + max_age=settings.LANGUAGE_COOKIE_AGE, + path=settings.LANGUAGE_COOKIE_PATH, + domain=settings.LANGUAGE_COOKIE_DOMAIN, + secure=settings.LANGUAGE_COOKIE_SECURE, + httponly=settings.LANGUAGE_COOKIE_HTTPONLY, + samesite=settings.LANGUAGE_COOKIE_SAMESITE, + ) + cookie_parts += [f"{k.replace('_', '-')}={v}" for k, v in args.items() if v] + return "; ".join(cookie_parts) diff --git a/aleksis/core/util/licenses.json b/aleksis/core/util/licenses.json new file mode 100644 index 0000000000000000000000000000000000000000..983df4782a1738f3934436074d85e1526a433832 --- /dev/null +++ b/aleksis/core/util/licenses.json @@ -0,0 +1 @@ +{"0BSD": {"reference": "https://spdx.org/licenses/0BSD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/0BSD.json", "referenceNumber": 408, "name": "BSD Zero Clause License", "licenseId": "0BSD", "seeAlso": ["http://landley.net/toybox/license.html", "https://opensource.org/licenses/0BSD"], "isOsiApproved": true}, "AAL": {"reference": "https://spdx.org/licenses/AAL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AAL.json", "referenceNumber": 190, "name": "Attribution Assurance License", "licenseId": "AAL", "seeAlso": ["https://opensource.org/licenses/attribution"], "isOsiApproved": true}, "Abstyles": {"reference": "https://spdx.org/licenses/Abstyles.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Abstyles.json", "referenceNumber": 313, "name": "Abstyles License", "licenseId": "Abstyles", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Abstyles"], "isOsiApproved": false}, "Adobe-2006": {"reference": "https://spdx.org/licenses/Adobe-2006.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-2006.json", "referenceNumber": 7, "name": "Adobe Systems Incorporated Source Code License Agreement", "licenseId": "Adobe-2006", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/AdobeLicense"], "isOsiApproved": false}, "Adobe-Glyph": {"reference": "https://spdx.org/licenses/Adobe-Glyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Adobe-Glyph.json", "referenceNumber": 324, "name": "Adobe Glyph List License", "licenseId": "Adobe-Glyph", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph"], "isOsiApproved": false}, "ADSL": {"reference": "https://spdx.org/licenses/ADSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ADSL.json", "referenceNumber": 133, "name": "Amazon Digital Services License", "licenseId": "ADSL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense"], "isOsiApproved": false}, "AFL-1.1": {"reference": "https://spdx.org/licenses/AFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.1.json", "referenceNumber": 137, "name": "Academic Free License v1.1", "licenseId": "AFL-1.1", "seeAlso": ["http://opensource.linux-mirror.org/licenses/afl-1.1.txt", "http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php"], "isOsiApproved": true, "isFsfLibre": true}, "AFL-1.2": {"reference": "https://spdx.org/licenses/AFL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-1.2.json", "referenceNumber": 406, "name": "Academic Free License v1.2", "licenseId": "AFL-1.2", "seeAlso": ["http://opensource.linux-mirror.org/licenses/afl-1.2.txt", "http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php"], "isOsiApproved": true, "isFsfLibre": true}, "AFL-2.0": {"reference": "https://spdx.org/licenses/AFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.0.json", "referenceNumber": 259, "name": "Academic Free License v2.0", "licenseId": "AFL-2.0", "seeAlso": ["http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt"], "isOsiApproved": true, "isFsfLibre": true}, "AFL-2.1": {"reference": "https://spdx.org/licenses/AFL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-2.1.json", "referenceNumber": 357, "name": "Academic Free License v2.1", "licenseId": "AFL-2.1", "seeAlso": ["http://opensource.linux-mirror.org/licenses/afl-2.1.txt"], "isOsiApproved": true, "isFsfLibre": true}, "AFL-3.0": {"reference": "https://spdx.org/licenses/AFL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AFL-3.0.json", "referenceNumber": 145, "name": "Academic Free License v3.0", "licenseId": "AFL-3.0", "seeAlso": ["http://www.rosenlaw.com/AFL3.0.htm", "https://opensource.org/licenses/afl-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "Afmparse": {"reference": "https://spdx.org/licenses/Afmparse.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Afmparse.json", "referenceNumber": 460, "name": "Afmparse License", "licenseId": "Afmparse", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Afmparse"], "isOsiApproved": false}, "AGPL-1.0": {"reference": "https://spdx.org/licenses/AGPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0.json", "referenceNumber": 437, "name": "Affero General Public License v1.0", "licenseId": "AGPL-1.0", "seeAlso": ["http://www.affero.org/oagpl.html"], "isOsiApproved": false, "isFsfLibre": true}, "AGPL-1.0-only": {"reference": "https://spdx.org/licenses/AGPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-only.json", "referenceNumber": 450, "name": "Affero General Public License v1.0 only", "licenseId": "AGPL-1.0-only", "seeAlso": ["http://www.affero.org/oagpl.html"], "isOsiApproved": false}, "AGPL-1.0-or-later": {"reference": "https://spdx.org/licenses/AGPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-1.0-or-later.json", "referenceNumber": 96, "name": "Affero General Public License v1.0 or later", "licenseId": "AGPL-1.0-or-later", "seeAlso": ["http://www.affero.org/oagpl.html"], "isOsiApproved": false}, "AGPL-3.0": {"reference": "https://spdx.org/licenses/AGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0.json", "referenceNumber": 378, "name": "GNU Affero General Public License v3.0", "licenseId": "AGPL-3.0", "seeAlso": ["https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "AGPL-3.0-only": {"reference": "https://spdx.org/licenses/AGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-only.json", "referenceNumber": 432, "name": "GNU Affero General Public License v3.0 only", "licenseId": "AGPL-3.0-only", "seeAlso": ["https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "AGPL-3.0-or-later": {"reference": "https://spdx.org/licenses/AGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AGPL-3.0-or-later.json", "referenceNumber": 250, "name": "GNU Affero General Public License v3.0 or later", "licenseId": "AGPL-3.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/agpl.txt", "https://opensource.org/licenses/AGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "Aladdin": {"reference": "https://spdx.org/licenses/Aladdin.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Aladdin.json", "referenceNumber": 289, "name": "Aladdin Free Public License", "licenseId": "Aladdin", "seeAlso": ["http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm"], "isOsiApproved": false, "isFsfLibre": false}, "AMDPLPA": {"reference": "https://spdx.org/licenses/AMDPLPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMDPLPA.json", "referenceNumber": 455, "name": "AMD's plpa_map.c License", "licenseId": "AMDPLPA", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License"], "isOsiApproved": false}, "AML": {"reference": "https://spdx.org/licenses/AML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AML.json", "referenceNumber": 116, "name": "Apple MIT License", "licenseId": "AML", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Apple_MIT_License"], "isOsiApproved": false}, "AMPAS": {"reference": "https://spdx.org/licenses/AMPAS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/AMPAS.json", "referenceNumber": 221, "name": "Academy of Motion Picture Arts and Sciences BSD", "licenseId": "AMPAS", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD"], "isOsiApproved": false}, "ANTLR-PD": {"reference": "https://spdx.org/licenses/ANTLR-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD.json", "referenceNumber": 204, "name": "ANTLR Software Rights Notice", "licenseId": "ANTLR-PD", "seeAlso": ["http://www.antlr2.org/license.html"], "isOsiApproved": false}, "ANTLR-PD-fallback": {"reference": "https://spdx.org/licenses/ANTLR-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ANTLR-PD-fallback.json", "referenceNumber": 255, "name": "ANTLR Software Rights Notice with license fallback", "licenseId": "ANTLR-PD-fallback", "seeAlso": ["http://www.antlr2.org/license.html"], "isOsiApproved": false}, "Apache-1.0": {"reference": "https://spdx.org/licenses/Apache-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.0.json", "referenceNumber": 484, "name": "Apache License 1.0", "licenseId": "Apache-1.0", "seeAlso": ["http://www.apache.org/licenses/LICENSE-1.0"], "isOsiApproved": false, "isFsfLibre": true}, "Apache-1.1": {"reference": "https://spdx.org/licenses/Apache-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-1.1.json", "referenceNumber": 152, "name": "Apache License 1.1", "licenseId": "Apache-1.1", "seeAlso": ["http://apache.org/licenses/LICENSE-1.1", "https://opensource.org/licenses/Apache-1.1"], "isOsiApproved": true, "isFsfLibre": true}, "Apache-2.0": {"reference": "https://spdx.org/licenses/Apache-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Apache-2.0.json", "referenceNumber": 77, "name": "Apache License 2.0", "licenseId": "Apache-2.0", "seeAlso": ["https://www.apache.org/licenses/LICENSE-2.0", "https://opensource.org/licenses/Apache-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "APAFML": {"reference": "https://spdx.org/licenses/APAFML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APAFML.json", "referenceNumber": 271, "name": "Adobe Postscript AFM License", "licenseId": "APAFML", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM"], "isOsiApproved": false}, "APL-1.0": {"reference": "https://spdx.org/licenses/APL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APL-1.0.json", "referenceNumber": 310, "name": "Adaptive Public License 1.0", "licenseId": "APL-1.0", "seeAlso": ["https://opensource.org/licenses/APL-1.0"], "isOsiApproved": true}, "App-s2p": {"reference": "https://spdx.org/licenses/App-s2p.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/App-s2p.json", "referenceNumber": 440, "name": "App::s2p License", "licenseId": "App-s2p", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/App-s2p"], "isOsiApproved": false}, "APSL-1.0": {"reference": "https://spdx.org/licenses/APSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.0.json", "referenceNumber": 65, "name": "Apple Public Source License 1.0", "licenseId": "APSL-1.0", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0"], "isOsiApproved": true, "isFsfLibre": false}, "APSL-1.1": {"reference": "https://spdx.org/licenses/APSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.1.json", "referenceNumber": 274, "name": "Apple Public Source License 1.1", "licenseId": "APSL-1.1", "seeAlso": ["http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE"], "isOsiApproved": true}, "APSL-1.2": {"reference": "https://spdx.org/licenses/APSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-1.2.json", "referenceNumber": 273, "name": "Apple Public Source License 1.2", "licenseId": "APSL-1.2", "seeAlso": ["http://www.samurajdata.se/opensource/mirror/licenses/apsl.php"], "isOsiApproved": true}, "APSL-2.0": {"reference": "https://spdx.org/licenses/APSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/APSL-2.0.json", "referenceNumber": 64, "name": "Apple Public Source License 2.0", "licenseId": "APSL-2.0", "seeAlso": ["http://www.opensource.apple.com/license/apsl/"], "isOsiApproved": true, "isFsfLibre": true}, "Arphic-1999": {"reference": "https://spdx.org/licenses/Arphic-1999.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Arphic-1999.json", "referenceNumber": 163, "name": "Arphic Public License", "licenseId": "Arphic-1999", "seeAlso": ["http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/LICENSE"], "isOsiApproved": false}, "Artistic-1.0": {"reference": "https://spdx.org/licenses/Artistic-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0.json", "referenceNumber": 69, "name": "Artistic License 1.0", "licenseId": "Artistic-1.0", "seeAlso": ["https://opensource.org/licenses/Artistic-1.0"], "isOsiApproved": true, "isFsfLibre": false}, "Artistic-1.0-cl8": {"reference": "https://spdx.org/licenses/Artistic-1.0-cl8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-cl8.json", "referenceNumber": 260, "name": "Artistic License 1.0 w/clause 8", "licenseId": "Artistic-1.0-cl8", "seeAlso": ["https://opensource.org/licenses/Artistic-1.0"], "isOsiApproved": true}, "Artistic-1.0-Perl": {"reference": "https://spdx.org/licenses/Artistic-1.0-Perl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-1.0-Perl.json", "referenceNumber": 483, "name": "Artistic License 1.0 (Perl)", "licenseId": "Artistic-1.0-Perl", "seeAlso": ["http://dev.perl.org/licenses/artistic.html"], "isOsiApproved": true}, "Artistic-2.0": {"reference": "https://spdx.org/licenses/Artistic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Artistic-2.0.json", "referenceNumber": 425, "name": "Artistic License 2.0", "licenseId": "Artistic-2.0", "seeAlso": ["http://www.perlfoundation.org/artistic_license_2_0", "https://www.perlfoundation.org/artistic-license-20.html", "https://opensource.org/licenses/artistic-license-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "Baekmuk": {"reference": "https://spdx.org/licenses/Baekmuk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Baekmuk.json", "referenceNumber": 24, "name": "Baekmuk License", "licenseId": "Baekmuk", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:Baekmuk?rd=Licensing/Baekmuk"], "isOsiApproved": false}, "Bahyph": {"reference": "https://spdx.org/licenses/Bahyph.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bahyph.json", "referenceNumber": 218, "name": "Bahyph License", "licenseId": "Bahyph", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Bahyph"], "isOsiApproved": false}, "Barr": {"reference": "https://spdx.org/licenses/Barr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Barr.json", "referenceNumber": 435, "name": "Barr License", "licenseId": "Barr", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Barr"], "isOsiApproved": false}, "Beerware": {"reference": "https://spdx.org/licenses/Beerware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Beerware.json", "referenceNumber": 118, "name": "Beerware License", "licenseId": "Beerware", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Beerware", "https://people.freebsd.org/~phk/"], "isOsiApproved": false}, "Bitstream-Vera": {"reference": "https://spdx.org/licenses/Bitstream-Vera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Bitstream-Vera.json", "referenceNumber": 57, "name": "Bitstream Vera Font License", "licenseId": "Bitstream-Vera", "seeAlso": ["https://web.archive.org/web/20080207013128/http://www.gnome.org/fonts/", "https://docubrain.com/sites/default/files/licenses/bitstream-vera.html"], "isOsiApproved": false}, "BitTorrent-1.0": {"reference": "https://spdx.org/licenses/BitTorrent-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.0.json", "referenceNumber": 201, "name": "BitTorrent Open Source License v1.0", "licenseId": "BitTorrent-1.0", "seeAlso": ["http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1=1.1&r2=1.1.1.1&diff_format=s"], "isOsiApproved": false}, "BitTorrent-1.1": {"reference": "https://spdx.org/licenses/BitTorrent-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BitTorrent-1.1.json", "referenceNumber": 407, "name": "BitTorrent Open Source License v1.1", "licenseId": "BitTorrent-1.1", "seeAlso": ["http://directory.fsf.org/wiki/License:BitTorrentOSL1.1"], "isOsiApproved": false, "isFsfLibre": true}, "blessing": {"reference": "https://spdx.org/licenses/blessing.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/blessing.json", "referenceNumber": 104, "name": "SQLite Blessing", "licenseId": "blessing", "seeAlso": ["https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln=4-9", "https://sqlite.org/src/artifact/df5091916dbb40e6"], "isOsiApproved": false}, "BlueOak-1.0.0": {"reference": "https://spdx.org/licenses/BlueOak-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BlueOak-1.0.0.json", "referenceNumber": 171, "name": "Blue Oak Model License 1.0.0", "licenseId": "BlueOak-1.0.0", "seeAlso": ["https://blueoakcouncil.org/license/1.0.0"], "isOsiApproved": false}, "Borceux": {"reference": "https://spdx.org/licenses/Borceux.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Borceux.json", "referenceNumber": 21, "name": "Borceux license", "licenseId": "Borceux", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Borceux"], "isOsiApproved": false}, "BSD-1-Clause": {"reference": "https://spdx.org/licenses/BSD-1-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-1-Clause.json", "referenceNumber": 39, "name": "BSD 1-Clause License", "licenseId": "BSD-1-Clause", "seeAlso": ["https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision=326823"], "isOsiApproved": true}, "BSD-2-Clause": {"reference": "https://spdx.org/licenses/BSD-2-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause.json", "referenceNumber": 206, "name": "BSD 2-Clause \"Simplified\" License", "licenseId": "BSD-2-Clause", "seeAlso": ["https://opensource.org/licenses/BSD-2-Clause"], "isOsiApproved": true, "isFsfLibre": true}, "BSD-2-Clause-FreeBSD": {"reference": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-FreeBSD.json", "referenceNumber": 127, "name": "BSD 2-Clause FreeBSD License", "licenseId": "BSD-2-Clause-FreeBSD", "seeAlso": ["http://www.freebsd.org/copyright/freebsd-license.html"], "isOsiApproved": false, "isFsfLibre": true}, "BSD-2-Clause-NetBSD": {"reference": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-NetBSD.json", "referenceNumber": 194, "name": "BSD 2-Clause NetBSD License", "licenseId": "BSD-2-Clause-NetBSD", "seeAlso": ["http://www.netbsd.org/about/redistribution.html#default"], "isOsiApproved": false, "isFsfLibre": true}, "BSD-2-Clause-Patent": {"reference": "https://spdx.org/licenses/BSD-2-Clause-Patent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Patent.json", "referenceNumber": 9, "name": "BSD-2-Clause Plus Patent License", "licenseId": "BSD-2-Clause-Patent", "seeAlso": ["https://opensource.org/licenses/BSDplusPatent"], "isOsiApproved": true}, "BSD-2-Clause-Views": {"reference": "https://spdx.org/licenses/BSD-2-Clause-Views.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-2-Clause-Views.json", "referenceNumber": 495, "name": "BSD 2-Clause with views sentence", "licenseId": "BSD-2-Clause-Views", "seeAlso": ["http://www.freebsd.org/copyright/freebsd-license.html", "https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh", "https://github.com/protegeproject/protege/blob/master/license.txt"], "isOsiApproved": false}, "BSD-3-Clause": {"reference": "https://spdx.org/licenses/BSD-3-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause.json", "referenceNumber": 29, "name": "BSD 3-Clause \"New\" or \"Revised\" License", "licenseId": "BSD-3-Clause", "seeAlso": ["https://opensource.org/licenses/BSD-3-Clause", "https://www.eclipse.org/org/documents/edl-v10.php"], "isOsiApproved": true, "isFsfLibre": true}, "BSD-3-Clause-Attribution": {"reference": "https://spdx.org/licenses/BSD-3-Clause-Attribution.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Attribution.json", "referenceNumber": 347, "name": "BSD with attribution", "licenseId": "BSD-3-Clause-Attribution", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution"], "isOsiApproved": false}, "BSD-3-Clause-Clear": {"reference": "https://spdx.org/licenses/BSD-3-Clause-Clear.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Clear.json", "referenceNumber": 391, "name": "BSD 3-Clause Clear License", "licenseId": "BSD-3-Clause-Clear", "seeAlso": ["http://labs.metacarta.com/license-explanation.html#license"], "isOsiApproved": false, "isFsfLibre": true}, "BSD-3-Clause-LBNL": {"reference": "https://spdx.org/licenses/BSD-3-Clause-LBNL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-LBNL.json", "referenceNumber": 296, "name": "Lawrence Berkeley National Labs BSD variant license", "licenseId": "BSD-3-Clause-LBNL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/LBNLBSD"], "isOsiApproved": true}, "BSD-3-Clause-Modification": {"reference": "https://spdx.org/licenses/BSD-3-Clause-Modification.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Modification.json", "referenceNumber": 212, "name": "BSD 3-Clause Modification", "licenseId": "BSD-3-Clause-Modification", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:BSD#Modification_Variant"], "isOsiApproved": false}, "BSD-3-Clause-No-Military-License": {"reference": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Military-License.json", "referenceNumber": 23, "name": "BSD 3-Clause No Military License", "licenseId": "BSD-3-Clause-No-Military-License", "seeAlso": ["https://gitlab.syncad.com/hive/dhive/-/blob/master/LICENSE", "https://github.com/greymass/swift-eosio/blob/master/LICENSE"], "isOsiApproved": false}, "BSD-3-Clause-No-Nuclear-License": {"reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json", "referenceNumber": 387, "name": "BSD 3-Clause No Nuclear License", "licenseId": "BSD-3-Clause-No-Nuclear-License", "seeAlso": ["http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc"], "isOsiApproved": false}, "BSD-3-Clause-No-Nuclear-License-2014": {"reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json", "referenceNumber": 350, "name": "BSD 3-Clause No Nuclear License 2014", "licenseId": "BSD-3-Clause-No-Nuclear-License-2014", "seeAlso": ["https://java.net/projects/javaeetutorial/pages/BerkeleyLicense"], "isOsiApproved": false}, "BSD-3-Clause-No-Nuclear-Warranty": {"reference": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json", "referenceNumber": 223, "name": "BSD 3-Clause No Nuclear Warranty", "licenseId": "BSD-3-Clause-No-Nuclear-Warranty", "seeAlso": ["https://jogamp.org/git/?p=gluegen.git;a=blob_plain;f=LICENSE.txt"], "isOsiApproved": false}, "BSD-3-Clause-Open-MPI": {"reference": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json", "referenceNumber": 380, "name": "BSD 3-Clause Open MPI variant", "licenseId": "BSD-3-Clause-Open-MPI", "seeAlso": ["https://www.open-mpi.org/community/license.php", "http://www.netlib.org/lapack/LICENSE.txt"], "isOsiApproved": false}, "BSD-4-Clause": {"reference": "https://spdx.org/licenses/BSD-4-Clause.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause.json", "referenceNumber": 500, "name": "BSD 4-Clause \"Original\" or \"Old\" License", "licenseId": "BSD-4-Clause", "seeAlso": ["http://directory.fsf.org/wiki/License:BSD_4Clause"], "isOsiApproved": false, "isFsfLibre": true}, "BSD-4-Clause-Shortened": {"reference": "https://spdx.org/licenses/BSD-4-Clause-Shortened.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-Shortened.json", "referenceNumber": 8, "name": "BSD 4 Clause Shortened", "licenseId": "BSD-4-Clause-Shortened", "seeAlso": ["https://metadata.ftp-master.debian.org/changelogs//main/a/arpwatch/arpwatch_2.1a15-7_copyright"], "isOsiApproved": false}, "BSD-4-Clause-UC": {"reference": "https://spdx.org/licenses/BSD-4-Clause-UC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-4-Clause-UC.json", "referenceNumber": 252, "name": "BSD-4-Clause (University of California-Specific)", "licenseId": "BSD-4-Clause-UC", "seeAlso": ["http://www.freebsd.org/copyright/license.html"], "isOsiApproved": false}, "BSD-Protection": {"reference": "https://spdx.org/licenses/BSD-Protection.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Protection.json", "referenceNumber": 239, "name": "BSD Protection License", "licenseId": "BSD-Protection", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/BSD_Protection_License"], "isOsiApproved": false}, "BSD-Source-Code": {"reference": "https://spdx.org/licenses/BSD-Source-Code.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSD-Source-Code.json", "referenceNumber": 100, "name": "BSD Source Code Attribution", "licenseId": "BSD-Source-Code", "seeAlso": ["https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt"], "isOsiApproved": false}, "BSL-1.0": {"reference": "https://spdx.org/licenses/BSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BSL-1.0.json", "referenceNumber": 138, "name": "Boost Software License 1.0", "licenseId": "BSL-1.0", "seeAlso": ["http://www.boost.org/LICENSE_1_0.txt", "https://opensource.org/licenses/BSL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "BUSL-1.1": {"reference": "https://spdx.org/licenses/BUSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/BUSL-1.1.json", "referenceNumber": 247, "name": "Business Source License 1.1", "licenseId": "BUSL-1.1", "seeAlso": ["https://mariadb.com/bsl11/"], "isOsiApproved": false}, "bzip2-1.0.5": {"reference": "https://spdx.org/licenses/bzip2-1.0.5.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.5.json", "referenceNumber": 30, "name": "bzip2 and libbzip2 License v1.0.5", "licenseId": "bzip2-1.0.5", "seeAlso": ["https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html"], "isOsiApproved": false}, "bzip2-1.0.6": {"reference": "https://spdx.org/licenses/bzip2-1.0.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/bzip2-1.0.6.json", "referenceNumber": 301, "name": "bzip2 and libbzip2 License v1.0.6", "licenseId": "bzip2-1.0.6", "seeAlso": ["https://sourceware.org/git/?p=bzip2.git;a=blob;f=LICENSE;hb=bzip2-1.0.6", "http://bzip.org/1.0.5/bzip2-manual-1.0.5.html"], "isOsiApproved": false}, "C-UDA-1.0": {"reference": "https://spdx.org/licenses/C-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/C-UDA-1.0.json", "referenceNumber": 275, "name": "Computational Use of Data Agreement v1.0", "licenseId": "C-UDA-1.0", "seeAlso": ["https://github.com/microsoft/Computational-Use-of-Data-Agreement/blob/master/C-UDA-1.0.md", "https://cdla.dev/computational-use-of-data-agreement-v1-0/"], "isOsiApproved": false}, "CAL-1.0": {"reference": "https://spdx.org/licenses/CAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0.json", "referenceNumber": 497, "name": "Cryptographic Autonomy License 1.0", "licenseId": "CAL-1.0", "seeAlso": ["http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0"], "isOsiApproved": true}, "CAL-1.0-Combined-Work-Exception": {"reference": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json", "referenceNumber": 323, "name": "Cryptographic Autonomy License 1.0 (Combined Work Exception)", "licenseId": "CAL-1.0-Combined-Work-Exception", "seeAlso": ["http://cryptographicautonomylicense.com/license-text.html", "https://opensource.org/licenses/CAL-1.0"], "isOsiApproved": true}, "Caldera": {"reference": "https://spdx.org/licenses/Caldera.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Caldera.json", "referenceNumber": 318, "name": "Caldera License", "licenseId": "Caldera", "seeAlso": ["http://www.lemis.com/grog/UNIX/ancient-source-all.pdf"], "isOsiApproved": false}, "CATOSL-1.1": {"reference": "https://spdx.org/licenses/CATOSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CATOSL-1.1.json", "referenceNumber": 443, "name": "Computer Associates Trusted Open Source License 1.1", "licenseId": "CATOSL-1.1", "seeAlso": ["https://opensource.org/licenses/CATOSL-1.1"], "isOsiApproved": true}, "CC-BY-1.0": {"reference": "https://spdx.org/licenses/CC-BY-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-1.0.json", "referenceNumber": 161, "name": "Creative Commons Attribution 1.0 Generic", "licenseId": "CC-BY-1.0", "seeAlso": ["https://creativecommons.org/licenses/by/1.0/legalcode"], "isOsiApproved": false}, "CC-BY-2.0": {"reference": "https://spdx.org/licenses/CC-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.0.json", "referenceNumber": 430, "name": "Creative Commons Attribution 2.0 Generic", "licenseId": "CC-BY-2.0", "seeAlso": ["https://creativecommons.org/licenses/by/2.0/legalcode"], "isOsiApproved": false}, "CC-BY-2.5": {"reference": "https://spdx.org/licenses/CC-BY-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5.json", "referenceNumber": 54, "name": "Creative Commons Attribution 2.5 Generic", "licenseId": "CC-BY-2.5", "seeAlso": ["https://creativecommons.org/licenses/by/2.5/legalcode"], "isOsiApproved": false}, "CC-BY-2.5-AU": {"reference": "https://spdx.org/licenses/CC-BY-2.5-AU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-2.5-AU.json", "referenceNumber": 40, "name": "Creative Commons Attribution 2.5 Australia", "licenseId": "CC-BY-2.5-AU", "seeAlso": ["https://creativecommons.org/licenses/by/2.5/au/legalcode"], "isOsiApproved": false}, "CC-BY-3.0": {"reference": "https://spdx.org/licenses/CC-BY-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0.json", "referenceNumber": 477, "name": "Creative Commons Attribution 3.0 Unported", "licenseId": "CC-BY-3.0", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/legalcode"], "isOsiApproved": false}, "CC-BY-3.0-AT": {"reference": "https://spdx.org/licenses/CC-BY-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-AT.json", "referenceNumber": 79, "name": "Creative Commons Attribution 3.0 Austria", "licenseId": "CC-BY-3.0-AT", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/at/legalcode"], "isOsiApproved": false}, "CC-BY-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-DE.json", "referenceNumber": 164, "name": "Creative Commons Attribution 3.0 Germany", "licenseId": "CC-BY-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-3.0-IGO": {"reference": "https://spdx.org/licenses/CC-BY-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-IGO.json", "referenceNumber": 411, "name": "Creative Commons Attribution 3.0 IGO", "licenseId": "CC-BY-3.0-IGO", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/igo/legalcode"], "isOsiApproved": false}, "CC-BY-3.0-NL": {"reference": "https://spdx.org/licenses/CC-BY-3.0-NL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-NL.json", "referenceNumber": 447, "name": "Creative Commons Attribution 3.0 Netherlands", "licenseId": "CC-BY-3.0-NL", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/nl/legalcode"], "isOsiApproved": false}, "CC-BY-3.0-US": {"reference": "https://spdx.org/licenses/CC-BY-3.0-US.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-3.0-US.json", "referenceNumber": 485, "name": "Creative Commons Attribution 3.0 United States", "licenseId": "CC-BY-3.0-US", "seeAlso": ["https://creativecommons.org/licenses/by/3.0/us/legalcode"], "isOsiApproved": false}, "CC-BY-4.0": {"reference": "https://spdx.org/licenses/CC-BY-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-4.0.json", "referenceNumber": 424, "name": "Creative Commons Attribution 4.0 International", "licenseId": "CC-BY-4.0", "seeAlso": ["https://creativecommons.org/licenses/by/4.0/legalcode"], "isOsiApproved": false, "isFsfLibre": true}, "CC-BY-NC-1.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-1.0.json", "referenceNumber": 210, "name": "Creative Commons Attribution Non Commercial 1.0 Generic", "licenseId": "CC-BY-NC-1.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc/1.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-NC-2.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.0.json", "referenceNumber": 286, "name": "Creative Commons Attribution Non Commercial 2.0 Generic", "licenseId": "CC-BY-NC-2.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc/2.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-NC-2.5": {"reference": "https://spdx.org/licenses/CC-BY-NC-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-2.5.json", "referenceNumber": 327, "name": "Creative Commons Attribution Non Commercial 2.5 Generic", "licenseId": "CC-BY-NC-2.5", "seeAlso": ["https://creativecommons.org/licenses/by-nc/2.5/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-NC-3.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0.json", "referenceNumber": 331, "name": "Creative Commons Attribution Non Commercial 3.0 Unported", "licenseId": "CC-BY-NC-3.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc/3.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-NC-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-3.0-DE.json", "referenceNumber": 467, "name": "Creative Commons Attribution Non Commercial 3.0 Germany", "licenseId": "CC-BY-NC-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by-nc/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-NC-4.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-4.0.json", "referenceNumber": 89, "name": "Creative Commons Attribution Non Commercial 4.0 International", "licenseId": "CC-BY-NC-4.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc/4.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-NC-ND-1.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-1.0.json", "referenceNumber": 5, "name": "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", "licenseId": "CC-BY-NC-ND-1.0", "seeAlso": ["https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-2.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.0.json", "referenceNumber": 270, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", "licenseId": "CC-BY-NC-ND-2.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-2.5": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-2.5.json", "referenceNumber": 10, "name": "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", "licenseId": "CC-BY-NC-ND-2.5", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-3.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0.json", "referenceNumber": 489, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", "licenseId": "CC-BY-NC-ND-3.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-DE.json", "referenceNumber": 393, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", "licenseId": "CC-BY-NC-ND-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-3.0-IGO": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json", "referenceNumber": 364, "name": "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", "licenseId": "CC-BY-NC-ND-3.0-IGO", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode"], "isOsiApproved": false}, "CC-BY-NC-ND-4.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-ND-4.0.json", "referenceNumber": 320, "name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", "licenseId": "CC-BY-NC-ND-4.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-1.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-1.0.json", "referenceNumber": 344, "name": "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", "licenseId": "CC-BY-NC-SA-1.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-2.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0.json", "referenceNumber": 180, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", "licenseId": "CC-BY-NC-SA-2.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-2.0-FR": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-FR.json", "referenceNumber": 374, "name": "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", "licenseId": "CC-BY-NC-SA-2.0-FR", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/2.0/fr/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-2.0-UK": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.0-UK.json", "referenceNumber": 291, "name": "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", "licenseId": "CC-BY-NC-SA-2.0-UK", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/2.0/uk/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-2.5": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-2.5.json", "referenceNumber": 33, "name": "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", "licenseId": "CC-BY-NC-SA-2.5", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-3.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0.json", "referenceNumber": 328, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", "licenseId": "CC-BY-NC-SA-3.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-DE.json", "referenceNumber": 265, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", "licenseId": "CC-BY-NC-SA-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-3.0-IGO": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-3.0-IGO.json", "referenceNumber": 267, "name": "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", "licenseId": "CC-BY-NC-SA-3.0-IGO", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/3.0/igo/legalcode"], "isOsiApproved": false}, "CC-BY-NC-SA-4.0": {"reference": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-NC-SA-4.0.json", "referenceNumber": 427, "name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", "licenseId": "CC-BY-NC-SA-4.0", "seeAlso": ["https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode"], "isOsiApproved": false}, "CC-BY-ND-1.0": {"reference": "https://spdx.org/licenses/CC-BY-ND-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-1.0.json", "referenceNumber": 253, "name": "Creative Commons Attribution No Derivatives 1.0 Generic", "licenseId": "CC-BY-ND-1.0", "seeAlso": ["https://creativecommons.org/licenses/by-nd/1.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-ND-2.0": {"reference": "https://spdx.org/licenses/CC-BY-ND-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.0.json", "referenceNumber": 202, "name": "Creative Commons Attribution No Derivatives 2.0 Generic", "licenseId": "CC-BY-ND-2.0", "seeAlso": ["https://creativecommons.org/licenses/by-nd/2.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-ND-2.5": {"reference": "https://spdx.org/licenses/CC-BY-ND-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-2.5.json", "referenceNumber": 70, "name": "Creative Commons Attribution No Derivatives 2.5 Generic", "licenseId": "CC-BY-ND-2.5", "seeAlso": ["https://creativecommons.org/licenses/by-nd/2.5/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-ND-3.0": {"reference": "https://spdx.org/licenses/CC-BY-ND-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0.json", "referenceNumber": 325, "name": "Creative Commons Attribution No Derivatives 3.0 Unported", "licenseId": "CC-BY-ND-3.0", "seeAlso": ["https://creativecommons.org/licenses/by-nd/3.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-ND-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-3.0-DE.json", "referenceNumber": 422, "name": "Creative Commons Attribution No Derivatives 3.0 Germany", "licenseId": "CC-BY-ND-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by-nd/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-ND-4.0": {"reference": "https://spdx.org/licenses/CC-BY-ND-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-ND-4.0.json", "referenceNumber": 401, "name": "Creative Commons Attribution No Derivatives 4.0 International", "licenseId": "CC-BY-ND-4.0", "seeAlso": ["https://creativecommons.org/licenses/by-nd/4.0/legalcode"], "isOsiApproved": false, "isFsfLibre": false}, "CC-BY-SA-1.0": {"reference": "https://spdx.org/licenses/CC-BY-SA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-1.0.json", "referenceNumber": 197, "name": "Creative Commons Attribution Share Alike 1.0 Generic", "licenseId": "CC-BY-SA-1.0", "seeAlso": ["https://creativecommons.org/licenses/by-sa/1.0/legalcode"], "isOsiApproved": false}, "CC-BY-SA-2.0": {"reference": "https://spdx.org/licenses/CC-BY-SA-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0.json", "referenceNumber": 470, "name": "Creative Commons Attribution Share Alike 2.0 Generic", "licenseId": "CC-BY-SA-2.0", "seeAlso": ["https://creativecommons.org/licenses/by-sa/2.0/legalcode"], "isOsiApproved": false}, "CC-BY-SA-2.0-UK": {"reference": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.0-UK.json", "referenceNumber": 355, "name": "Creative Commons Attribution Share Alike 2.0 England and Wales", "licenseId": "CC-BY-SA-2.0-UK", "seeAlso": ["https://creativecommons.org/licenses/by-sa/2.0/uk/legalcode"], "isOsiApproved": false}, "CC-BY-SA-2.1-JP": {"reference": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.1-JP.json", "referenceNumber": 453, "name": "Creative Commons Attribution Share Alike 2.1 Japan", "licenseId": "CC-BY-SA-2.1-JP", "seeAlso": ["https://creativecommons.org/licenses/by-sa/2.1/jp/legalcode"], "isOsiApproved": false}, "CC-BY-SA-2.5": {"reference": "https://spdx.org/licenses/CC-BY-SA-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-2.5.json", "referenceNumber": 412, "name": "Creative Commons Attribution Share Alike 2.5 Generic", "licenseId": "CC-BY-SA-2.5", "seeAlso": ["https://creativecommons.org/licenses/by-sa/2.5/legalcode"], "isOsiApproved": false}, "CC-BY-SA-3.0": {"reference": "https://spdx.org/licenses/CC-BY-SA-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0.json", "referenceNumber": 334, "name": "Creative Commons Attribution Share Alike 3.0 Unported", "licenseId": "CC-BY-SA-3.0", "seeAlso": ["https://creativecommons.org/licenses/by-sa/3.0/legalcode"], "isOsiApproved": false}, "CC-BY-SA-3.0-AT": {"reference": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-AT.json", "referenceNumber": 256, "name": "Creative Commons Attribution Share Alike 3.0 Austria", "licenseId": "CC-BY-SA-3.0-AT", "seeAlso": ["https://creativecommons.org/licenses/by-sa/3.0/at/legalcode"], "isOsiApproved": false}, "CC-BY-SA-3.0-DE": {"reference": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-3.0-DE.json", "referenceNumber": 99, "name": "Creative Commons Attribution Share Alike 3.0 Germany", "licenseId": "CC-BY-SA-3.0-DE", "seeAlso": ["https://creativecommons.org/licenses/by-sa/3.0/de/legalcode"], "isOsiApproved": false}, "CC-BY-SA-4.0": {"reference": "https://spdx.org/licenses/CC-BY-SA-4.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-BY-SA-4.0.json", "referenceNumber": 304, "name": "Creative Commons Attribution Share Alike 4.0 International", "licenseId": "CC-BY-SA-4.0", "seeAlso": ["https://creativecommons.org/licenses/by-sa/4.0/legalcode"], "isOsiApproved": false, "isFsfLibre": true}, "CC-PDDC": {"reference": "https://spdx.org/licenses/CC-PDDC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC-PDDC.json", "referenceNumber": 195, "name": "Creative Commons Public Domain Dedication and Certification", "licenseId": "CC-PDDC", "seeAlso": ["https://creativecommons.org/licenses/publicdomain/"], "isOsiApproved": false}, "CC0-1.0": {"reference": "https://spdx.org/licenses/CC0-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CC0-1.0.json", "referenceNumber": 246, "name": "Creative Commons Zero v1.0 Universal", "licenseId": "CC0-1.0", "seeAlso": ["https://creativecommons.org/publicdomain/zero/1.0/legalcode"], "isOsiApproved": false, "isFsfLibre": true}, "CDDL-1.0": {"reference": "https://spdx.org/licenses/CDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.0.json", "referenceNumber": 240, "name": "Common Development and Distribution License 1.0", "licenseId": "CDDL-1.0", "seeAlso": ["https://opensource.org/licenses/cddl1"], "isOsiApproved": true, "isFsfLibre": true}, "CDDL-1.1": {"reference": "https://spdx.org/licenses/CDDL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDDL-1.1.json", "referenceNumber": 474, "name": "Common Development and Distribution License 1.1", "licenseId": "CDDL-1.1", "seeAlso": ["http://glassfish.java.net/public/CDDL+GPL_1_1.html", "https://javaee.github.io/glassfish/LICENSE"], "isOsiApproved": false}, "CDL-1.0": {"reference": "https://spdx.org/licenses/CDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDL-1.0.json", "referenceNumber": 124, "name": "Common Documentation License 1.0", "licenseId": "CDL-1.0", "seeAlso": ["http://www.opensource.apple.com/cdl/", "https://fedoraproject.org/wiki/Licensing/Common_Documentation_License", "https://www.gnu.org/licenses/license-list.html#ACDL"], "isOsiApproved": false}, "CDLA-Permissive-1.0": {"reference": "https://spdx.org/licenses/CDLA-Permissive-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-1.0.json", "referenceNumber": 62, "name": "Community Data License Agreement Permissive 1.0", "licenseId": "CDLA-Permissive-1.0", "seeAlso": ["https://cdla.io/permissive-1-0"], "isOsiApproved": false}, "CDLA-Permissive-2.0": {"reference": "https://spdx.org/licenses/CDLA-Permissive-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Permissive-2.0.json", "referenceNumber": 381, "name": "Community Data License Agreement Permissive 2.0", "licenseId": "CDLA-Permissive-2.0", "seeAlso": ["https://cdla.dev/permissive-2-0"], "isOsiApproved": false}, "CDLA-Sharing-1.0": {"reference": "https://spdx.org/licenses/CDLA-Sharing-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CDLA-Sharing-1.0.json", "referenceNumber": 426, "name": "Community Data License Agreement Sharing 1.0", "licenseId": "CDLA-Sharing-1.0", "seeAlso": ["https://cdla.io/sharing-1-0"], "isOsiApproved": false}, "CECILL-1.0": {"reference": "https://spdx.org/licenses/CECILL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.0.json", "referenceNumber": 16, "name": "CeCILL Free Software License Agreement v1.0", "licenseId": "CECILL-1.0", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html"], "isOsiApproved": false}, "CECILL-1.1": {"reference": "https://spdx.org/licenses/CECILL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-1.1.json", "referenceNumber": 91, "name": "CeCILL Free Software License Agreement v1.1", "licenseId": "CECILL-1.1", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html"], "isOsiApproved": false}, "CECILL-2.0": {"reference": "https://spdx.org/licenses/CECILL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.0.json", "referenceNumber": 468, "name": "CeCILL Free Software License Agreement v2.0", "licenseId": "CECILL-2.0", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL_V2-en.html"], "isOsiApproved": false, "isFsfLibre": true}, "CECILL-2.1": {"reference": "https://spdx.org/licenses/CECILL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-2.1.json", "referenceNumber": 308, "name": "CeCILL Free Software License Agreement v2.1", "licenseId": "CECILL-2.1", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html"], "isOsiApproved": true}, "CECILL-B": {"reference": "https://spdx.org/licenses/CECILL-B.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-B.json", "referenceNumber": 454, "name": "CeCILL-B Free Software License Agreement", "licenseId": "CECILL-B", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html"], "isOsiApproved": false, "isFsfLibre": true}, "CECILL-C": {"reference": "https://spdx.org/licenses/CECILL-C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CECILL-C.json", "referenceNumber": 354, "name": "CeCILL-C Free Software License Agreement", "licenseId": "CECILL-C", "seeAlso": ["http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html"], "isOsiApproved": false, "isFsfLibre": true}, "CERN-OHL-1.1": {"reference": "https://spdx.org/licenses/CERN-OHL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.1.json", "referenceNumber": 55, "name": "CERN Open Hardware Licence v1.1", "licenseId": "CERN-OHL-1.1", "seeAlso": ["https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1"], "isOsiApproved": false}, "CERN-OHL-1.2": {"reference": "https://spdx.org/licenses/CERN-OHL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-1.2.json", "referenceNumber": 186, "name": "CERN Open Hardware Licence v1.2", "licenseId": "CERN-OHL-1.2", "seeAlso": ["https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2"], "isOsiApproved": false}, "CERN-OHL-P-2.0": {"reference": "https://spdx.org/licenses/CERN-OHL-P-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-P-2.0.json", "referenceNumber": 122, "name": "CERN Open Hardware Licence Version 2 - Permissive", "licenseId": "CERN-OHL-P-2.0", "seeAlso": ["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"], "isOsiApproved": true}, "CERN-OHL-S-2.0": {"reference": "https://spdx.org/licenses/CERN-OHL-S-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-S-2.0.json", "referenceNumber": 178, "name": "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", "licenseId": "CERN-OHL-S-2.0", "seeAlso": ["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"], "isOsiApproved": true}, "CERN-OHL-W-2.0": {"reference": "https://spdx.org/licenses/CERN-OHL-W-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CERN-OHL-W-2.0.json", "referenceNumber": 211, "name": "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", "licenseId": "CERN-OHL-W-2.0", "seeAlso": ["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"], "isOsiApproved": true}, "checkmk": {"reference": "https://spdx.org/licenses/checkmk.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/checkmk.json", "referenceNumber": 68, "name": "Checkmk License", "licenseId": "checkmk", "seeAlso": ["https://github.com/libcheck/check/blob/master/checkmk/checkmk.in"], "isOsiApproved": false}, "ClArtistic": {"reference": "https://spdx.org/licenses/ClArtistic.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ClArtistic.json", "referenceNumber": 207, "name": "Clarified Artistic License", "licenseId": "ClArtistic", "seeAlso": ["http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/", "http://www.ncftp.com/ncftp/doc/LICENSE.txt"], "isOsiApproved": false, "isFsfLibre": true}, "CNRI-Jython": {"reference": "https://spdx.org/licenses/CNRI-Jython.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Jython.json", "referenceNumber": 103, "name": "CNRI Jython License", "licenseId": "CNRI-Jython", "seeAlso": ["http://www.jython.org/license.html"], "isOsiApproved": false}, "CNRI-Python": {"reference": "https://spdx.org/licenses/CNRI-Python.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python.json", "referenceNumber": 390, "name": "CNRI Python License", "licenseId": "CNRI-Python", "seeAlso": ["https://opensource.org/licenses/CNRI-Python"], "isOsiApproved": true}, "CNRI-Python-GPL-Compatible": {"reference": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CNRI-Python-GPL-Compatible.json", "referenceNumber": 125, "name": "CNRI Python Open Source GPL Compatible License Agreement", "licenseId": "CNRI-Python-GPL-Compatible", "seeAlso": ["http://www.python.org/download/releases/1.6.1/download_win/"], "isOsiApproved": false}, "COIL-1.0": {"reference": "https://spdx.org/licenses/COIL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/COIL-1.0.json", "referenceNumber": 126, "name": "Copyfree Open Innovation License", "licenseId": "COIL-1.0", "seeAlso": ["https://coil.apotheon.org/plaintext/01.0.txt"], "isOsiApproved": false}, "Community-Spec-1.0": {"reference": "https://spdx.org/licenses/Community-Spec-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Community-Spec-1.0.json", "referenceNumber": 184, "name": "Community Specification License 1.0", "licenseId": "Community-Spec-1.0", "seeAlso": ["https://github.com/CommunitySpecification/1.0/blob/master/1._Community_Specification_License-v1.md"], "isOsiApproved": false}, "Condor-1.1": {"reference": "https://spdx.org/licenses/Condor-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Condor-1.1.json", "referenceNumber": 382, "name": "Condor Public License v1.1", "licenseId": "Condor-1.1", "seeAlso": ["http://research.cs.wisc.edu/condor/license.html#condor", "http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor"], "isOsiApproved": false, "isFsfLibre": true}, "copyleft-next-0.3.0": {"reference": "https://spdx.org/licenses/copyleft-next-0.3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.0.json", "referenceNumber": 44, "name": "copyleft-next 0.3.0", "licenseId": "copyleft-next-0.3.0", "seeAlso": ["https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0"], "isOsiApproved": false}, "copyleft-next-0.3.1": {"reference": "https://spdx.org/licenses/copyleft-next-0.3.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/copyleft-next-0.3.1.json", "referenceNumber": 353, "name": "copyleft-next 0.3.1", "licenseId": "copyleft-next-0.3.1", "seeAlso": ["https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1"], "isOsiApproved": false}, "CPAL-1.0": {"reference": "https://spdx.org/licenses/CPAL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPAL-1.0.json", "referenceNumber": 459, "name": "Common Public Attribution License 1.0", "licenseId": "CPAL-1.0", "seeAlso": ["https://opensource.org/licenses/CPAL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "CPL-1.0": {"reference": "https://spdx.org/licenses/CPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPL-1.0.json", "referenceNumber": 276, "name": "Common Public License 1.0", "licenseId": "CPL-1.0", "seeAlso": ["https://opensource.org/licenses/CPL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "CPOL-1.02": {"reference": "https://spdx.org/licenses/CPOL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CPOL-1.02.json", "referenceNumber": 473, "name": "Code Project Open License 1.02", "licenseId": "CPOL-1.02", "seeAlso": ["http://www.codeproject.com/info/cpol10.aspx"], "isOsiApproved": false, "isFsfLibre": false}, "Crossword": {"reference": "https://spdx.org/licenses/Crossword.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Crossword.json", "referenceNumber": 49, "name": "Crossword License", "licenseId": "Crossword", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Crossword"], "isOsiApproved": false}, "CrystalStacker": {"reference": "https://spdx.org/licenses/CrystalStacker.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CrystalStacker.json", "referenceNumber": 141, "name": "CrystalStacker License", "licenseId": "CrystalStacker", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd=Licensing/CrystalStacker"], "isOsiApproved": false}, "CUA-OPL-1.0": {"reference": "https://spdx.org/licenses/CUA-OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/CUA-OPL-1.0.json", "referenceNumber": 115, "name": "CUA Office Public License v1.0", "licenseId": "CUA-OPL-1.0", "seeAlso": ["https://opensource.org/licenses/CUA-OPL-1.0"], "isOsiApproved": true}, "Cube": {"reference": "https://spdx.org/licenses/Cube.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Cube.json", "referenceNumber": 230, "name": "Cube License", "licenseId": "Cube", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Cube"], "isOsiApproved": false}, "curl": {"reference": "https://spdx.org/licenses/curl.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/curl.json", "referenceNumber": 340, "name": "curl License", "licenseId": "curl", "seeAlso": ["https://github.com/bagder/curl/blob/master/COPYING"], "isOsiApproved": false}, "D-FSL-1.0": {"reference": "https://spdx.org/licenses/D-FSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/D-FSL-1.0.json", "referenceNumber": 285, "name": "Deutsche Freie Software Lizenz", "licenseId": "D-FSL-1.0", "seeAlso": ["http://www.dipp.nrw.de/d-fsl/lizenzen/", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt", "http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file", "https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file"], "isOsiApproved": false}, "diffmark": {"reference": "https://spdx.org/licenses/diffmark.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/diffmark.json", "referenceNumber": 37, "name": "diffmark license", "licenseId": "diffmark", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/diffmark"], "isOsiApproved": false}, "DL-DE-BY-2.0": {"reference": "https://spdx.org/licenses/DL-DE-BY-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DL-DE-BY-2.0.json", "referenceNumber": 261, "name": "Data licence Germany \u2013 attribution \u2013 version 2.0", "licenseId": "DL-DE-BY-2.0", "seeAlso": ["https://www.govdata.de/dl-de/by-2-0"], "isOsiApproved": false}, "DOC": {"reference": "https://spdx.org/licenses/DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DOC.json", "referenceNumber": 445, "name": "DOC License", "licenseId": "DOC", "seeAlso": ["http://www.cs.wustl.edu/~schmidt/ACE-copying.html", "https://www.dre.vanderbilt.edu/~schmidt/ACE-copying.html"], "isOsiApproved": false}, "Dotseqn": {"reference": "https://spdx.org/licenses/Dotseqn.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Dotseqn.json", "referenceNumber": 45, "name": "Dotseqn License", "licenseId": "Dotseqn", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Dotseqn"], "isOsiApproved": false}, "DRL-1.0": {"reference": "https://spdx.org/licenses/DRL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DRL-1.0.json", "referenceNumber": 236, "name": "Detection Rule License 1.0", "licenseId": "DRL-1.0", "seeAlso": ["https://github.com/Neo23x0/sigma/blob/master/LICENSE.Detection.Rules.md"], "isOsiApproved": false}, "DSDP": {"reference": "https://spdx.org/licenses/DSDP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/DSDP.json", "referenceNumber": 398, "name": "DSDP License", "licenseId": "DSDP", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/DSDP"], "isOsiApproved": false}, "dvipdfm": {"reference": "https://spdx.org/licenses/dvipdfm.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/dvipdfm.json", "referenceNumber": 383, "name": "dvipdfm License", "licenseId": "dvipdfm", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/dvipdfm"], "isOsiApproved": false}, "ECL-1.0": {"reference": "https://spdx.org/licenses/ECL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-1.0.json", "referenceNumber": 293, "name": "Educational Community License v1.0", "licenseId": "ECL-1.0", "seeAlso": ["https://opensource.org/licenses/ECL-1.0"], "isOsiApproved": true}, "ECL-2.0": {"reference": "https://spdx.org/licenses/ECL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ECL-2.0.json", "referenceNumber": 35, "name": "Educational Community License v2.0", "licenseId": "ECL-2.0", "seeAlso": ["https://opensource.org/licenses/ECL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "eCos-2.0": {"reference": "https://spdx.org/licenses/eCos-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/eCos-2.0.json", "referenceNumber": 280, "name": "eCos license version 2.0", "licenseId": "eCos-2.0", "seeAlso": ["https://www.gnu.org/licenses/ecos-license.html"], "isOsiApproved": false, "isFsfLibre": true}, "EFL-1.0": {"reference": "https://spdx.org/licenses/EFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-1.0.json", "referenceNumber": 235, "name": "Eiffel Forum License v1.0", "licenseId": "EFL-1.0", "seeAlso": ["http://www.eiffel-nice.org/license/forum.txt", "https://opensource.org/licenses/EFL-1.0"], "isOsiApproved": true}, "EFL-2.0": {"reference": "https://spdx.org/licenses/EFL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EFL-2.0.json", "referenceNumber": 403, "name": "Eiffel Forum License v2.0", "licenseId": "EFL-2.0", "seeAlso": ["http://www.eiffel-nice.org/license/eiffel-forum-license-2.html", "https://opensource.org/licenses/EFL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "eGenix": {"reference": "https://spdx.org/licenses/eGenix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/eGenix.json", "referenceNumber": 241, "name": "eGenix.com Public License 1.1.0", "licenseId": "eGenix", "seeAlso": ["http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf", "https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0"], "isOsiApproved": false}, "Elastic-2.0": {"reference": "https://spdx.org/licenses/Elastic-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Elastic-2.0.json", "referenceNumber": 272, "name": "Elastic License 2.0", "licenseId": "Elastic-2.0", "seeAlso": ["https://www.elastic.co/licensing/elastic-license", "https://github.com/elastic/elasticsearch/blob/master/licenses/ELASTIC-LICENSE-2.0.txt"], "isOsiApproved": false}, "Entessa": {"reference": "https://spdx.org/licenses/Entessa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Entessa.json", "referenceNumber": 479, "name": "Entessa Public License v1.0", "licenseId": "Entessa", "seeAlso": ["https://opensource.org/licenses/Entessa"], "isOsiApproved": true}, "EPICS": {"reference": "https://spdx.org/licenses/EPICS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPICS.json", "referenceNumber": 27, "name": "EPICS Open License", "licenseId": "EPICS", "seeAlso": ["https://epics.anl.gov/license/open.php"], "isOsiApproved": false}, "EPL-1.0": {"reference": "https://spdx.org/licenses/EPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-1.0.json", "referenceNumber": 448, "name": "Eclipse Public License 1.0", "licenseId": "EPL-1.0", "seeAlso": ["http://www.eclipse.org/legal/epl-v10.html", "https://opensource.org/licenses/EPL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "EPL-2.0": {"reference": "https://spdx.org/licenses/EPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EPL-2.0.json", "referenceNumber": 17, "name": "Eclipse Public License 2.0", "licenseId": "EPL-2.0", "seeAlso": ["https://www.eclipse.org/legal/epl-2.0", "https://www.opensource.org/licenses/EPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "ErlPL-1.1": {"reference": "https://spdx.org/licenses/ErlPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ErlPL-1.1.json", "referenceNumber": 108, "name": "Erlang Public License v1.1", "licenseId": "ErlPL-1.1", "seeAlso": ["http://www.erlang.org/EPLICENSE"], "isOsiApproved": false}, "etalab-2.0": {"reference": "https://spdx.org/licenses/etalab-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/etalab-2.0.json", "referenceNumber": 476, "name": "Etalab Open License 2.0", "licenseId": "etalab-2.0", "seeAlso": ["https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf", "https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE"], "isOsiApproved": false}, "EUDatagrid": {"reference": "https://spdx.org/licenses/EUDatagrid.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUDatagrid.json", "referenceNumber": 399, "name": "EU DataGrid Software License", "licenseId": "EUDatagrid", "seeAlso": ["http://eu-datagrid.web.cern.ch/eu-datagrid/license.html", "https://opensource.org/licenses/EUDatagrid"], "isOsiApproved": true, "isFsfLibre": true}, "EUPL-1.0": {"reference": "https://spdx.org/licenses/EUPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.0.json", "referenceNumber": 74, "name": "European Union Public License 1.0", "licenseId": "EUPL-1.0", "seeAlso": ["http://ec.europa.eu/idabc/en/document/7330.html", "http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id=31096"], "isOsiApproved": false}, "EUPL-1.1": {"reference": "https://spdx.org/licenses/EUPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.1.json", "referenceNumber": 1, "name": "European Union Public License 1.1", "licenseId": "EUPL-1.1", "seeAlso": ["https://joinup.ec.europa.eu/software/page/eupl/licence-eupl", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf", "https://opensource.org/licenses/EUPL-1.1"], "isOsiApproved": true, "isFsfLibre": true}, "EUPL-1.2": {"reference": "https://spdx.org/licenses/EUPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/EUPL-1.2.json", "referenceNumber": 413, "name": "European Union Public License 1.2", "licenseId": "EUPL-1.2", "seeAlso": ["https://joinup.ec.europa.eu/page/eupl-text-11-12", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf", "https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt", "https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt", "http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32017D0863", "https://opensource.org/licenses/EUPL-1.2"], "isOsiApproved": true, "isFsfLibre": true}, "Eurosym": {"reference": "https://spdx.org/licenses/Eurosym.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Eurosym.json", "referenceNumber": 461, "name": "Eurosym License", "licenseId": "Eurosym", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Eurosym"], "isOsiApproved": false}, "Fair": {"reference": "https://spdx.org/licenses/Fair.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Fair.json", "referenceNumber": 175, "name": "Fair License", "licenseId": "Fair", "seeAlso": ["http://fairlicense.org/", "https://opensource.org/licenses/Fair"], "isOsiApproved": true}, "FDK-AAC": {"reference": "https://spdx.org/licenses/FDK-AAC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FDK-AAC.json", "referenceNumber": 26, "name": "Fraunhofer FDK AAC Codec Library", "licenseId": "FDK-AAC", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/FDK-AAC", "https://directory.fsf.org/wiki/License:Fdk"], "isOsiApproved": false}, "Frameworx-1.0": {"reference": "https://spdx.org/licenses/Frameworx-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Frameworx-1.0.json", "referenceNumber": 42, "name": "Frameworx Open License 1.0", "licenseId": "Frameworx-1.0", "seeAlso": ["https://opensource.org/licenses/Frameworx-1.0"], "isOsiApproved": true}, "FreeBSD-DOC": {"reference": "https://spdx.org/licenses/FreeBSD-DOC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeBSD-DOC.json", "referenceNumber": 38, "name": "FreeBSD Documentation License", "licenseId": "FreeBSD-DOC", "seeAlso": ["https://www.freebsd.org/copyright/freebsd-doc-license/"], "isOsiApproved": false}, "FreeImage": {"reference": "https://spdx.org/licenses/FreeImage.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FreeImage.json", "referenceNumber": 131, "name": "FreeImage Public License v1.0", "licenseId": "FreeImage", "seeAlso": ["http://freeimage.sourceforge.net/freeimage-license.txt"], "isOsiApproved": false}, "FSFAP": {"reference": "https://spdx.org/licenses/FSFAP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFAP.json", "referenceNumber": 119, "name": "FSF All Permissive License", "licenseId": "FSFAP", "seeAlso": ["https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html"], "isOsiApproved": false, "isFsfLibre": true}, "FSFUL": {"reference": "https://spdx.org/licenses/FSFUL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFUL.json", "referenceNumber": 213, "name": "FSF Unlimited License", "licenseId": "FSFUL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License"], "isOsiApproved": false}, "FSFULLR": {"reference": "https://spdx.org/licenses/FSFULLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLR.json", "referenceNumber": 41, "name": "FSF Unlimited License (with License Retention)", "licenseId": "FSFULLR", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant"], "isOsiApproved": false}, "FSFULLRWD": {"reference": "https://spdx.org/licenses/FSFULLRWD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FSFULLRWD.json", "referenceNumber": 249, "name": "FSF Unlimited License (With License Retention and Warranty Disclaimer)", "licenseId": "FSFULLRWD", "seeAlso": ["https://lists.gnu.org/archive/html/autoconf/2012-04/msg00061.html"], "isOsiApproved": false}, "FTL": {"reference": "https://spdx.org/licenses/FTL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/FTL.json", "referenceNumber": 384, "name": "Freetype Project License", "licenseId": "FTL", "seeAlso": ["http://freetype.fis.uniroma2.it/FTL.TXT", "http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT", "http://gitlab.freedesktop.org/freetype/freetype/-/raw/master/docs/FTL.TXT"], "isOsiApproved": false, "isFsfLibre": true}, "GD": {"reference": "https://spdx.org/licenses/GD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GD.json", "referenceNumber": 475, "name": "GD License", "licenseId": "GD", "seeAlso": ["https://libgd.github.io/manuals/2.3.0/files/license-txt.html"], "isOsiApproved": false}, "GFDL-1.1": {"reference": "https://spdx.org/licenses/GFDL-1.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1.json", "referenceNumber": 349, "name": "GNU Free Documentation License v1.1", "licenseId": "GFDL-1.1", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.1-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.1-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-only.json", "referenceNumber": 22, "name": "GNU Free Documentation License v1.1 only - invariants", "licenseId": "GFDL-1.1-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false}, "GFDL-1.1-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-invariants-or-later.json", "referenceNumber": 316, "name": "GNU Free Documentation License v1.1 or later - invariants", "licenseId": "GFDL-1.1-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false}, "GFDL-1.1-no-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-only.json", "referenceNumber": 442, "name": "GNU Free Documentation License v1.1 only - no invariants", "licenseId": "GFDL-1.1-no-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false}, "GFDL-1.1-no-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json", "referenceNumber": 311, "name": "GNU Free Documentation License v1.1 or later - no invariants", "licenseId": "GFDL-1.1-no-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false}, "GFDL-1.1-only": {"reference": "https://spdx.org/licenses/GFDL-1.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-only.json", "referenceNumber": 0, "name": "GNU Free Documentation License v1.1 only", "licenseId": "GFDL-1.1-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.1-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.1-or-later.json", "referenceNumber": 153, "name": "GNU Free Documentation License v1.1 or later", "licenseId": "GFDL-1.1-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.2": {"reference": "https://spdx.org/licenses/GFDL-1.2.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2.json", "referenceNumber": 294, "name": "GNU Free Documentation License v1.2", "licenseId": "GFDL-1.2", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.2-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.2-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-only.json", "referenceNumber": 472, "name": "GNU Free Documentation License v1.2 only - invariants", "licenseId": "GFDL-1.2-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false}, "GFDL-1.2-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-invariants-or-later.json", "referenceNumber": 452, "name": "GNU Free Documentation License v1.2 or later - invariants", "licenseId": "GFDL-1.2-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false}, "GFDL-1.2-no-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-only.json", "referenceNumber": 193, "name": "GNU Free Documentation License v1.2 only - no invariants", "licenseId": "GFDL-1.2-no-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false}, "GFDL-1.2-no-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json", "referenceNumber": 217, "name": "GNU Free Documentation License v1.2 or later - no invariants", "licenseId": "GFDL-1.2-no-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false}, "GFDL-1.2-only": {"reference": "https://spdx.org/licenses/GFDL-1.2-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-only.json", "referenceNumber": 385, "name": "GNU Free Documentation License v1.2 only", "licenseId": "GFDL-1.2-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.2-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.2-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.2-or-later.json", "referenceNumber": 317, "name": "GNU Free Documentation License v1.2 or later", "licenseId": "GFDL-1.2-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.3": {"reference": "https://spdx.org/licenses/GFDL-1.3.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3.json", "referenceNumber": 463, "name": "GNU Free Documentation License v1.3", "licenseId": "GFDL-1.3", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.3-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.3-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-only.json", "referenceNumber": 258, "name": "GNU Free Documentation License v1.3 only - invariants", "licenseId": "GFDL-1.3-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false}, "GFDL-1.3-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-invariants-or-later.json", "referenceNumber": 189, "name": "GNU Free Documentation License v1.3 or later - invariants", "licenseId": "GFDL-1.3-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false}, "GFDL-1.3-no-invariants-only": {"reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-only.json", "referenceNumber": 338, "name": "GNU Free Documentation License v1.3 only - no invariants", "licenseId": "GFDL-1.3-no-invariants-only", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false}, "GFDL-1.3-no-invariants-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json", "referenceNumber": 288, "name": "GNU Free Documentation License v1.3 or later - no invariants", "licenseId": "GFDL-1.3-no-invariants-or-later", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false}, "GFDL-1.3-only": {"reference": "https://spdx.org/licenses/GFDL-1.3-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-only.json", "referenceNumber": 279, "name": "GNU Free Documentation License v1.3 only", "licenseId": "GFDL-1.3-only", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false, "isFsfLibre": true}, "GFDL-1.3-or-later": {"reference": "https://spdx.org/licenses/GFDL-1.3-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GFDL-1.3-or-later.json", "referenceNumber": 428, "name": "GNU Free Documentation License v1.3 or later", "licenseId": "GFDL-1.3-or-later", "seeAlso": ["https://www.gnu.org/licenses/fdl-1.3.txt"], "isOsiApproved": false, "isFsfLibre": true}, "Giftware": {"reference": "https://spdx.org/licenses/Giftware.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Giftware.json", "referenceNumber": 352, "name": "Giftware License", "licenseId": "Giftware", "seeAlso": ["http://liballeg.org/license.html#allegro-4-the-giftware-license"], "isOsiApproved": false}, "GL2PS": {"reference": "https://spdx.org/licenses/GL2PS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GL2PS.json", "referenceNumber": 176, "name": "GL2PS License", "licenseId": "GL2PS", "seeAlso": ["http://www.geuz.org/gl2ps/COPYING.GL2PS"], "isOsiApproved": false}, "Glide": {"reference": "https://spdx.org/licenses/Glide.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glide.json", "referenceNumber": 120, "name": "3dfx Glide License", "licenseId": "Glide", "seeAlso": ["http://www.users.on.net/~triforce/glidexp/COPYING.txt"], "isOsiApproved": false}, "Glulxe": {"reference": "https://spdx.org/licenses/Glulxe.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Glulxe.json", "referenceNumber": 457, "name": "Glulxe License", "licenseId": "Glulxe", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Glulxe"], "isOsiApproved": false}, "GLWTPL": {"reference": "https://spdx.org/licenses/GLWTPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GLWTPL.json", "referenceNumber": 12, "name": "Good Luck With That Public License", "licenseId": "GLWTPL", "seeAlso": ["https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85"], "isOsiApproved": false}, "gnuplot": {"reference": "https://spdx.org/licenses/gnuplot.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gnuplot.json", "referenceNumber": 167, "name": "gnuplot License", "licenseId": "gnuplot", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Gnuplot"], "isOsiApproved": false, "isFsfLibre": true}, "GPL-1.0": {"reference": "https://spdx.org/licenses/GPL-1.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0.json", "referenceNumber": 481, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"], "isOsiApproved": false}, "GPL-1.0+": {"reference": "https://spdx.org/licenses/GPL-1.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-1.0+.json", "referenceNumber": 31, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0+", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"], "isOsiApproved": false}, "GPL-1.0-only": {"reference": "https://spdx.org/licenses/GPL-1.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-only.json", "referenceNumber": 282, "name": "GNU General Public License v1.0 only", "licenseId": "GPL-1.0-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"], "isOsiApproved": false}, "GPL-1.0-or-later": {"reference": "https://spdx.org/licenses/GPL-1.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-1.0-or-later.json", "referenceNumber": 421, "name": "GNU General Public License v1.0 or later", "licenseId": "GPL-1.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"], "isOsiApproved": false}, "GPL-2.0": {"reference": "https://spdx.org/licenses/GPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0.json", "referenceNumber": 159, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-2.0+": {"reference": "https://spdx.org/licenses/GPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0+.json", "referenceNumber": 114, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0+", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-2.0-only": {"reference": "https://spdx.org/licenses/GPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-only.json", "referenceNumber": 18, "name": "GNU General Public License v2.0 only", "licenseId": "GPL-2.0-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-2.0-or-later": {"reference": "https://spdx.org/licenses/GPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-or-later.json", "referenceNumber": 466, "name": "GNU General Public License v2.0 or later", "licenseId": "GPL-2.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html", "https://opensource.org/licenses/GPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-2.0-with-autoconf-exception": {"reference": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json", "referenceNumber": 309, "name": "GNU General Public License v2.0 w/Autoconf exception", "licenseId": "GPL-2.0-with-autoconf-exception", "seeAlso": ["http://ac-archive.sourceforge.net/doc/copyright.html"], "isOsiApproved": false}, "GPL-2.0-with-bison-exception": {"reference": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-bison-exception.json", "referenceNumber": 368, "name": "GNU General Public License v2.0 w/Bison exception", "licenseId": "GPL-2.0-with-bison-exception", "seeAlso": ["http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id=193d7c7054ba7197b0789e14965b739162319b5e#n141"], "isOsiApproved": false}, "GPL-2.0-with-classpath-exception": {"reference": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-classpath-exception.json", "referenceNumber": 14, "name": "GNU General Public License v2.0 w/Classpath exception", "licenseId": "GPL-2.0-with-classpath-exception", "seeAlso": ["https://www.gnu.org/software/classpath/license.html"], "isOsiApproved": false}, "GPL-2.0-with-font-exception": {"reference": "https://spdx.org/licenses/GPL-2.0-with-font-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-font-exception.json", "referenceNumber": 196, "name": "GNU General Public License v2.0 w/Font exception", "licenseId": "GPL-2.0-with-font-exception", "seeAlso": ["https://www.gnu.org/licenses/gpl-faq.html#FontException"], "isOsiApproved": false}, "GPL-2.0-with-GCC-exception": {"reference": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-2.0-with-GCC-exception.json", "referenceNumber": 129, "name": "GNU General Public License v2.0 w/GCC Runtime Library exception", "licenseId": "GPL-2.0-with-GCC-exception", "seeAlso": ["https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/libgcc1.c;h=762f5143fc6eed57b6797c82710f3538aa52b40b;hb=cb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10"], "isOsiApproved": false}, "GPL-3.0": {"reference": "https://spdx.org/licenses/GPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0.json", "referenceNumber": 169, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0", "seeAlso": ["https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-3.0+": {"reference": "https://spdx.org/licenses/GPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0+.json", "referenceNumber": 343, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0+", "seeAlso": ["https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-3.0-only": {"reference": "https://spdx.org/licenses/GPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-only.json", "referenceNumber": 462, "name": "GNU General Public License v3.0 only", "licenseId": "GPL-3.0-only", "seeAlso": ["https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-3.0-or-later": {"reference": "https://spdx.org/licenses/GPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-or-later.json", "referenceNumber": 388, "name": "GNU General Public License v3.0 or later", "licenseId": "GPL-3.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/gpl-3.0-standalone.html", "https://opensource.org/licenses/GPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "GPL-3.0-with-autoconf-exception": {"reference": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json", "referenceNumber": 395, "name": "GNU General Public License v3.0 w/Autoconf exception", "licenseId": "GPL-3.0-with-autoconf-exception", "seeAlso": ["https://www.gnu.org/licenses/autoconf-exception-3.0.html"], "isOsiApproved": false}, "GPL-3.0-with-GCC-exception": {"reference": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/GPL-3.0-with-GCC-exception.json", "referenceNumber": 146, "name": "GNU General Public License v3.0 w/GCC Runtime Library exception", "licenseId": "GPL-3.0-with-GCC-exception", "seeAlso": ["https://www.gnu.org/licenses/gcc-exception-3.1.html"], "isOsiApproved": true}, "gSOAP-1.3b": {"reference": "https://spdx.org/licenses/gSOAP-1.3b.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/gSOAP-1.3b.json", "referenceNumber": 379, "name": "gSOAP Public License v1.3b", "licenseId": "gSOAP-1.3b", "seeAlso": ["http://www.cs.fsu.edu/~engelen/license.html"], "isOsiApproved": false}, "HaskellReport": {"reference": "https://spdx.org/licenses/HaskellReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HaskellReport.json", "referenceNumber": 58, "name": "Haskell Language Report License", "licenseId": "HaskellReport", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License"], "isOsiApproved": false}, "Hippocratic-2.1": {"reference": "https://spdx.org/licenses/Hippocratic-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Hippocratic-2.1.json", "referenceNumber": 284, "name": "Hippocratic License 2.1", "licenseId": "Hippocratic-2.1", "seeAlso": ["https://firstdonoharm.dev/version/2/1/license.html", "https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt"], "isOsiApproved": false}, "HPND": {"reference": "https://spdx.org/licenses/HPND.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND.json", "referenceNumber": 419, "name": "Historical Permission Notice and Disclaimer", "licenseId": "HPND", "seeAlso": ["https://opensource.org/licenses/HPND"], "isOsiApproved": true, "isFsfLibre": true}, "HPND-sell-variant": {"reference": "https://spdx.org/licenses/HPND-sell-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HPND-sell-variant.json", "referenceNumber": 268, "name": "Historical Permission Notice and Disclaimer - sell variant", "licenseId": "HPND-sell-variant", "seeAlso": ["https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h=v4.19"], "isOsiApproved": false}, "HTMLTIDY": {"reference": "https://spdx.org/licenses/HTMLTIDY.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/HTMLTIDY.json", "referenceNumber": 298, "name": "HTML Tidy License", "licenseId": "HTMLTIDY", "seeAlso": ["https://github.com/htacg/tidy-html5/blob/next/README/LICENSE.md"], "isOsiApproved": false}, "IBM-pibs": {"reference": "https://spdx.org/licenses/IBM-pibs.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IBM-pibs.json", "referenceNumber": 490, "name": "IBM PowerPC Initialization and Boot Software", "licenseId": "IBM-pibs", "seeAlso": ["http://git.denx.de/?p=u-boot.git;a=blob;f=arch/powerpc/cpu/ppc4xx/miiphy.c;h=297155fdafa064b955e53e9832de93bfb0cfb85b;hb=9fab4bf4cc077c21e43941866f3f2c196f28670d"], "isOsiApproved": false}, "ICU": {"reference": "https://spdx.org/licenses/ICU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ICU.json", "referenceNumber": 187, "name": "ICU License", "licenseId": "ICU", "seeAlso": ["http://source.icu-project.org/repos/icu/icu/trunk/license.html"], "isOsiApproved": false}, "IJG": {"reference": "https://spdx.org/licenses/IJG.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IJG.json", "referenceNumber": 28, "name": "Independent JPEG Group License", "licenseId": "IJG", "seeAlso": ["http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev=1.2"], "isOsiApproved": false, "isFsfLibre": true}, "ImageMagick": {"reference": "https://spdx.org/licenses/ImageMagick.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ImageMagick.json", "referenceNumber": 480, "name": "ImageMagick License", "licenseId": "ImageMagick", "seeAlso": ["http://www.imagemagick.org/script/license.php"], "isOsiApproved": false}, "iMatix": {"reference": "https://spdx.org/licenses/iMatix.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/iMatix.json", "referenceNumber": 441, "name": "iMatix Standard Function Library Agreement", "licenseId": "iMatix", "seeAlso": ["http://legacy.imatix.com/html/sfl/sfl4.htm#license"], "isOsiApproved": false, "isFsfLibre": true}, "Imlib2": {"reference": "https://spdx.org/licenses/Imlib2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Imlib2.json", "referenceNumber": 254, "name": "Imlib2 License", "licenseId": "Imlib2", "seeAlso": ["http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING", "https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING"], "isOsiApproved": false, "isFsfLibre": true}, "Info-ZIP": {"reference": "https://spdx.org/licenses/Info-ZIP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Info-ZIP.json", "referenceNumber": 243, "name": "Info-ZIP License", "licenseId": "Info-ZIP", "seeAlso": ["http://www.info-zip.org/license.html"], "isOsiApproved": false}, "Intel": {"reference": "https://spdx.org/licenses/Intel.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel.json", "referenceNumber": 416, "name": "Intel Open Source License", "licenseId": "Intel", "seeAlso": ["https://opensource.org/licenses/Intel"], "isOsiApproved": true, "isFsfLibre": true}, "Intel-ACPI": {"reference": "https://spdx.org/licenses/Intel-ACPI.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Intel-ACPI.json", "referenceNumber": 369, "name": "Intel ACPI Software License Agreement", "licenseId": "Intel-ACPI", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement"], "isOsiApproved": false}, "Interbase-1.0": {"reference": "https://spdx.org/licenses/Interbase-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Interbase-1.0.json", "referenceNumber": 498, "name": "Interbase Public License v1.0", "licenseId": "Interbase-1.0", "seeAlso": ["https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html"], "isOsiApproved": false}, "IPA": {"reference": "https://spdx.org/licenses/IPA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPA.json", "referenceNumber": 232, "name": "IPA Font License", "licenseId": "IPA", "seeAlso": ["https://opensource.org/licenses/IPA"], "isOsiApproved": true, "isFsfLibre": true}, "IPL-1.0": {"reference": "https://spdx.org/licenses/IPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/IPL-1.0.json", "referenceNumber": 439, "name": "IBM Public License v1.0", "licenseId": "IPL-1.0", "seeAlso": ["https://opensource.org/licenses/IPL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "ISC": {"reference": "https://spdx.org/licenses/ISC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ISC.json", "referenceNumber": 61, "name": "ISC License", "licenseId": "ISC", "seeAlso": ["https://www.isc.org/licenses/", "https://www.isc.org/downloads/software-support-policy/isc-license/", "https://opensource.org/licenses/ISC"], "isOsiApproved": true, "isFsfLibre": true}, "Jam": {"reference": "https://spdx.org/licenses/Jam.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Jam.json", "referenceNumber": 139, "name": "Jam License", "licenseId": "Jam", "seeAlso": ["https://www.boost.org/doc/libs/1_35_0/doc/html/jam.html", "https://web.archive.org/web/20160330173339/https://swarm.workshop.perforce.com/files/guest/perforce_software/jam/src/README"], "isOsiApproved": true}, "JasPer-2.0": {"reference": "https://spdx.org/licenses/JasPer-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JasPer-2.0.json", "referenceNumber": 287, "name": "JasPer License", "licenseId": "JasPer-2.0", "seeAlso": ["http://www.ece.uvic.ca/~mdadams/jasper/LICENSE"], "isOsiApproved": false}, "JPNIC": {"reference": "https://spdx.org/licenses/JPNIC.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JPNIC.json", "referenceNumber": 433, "name": "Japan Network Information Center License", "licenseId": "JPNIC", "seeAlso": ["https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366"], "isOsiApproved": false}, "JSON": {"reference": "https://spdx.org/licenses/JSON.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/JSON.json", "referenceNumber": 172, "name": "JSON License", "licenseId": "JSON", "seeAlso": ["http://www.json.org/license.html"], "isOsiApproved": false, "isFsfLibre": false}, "Knuth-CTAN": {"reference": "https://spdx.org/licenses/Knuth-CTAN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Knuth-CTAN.json", "referenceNumber": 75, "name": "Knuth CTAN License", "licenseId": "Knuth-CTAN", "seeAlso": ["https://ctan.org/license/knuth"], "isOsiApproved": false}, "LAL-1.2": {"reference": "https://spdx.org/licenses/LAL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.2.json", "referenceNumber": 181, "name": "Licence Art Libre 1.2", "licenseId": "LAL-1.2", "seeAlso": ["http://artlibre.org/licence/lal/licence-art-libre-12/"], "isOsiApproved": false}, "LAL-1.3": {"reference": "https://spdx.org/licenses/LAL-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LAL-1.3.json", "referenceNumber": 356, "name": "Licence Art Libre 1.3", "licenseId": "LAL-1.3", "seeAlso": ["https://artlibre.org/"], "isOsiApproved": false}, "Latex2e": {"reference": "https://spdx.org/licenses/Latex2e.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Latex2e.json", "referenceNumber": 229, "name": "Latex2e License", "licenseId": "Latex2e", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Latex2e"], "isOsiApproved": false}, "Leptonica": {"reference": "https://spdx.org/licenses/Leptonica.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Leptonica.json", "referenceNumber": 420, "name": "Leptonica License", "licenseId": "Leptonica", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Leptonica"], "isOsiApproved": false}, "LGPL-2.0": {"reference": "https://spdx.org/licenses/LGPL-2.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0.json", "referenceNumber": 482, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"], "isOsiApproved": true}, "LGPL-2.0+": {"reference": "https://spdx.org/licenses/LGPL-2.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0+.json", "referenceNumber": 214, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0+", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"], "isOsiApproved": true}, "LGPL-2.0-only": {"reference": "https://spdx.org/licenses/LGPL-2.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-only.json", "referenceNumber": 81, "name": "GNU Library General Public License v2 only", "licenseId": "LGPL-2.0-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"], "isOsiApproved": true}, "LGPL-2.0-or-later": {"reference": "https://spdx.org/licenses/LGPL-2.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.0-or-later.json", "referenceNumber": 19, "name": "GNU Library General Public License v2 or later", "licenseId": "LGPL-2.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"], "isOsiApproved": true}, "LGPL-2.1": {"reference": "https://spdx.org/licenses/LGPL-2.1.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1.json", "referenceNumber": 496, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-2.1+": {"reference": "https://spdx.org/licenses/LGPL-2.1+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1+.json", "referenceNumber": 429, "name": "GNU Library General Public License v2.1 or later", "licenseId": "LGPL-2.1+", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-2.1-only": {"reference": "https://spdx.org/licenses/LGPL-2.1-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-only.json", "referenceNumber": 170, "name": "GNU Lesser General Public License v2.1 only", "licenseId": "LGPL-2.1-only", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-2.1-or-later": {"reference": "https://spdx.org/licenses/LGPL-2.1-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-2.1-or-later.json", "referenceNumber": 361, "name": "GNU Lesser General Public License v2.1 or later", "licenseId": "LGPL-2.1-or-later", "seeAlso": ["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html", "https://opensource.org/licenses/LGPL-2.1"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-3.0": {"reference": "https://spdx.org/licenses/LGPL-3.0.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0.json", "referenceNumber": 499, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0", "seeAlso": ["https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-3.0+": {"reference": "https://spdx.org/licenses/LGPL-3.0+.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0+.json", "referenceNumber": 174, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0+", "seeAlso": ["https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-3.0-only": {"reference": "https://spdx.org/licenses/LGPL-3.0-only.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-only.json", "referenceNumber": 307, "name": "GNU Lesser General Public License v3.0 only", "licenseId": "LGPL-3.0-only", "seeAlso": ["https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "LGPL-3.0-or-later": {"reference": "https://spdx.org/licenses/LGPL-3.0-or-later.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPL-3.0-or-later.json", "referenceNumber": 113, "name": "GNU Lesser General Public License v3.0 or later", "licenseId": "LGPL-3.0-or-later", "seeAlso": ["https://www.gnu.org/licenses/lgpl-3.0-standalone.html", "https://www.gnu.org/licenses/lgpl+gpl-3.0.txt", "https://opensource.org/licenses/LGPL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "LGPLLR": {"reference": "https://spdx.org/licenses/LGPLLR.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LGPLLR.json", "referenceNumber": 135, "name": "Lesser General Public License For Linguistic Resources", "licenseId": "LGPLLR", "seeAlso": ["http://www-igm.univ-mlv.fr/~unitex/lgpllr.html"], "isOsiApproved": false}, "Libpng": {"reference": "https://spdx.org/licenses/Libpng.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Libpng.json", "referenceNumber": 386, "name": "libpng License", "licenseId": "Libpng", "seeAlso": ["http://www.libpng.org/pub/png/src/libpng-LICENSE.txt"], "isOsiApproved": false}, "libpng-2.0": {"reference": "https://spdx.org/licenses/libpng-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libpng-2.0.json", "referenceNumber": 303, "name": "PNG Reference Library version 2", "licenseId": "libpng-2.0", "seeAlso": ["http://www.libpng.org/pub/png/src/libpng-LICENSE.txt"], "isOsiApproved": false}, "libselinux-1.0": {"reference": "https://spdx.org/licenses/libselinux-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libselinux-1.0.json", "referenceNumber": 363, "name": "libselinux public domain notice", "licenseId": "libselinux-1.0", "seeAlso": ["https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE"], "isOsiApproved": false}, "libtiff": {"reference": "https://spdx.org/licenses/libtiff.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libtiff.json", "referenceNumber": 237, "name": "libtiff License", "licenseId": "libtiff", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/libtiff"], "isOsiApproved": false}, "libutil-David-Nugent": {"reference": "https://spdx.org/licenses/libutil-David-Nugent.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/libutil-David-Nugent.json", "referenceNumber": 150, "name": "libutil David Nugent License", "licenseId": "libutil-David-Nugent", "seeAlso": ["http://web.mit.edu/freebsd/head/lib/libutil/login_ok.3", "https://cgit.freedesktop.org/libbsd/tree/man/setproctitle.3bsd"], "isOsiApproved": false}, "LiLiQ-P-1.1": {"reference": "https://spdx.org/licenses/LiLiQ-P-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-P-1.1.json", "referenceNumber": 423, "name": "Licence Libre du Qu\u00e9bec \u2013 Permissive version 1.1", "licenseId": "LiLiQ-P-1.1", "seeAlso": ["https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/", "http://opensource.org/licenses/LiLiQ-P-1.1"], "isOsiApproved": true}, "LiLiQ-R-1.1": {"reference": "https://spdx.org/licenses/LiLiQ-R-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-R-1.1.json", "referenceNumber": 262, "name": "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 version 1.1", "licenseId": "LiLiQ-R-1.1", "seeAlso": ["https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-R-1.1"], "isOsiApproved": true}, "LiLiQ-Rplus-1.1": {"reference": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LiLiQ-Rplus-1.1.json", "referenceNumber": 209, "name": "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 forte version 1.1", "licenseId": "LiLiQ-Rplus-1.1", "seeAlso": ["https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/", "http://opensource.org/licenses/LiLiQ-Rplus-1.1"], "isOsiApproved": true}, "Linux-man-pages-copyleft": {"reference": "https://spdx.org/licenses/Linux-man-pages-copyleft.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-man-pages-copyleft.json", "referenceNumber": 4, "name": "Linux man-pages Copyleft", "licenseId": "Linux-man-pages-copyleft", "seeAlso": ["https://www.kernel.org/doc/man-pages/licenses.html"], "isOsiApproved": false}, "Linux-OpenIB": {"reference": "https://spdx.org/licenses/Linux-OpenIB.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Linux-OpenIB.json", "referenceNumber": 173, "name": "Linux Kernel Variant of OpenIB.org license", "licenseId": "Linux-OpenIB", "seeAlso": ["https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h"], "isOsiApproved": false}, "LOOP": {"reference": "https://spdx.org/licenses/LOOP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LOOP.json", "referenceNumber": 321, "name": "Common Lisp LOOP License", "licenseId": "LOOP", "seeAlso": ["https://gitlab.com/embeddable-common-lisp/ecl/-/blob/develop/src/lsp/loop.lsp", "http://git.savannah.gnu.org/cgit/gcl.git/tree/gcl/lsp/gcl_loop.lsp?h=Version_2_6_13pre", "https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/src/code/loop.lisp", "https://github.com/cl-adams/adams/blob/master/LICENSE.md", "https://github.com/blakemcbride/eclipse-lisp/blob/master/lisp/loop.lisp", "https://gitlab.common-lisp.net/cmucl/cmucl/-/blob/master/src/code/loop.lisp"], "isOsiApproved": false}, "LPL-1.0": {"reference": "https://spdx.org/licenses/LPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.0.json", "referenceNumber": 302, "name": "Lucent Public License Version 1.0", "licenseId": "LPL-1.0", "seeAlso": ["https://opensource.org/licenses/LPL-1.0"], "isOsiApproved": true}, "LPL-1.02": {"reference": "https://spdx.org/licenses/LPL-1.02.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPL-1.02.json", "referenceNumber": 332, "name": "Lucent Public License v1.02", "licenseId": "LPL-1.02", "seeAlso": ["http://plan9.bell-labs.com/plan9/license.html", "https://opensource.org/licenses/LPL-1.02"], "isOsiApproved": true, "isFsfLibre": true}, "LPPL-1.0": {"reference": "https://spdx.org/licenses/LPPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.0.json", "referenceNumber": 248, "name": "LaTeX Project Public License v1.0", "licenseId": "LPPL-1.0", "seeAlso": ["http://www.latex-project.org/lppl/lppl-1-0.txt"], "isOsiApproved": false}, "LPPL-1.1": {"reference": "https://spdx.org/licenses/LPPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.1.json", "referenceNumber": 360, "name": "LaTeX Project Public License v1.1", "licenseId": "LPPL-1.1", "seeAlso": ["http://www.latex-project.org/lppl/lppl-1-1.txt"], "isOsiApproved": false}, "LPPL-1.2": {"reference": "https://spdx.org/licenses/LPPL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.2.json", "referenceNumber": 314, "name": "LaTeX Project Public License v1.2", "licenseId": "LPPL-1.2", "seeAlso": ["http://www.latex-project.org/lppl/lppl-1-2.txt"], "isOsiApproved": false, "isFsfLibre": true}, "LPPL-1.3a": {"reference": "https://spdx.org/licenses/LPPL-1.3a.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3a.json", "referenceNumber": 60, "name": "LaTeX Project Public License v1.3a", "licenseId": "LPPL-1.3a", "seeAlso": ["http://www.latex-project.org/lppl/lppl-1-3a.txt"], "isOsiApproved": false, "isFsfLibre": true}, "LPPL-1.3c": {"reference": "https://spdx.org/licenses/LPPL-1.3c.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LPPL-1.3c.json", "referenceNumber": 15, "name": "LaTeX Project Public License v1.3c", "licenseId": "LPPL-1.3c", "seeAlso": ["http://www.latex-project.org/lppl/lppl-1-3c.txt", "https://opensource.org/licenses/LPPL-1.3c"], "isOsiApproved": true}, "LZMA-SDK-9.11-to-9.20": {"reference": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.11-to-9.20.json", "referenceNumber": 98, "name": "LZMA SDK License (versions 9.11 to 9.20)", "licenseId": "LZMA-SDK-9.11-to-9.20", "seeAlso": ["https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/"], "isOsiApproved": false}, "LZMA-SDK-9.22": {"reference": "https://spdx.org/licenses/LZMA-SDK-9.22.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/LZMA-SDK-9.22.json", "referenceNumber": 34, "name": "LZMA SDK License (versions 9.22 and beyond)", "licenseId": "LZMA-SDK-9.22", "seeAlso": ["https://www.7-zip.org/sdk.html", "https://sourceforge.net/projects/sevenzip/files/LZMA%20SDK/"], "isOsiApproved": false}, "MakeIndex": {"reference": "https://spdx.org/licenses/MakeIndex.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MakeIndex.json", "referenceNumber": 156, "name": "MakeIndex License", "licenseId": "MakeIndex", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MakeIndex"], "isOsiApproved": false}, "Minpack": {"reference": "https://spdx.org/licenses/Minpack.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Minpack.json", "referenceNumber": 501, "name": "Minpack License", "licenseId": "Minpack", "seeAlso": ["http://www.netlib.org/minpack/disclaimer", "https://gitlab.com/libeigen/eigen/-/blob/master/COPYING.MINPACK"], "isOsiApproved": false}, "MirOS": {"reference": "https://spdx.org/licenses/MirOS.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MirOS.json", "referenceNumber": 471, "name": "The MirOS Licence", "licenseId": "MirOS", "seeAlso": ["https://opensource.org/licenses/MirOS"], "isOsiApproved": true}, "MIT": {"reference": "https://spdx.org/licenses/MIT.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT.json", "referenceNumber": 110, "name": "MIT License", "licenseId": "MIT", "seeAlso": ["https://opensource.org/licenses/MIT"], "isOsiApproved": true, "isFsfLibre": true}, "MIT-0": {"reference": "https://spdx.org/licenses/MIT-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-0.json", "referenceNumber": 305, "name": "MIT No Attribution", "licenseId": "MIT-0", "seeAlso": ["https://github.com/aws/mit-0", "https://romanrm.net/mit-zero", "https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE"], "isOsiApproved": true}, "MIT-advertising": {"reference": "https://spdx.org/licenses/MIT-advertising.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-advertising.json", "referenceNumber": 73, "name": "Enlightenment License (e16)", "licenseId": "MIT-advertising", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising"], "isOsiApproved": false}, "MIT-CMU": {"reference": "https://spdx.org/licenses/MIT-CMU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-CMU.json", "referenceNumber": 158, "name": "CMU License", "licenseId": "MIT-CMU", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#CMU_Style", "https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE"], "isOsiApproved": false}, "MIT-enna": {"reference": "https://spdx.org/licenses/MIT-enna.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-enna.json", "referenceNumber": 121, "name": "enna License", "licenseId": "MIT-enna", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MIT#enna"], "isOsiApproved": false}, "MIT-feh": {"reference": "https://spdx.org/licenses/MIT-feh.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-feh.json", "referenceNumber": 144, "name": "feh License", "licenseId": "MIT-feh", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MIT#feh"], "isOsiApproved": false}, "MIT-Modern-Variant": {"reference": "https://spdx.org/licenses/MIT-Modern-Variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-Modern-Variant.json", "referenceNumber": 25, "name": "MIT License Modern Variant", "licenseId": "MIT-Modern-Variant", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:MIT#Modern_Variants", "https://ptolemy.berkeley.edu/copyright.htm", "https://pirlwww.lpl.arizona.edu/resources/guide/software/PerlTk/Tixlic.html"], "isOsiApproved": true}, "MIT-open-group": {"reference": "https://spdx.org/licenses/MIT-open-group.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MIT-open-group.json", "referenceNumber": 269, "name": "MIT Open Group variant", "licenseId": "MIT-open-group", "seeAlso": ["https://gitlab.freedesktop.org/xorg/app/iceauth/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xvinfo/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xsetroot/-/blob/master/COPYING", "https://gitlab.freedesktop.org/xorg/app/xauth/-/blob/master/COPYING"], "isOsiApproved": false}, "MITNFA": {"reference": "https://spdx.org/licenses/MITNFA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MITNFA.json", "referenceNumber": 86, "name": "MIT +no-false-attribs license", "licenseId": "MITNFA", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MITNFA"], "isOsiApproved": false}, "Motosoto": {"reference": "https://spdx.org/licenses/Motosoto.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Motosoto.json", "referenceNumber": 263, "name": "Motosoto License", "licenseId": "Motosoto", "seeAlso": ["https://opensource.org/licenses/Motosoto"], "isOsiApproved": true}, "mpi-permissive": {"reference": "https://spdx.org/licenses/mpi-permissive.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpi-permissive.json", "referenceNumber": 233, "name": "mpi Permissive License", "licenseId": "mpi-permissive", "seeAlso": ["https://sources.debian.org/src/openmpi/4.1.0-10/ompi/debuggers/msgq_interface.h/?hl=19#L19"], "isOsiApproved": false}, "mpich2": {"reference": "https://spdx.org/licenses/mpich2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mpich2.json", "referenceNumber": 244, "name": "mpich2 License", "licenseId": "mpich2", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/MIT"], "isOsiApproved": false}, "MPL-1.0": {"reference": "https://spdx.org/licenses/MPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.0.json", "referenceNumber": 78, "name": "Mozilla Public License 1.0", "licenseId": "MPL-1.0", "seeAlso": ["http://www.mozilla.org/MPL/MPL-1.0.html", "https://opensource.org/licenses/MPL-1.0"], "isOsiApproved": true}, "MPL-1.1": {"reference": "https://spdx.org/licenses/MPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-1.1.json", "referenceNumber": 11, "name": "Mozilla Public License 1.1", "licenseId": "MPL-1.1", "seeAlso": ["http://www.mozilla.org/MPL/MPL-1.1.html", "https://opensource.org/licenses/MPL-1.1"], "isOsiApproved": true, "isFsfLibre": true}, "MPL-2.0": {"reference": "https://spdx.org/licenses/MPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0.json", "referenceNumber": 431, "name": "Mozilla Public License 2.0", "licenseId": "MPL-2.0", "seeAlso": ["https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "MPL-2.0-no-copyleft-exception": {"reference": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json", "referenceNumber": 208, "name": "Mozilla Public License 2.0 (no copyleft exception)", "licenseId": "MPL-2.0-no-copyleft-exception", "seeAlso": ["https://www.mozilla.org/MPL/2.0/", "https://opensource.org/licenses/MPL-2.0"], "isOsiApproved": true}, "mplus": {"reference": "https://spdx.org/licenses/mplus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/mplus.json", "referenceNumber": 330, "name": "mplus Font License", "licenseId": "mplus", "seeAlso": ["https://fedoraproject.org/wiki/Licensing:Mplus?rd=Licensing/mplus"], "isOsiApproved": false}, "MS-LPL": {"reference": "https://spdx.org/licenses/MS-LPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-LPL.json", "referenceNumber": 400, "name": "Microsoft Limited Public License", "licenseId": "MS-LPL", "seeAlso": ["https://www.openhub.net/licenses/mslpl", "https://github.com/gabegundy/atlserver/blob/master/License.txt", "https://en.wikipedia.org/wiki/Shared_Source_Initiative#Microsoft_Limited_Public_License_(Ms-LPL)"], "isOsiApproved": false}, "MS-PL": {"reference": "https://spdx.org/licenses/MS-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-PL.json", "referenceNumber": 493, "name": "Microsoft Public License", "licenseId": "MS-PL", "seeAlso": ["http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-PL"], "isOsiApproved": true, "isFsfLibre": true}, "MS-RL": {"reference": "https://spdx.org/licenses/MS-RL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MS-RL.json", "referenceNumber": 20, "name": "Microsoft Reciprocal License", "licenseId": "MS-RL", "seeAlso": ["http://www.microsoft.com/opensource/licenses.mspx", "https://opensource.org/licenses/MS-RL"], "isOsiApproved": true, "isFsfLibre": true}, "MTLL": {"reference": "https://spdx.org/licenses/MTLL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MTLL.json", "referenceNumber": 227, "name": "Matrix Template Library License", "licenseId": "MTLL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License"], "isOsiApproved": false}, "MulanPSL-1.0": {"reference": "https://spdx.org/licenses/MulanPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-1.0.json", "referenceNumber": 300, "name": "Mulan Permissive Software License, Version 1", "licenseId": "MulanPSL-1.0", "seeAlso": ["https://license.coscl.org.cn/MulanPSL/", "https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE"], "isOsiApproved": false}, "MulanPSL-2.0": {"reference": "https://spdx.org/licenses/MulanPSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/MulanPSL-2.0.json", "referenceNumber": 71, "name": "Mulan Permissive Software License, Version 2", "licenseId": "MulanPSL-2.0", "seeAlso": ["https://license.coscl.org.cn/MulanPSL2/"], "isOsiApproved": true}, "Multics": {"reference": "https://spdx.org/licenses/Multics.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Multics.json", "referenceNumber": 228, "name": "Multics License", "licenseId": "Multics", "seeAlso": ["https://opensource.org/licenses/Multics"], "isOsiApproved": true}, "Mup": {"reference": "https://spdx.org/licenses/Mup.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Mup.json", "referenceNumber": 97, "name": "Mup License", "licenseId": "Mup", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Mup"], "isOsiApproved": false}, "NAIST-2003": {"reference": "https://spdx.org/licenses/NAIST-2003.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NAIST-2003.json", "referenceNumber": 402, "name": "Nara Institute of Science and Technology License (2003)", "licenseId": "NAIST-2003", "seeAlso": ["https://enterprise.dejacode.com/licenses/public/naist-2003/#license-text", "https://github.com/nodejs/node/blob/4a19cc8947b1bba2b2d27816ec3d0edf9b28e503/LICENSE#L343"], "isOsiApproved": false}, "NASA-1.3": {"reference": "https://spdx.org/licenses/NASA-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NASA-1.3.json", "referenceNumber": 140, "name": "NASA Open Source Agreement 1.3", "licenseId": "NASA-1.3", "seeAlso": ["http://ti.arc.nasa.gov/opensource/nosa/", "https://opensource.org/licenses/NASA-1.3"], "isOsiApproved": true, "isFsfLibre": false}, "Naumen": {"reference": "https://spdx.org/licenses/Naumen.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Naumen.json", "referenceNumber": 365, "name": "Naumen Public License", "licenseId": "Naumen", "seeAlso": ["https://opensource.org/licenses/Naumen"], "isOsiApproved": true}, "NBPL-1.0": {"reference": "https://spdx.org/licenses/NBPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NBPL-1.0.json", "referenceNumber": 278, "name": "Net Boolean Public License v1", "licenseId": "NBPL-1.0", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=37b4b3f6cc4bf34e1d3dec61e69914b9819d8894"], "isOsiApproved": false}, "NCGL-UK-2.0": {"reference": "https://spdx.org/licenses/NCGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCGL-UK-2.0.json", "referenceNumber": 43, "name": "Non-Commercial Government Licence", "licenseId": "NCGL-UK-2.0", "seeAlso": ["http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/"], "isOsiApproved": false}, "NCSA": {"reference": "https://spdx.org/licenses/NCSA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NCSA.json", "referenceNumber": 205, "name": "University of Illinois/NCSA Open Source License", "licenseId": "NCSA", "seeAlso": ["http://otm.illinois.edu/uiuc_openSource", "https://opensource.org/licenses/NCSA"], "isOsiApproved": true, "isFsfLibre": true}, "Net-SNMP": {"reference": "https://spdx.org/licenses/Net-SNMP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Net-SNMP.json", "referenceNumber": 341, "name": "Net-SNMP License", "licenseId": "Net-SNMP", "seeAlso": ["http://net-snmp.sourceforge.net/about/license.html"], "isOsiApproved": false}, "NetCDF": {"reference": "https://spdx.org/licenses/NetCDF.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NetCDF.json", "referenceNumber": 342, "name": "NetCDF license", "licenseId": "NetCDF", "seeAlso": ["http://www.unidata.ucar.edu/software/netcdf/copyright.html"], "isOsiApproved": false}, "Newsletr": {"reference": "https://spdx.org/licenses/Newsletr.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Newsletr.json", "referenceNumber": 219, "name": "Newsletr License", "licenseId": "Newsletr", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Newsletr"], "isOsiApproved": false}, "NGPL": {"reference": "https://spdx.org/licenses/NGPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NGPL.json", "referenceNumber": 306, "name": "Nethack General Public License", "licenseId": "NGPL", "seeAlso": ["https://opensource.org/licenses/NGPL"], "isOsiApproved": true}, "NICTA-1.0": {"reference": "https://spdx.org/licenses/NICTA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NICTA-1.0.json", "referenceNumber": 107, "name": "NICTA Public Software License, Version 1.0", "licenseId": "NICTA-1.0", "seeAlso": ["https://opensource.apple.com/source/mDNSResponder/mDNSResponder-320.10/mDNSPosix/nss_ReadMe.txt"], "isOsiApproved": false}, "NIST-PD": {"reference": "https://spdx.org/licenses/NIST-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD.json", "referenceNumber": 183, "name": "NIST Public Domain Notice", "licenseId": "NIST-PD", "seeAlso": ["https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt", "https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md"], "isOsiApproved": false}, "NIST-PD-fallback": {"reference": "https://spdx.org/licenses/NIST-PD-fallback.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NIST-PD-fallback.json", "referenceNumber": 351, "name": "NIST Public Domain Notice with license fallback", "licenseId": "NIST-PD-fallback", "seeAlso": ["https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE", "https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst"], "isOsiApproved": false}, "NLOD-1.0": {"reference": "https://spdx.org/licenses/NLOD-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-1.0.json", "referenceNumber": 488, "name": "Norwegian Licence for Open Government Data (NLOD) 1.0", "licenseId": "NLOD-1.0", "seeAlso": ["http://data.norge.no/nlod/en/1.0"], "isOsiApproved": false}, "NLOD-2.0": {"reference": "https://spdx.org/licenses/NLOD-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLOD-2.0.json", "referenceNumber": 335, "name": "Norwegian Licence for Open Government Data (NLOD) 2.0", "licenseId": "NLOD-2.0", "seeAlso": ["http://data.norge.no/nlod/en/2.0"], "isOsiApproved": false}, "NLPL": {"reference": "https://spdx.org/licenses/NLPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NLPL.json", "referenceNumber": 136, "name": "No Limit Public License", "licenseId": "NLPL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/NLPL"], "isOsiApproved": false}, "Nokia": {"reference": "https://spdx.org/licenses/Nokia.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Nokia.json", "referenceNumber": 434, "name": "Nokia Open Source License", "licenseId": "Nokia", "seeAlso": ["https://opensource.org/licenses/nokia"], "isOsiApproved": true, "isFsfLibre": true}, "NOSL": {"reference": "https://spdx.org/licenses/NOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NOSL.json", "referenceNumber": 191, "name": "Netizen Open Source License", "licenseId": "NOSL", "seeAlso": ["http://bits.netizen.com.au/licenses/NOSL/nosl.txt"], "isOsiApproved": false, "isFsfLibre": true}, "Noweb": {"reference": "https://spdx.org/licenses/Noweb.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Noweb.json", "referenceNumber": 329, "name": "Noweb License", "licenseId": "Noweb", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Noweb"], "isOsiApproved": false}, "NPL-1.0": {"reference": "https://spdx.org/licenses/NPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.0.json", "referenceNumber": 322, "name": "Netscape Public License v1.0", "licenseId": "NPL-1.0", "seeAlso": ["http://www.mozilla.org/MPL/NPL/1.0/"], "isOsiApproved": false, "isFsfLibre": true}, "NPL-1.1": {"reference": "https://spdx.org/licenses/NPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPL-1.1.json", "referenceNumber": 59, "name": "Netscape Public License v1.1", "licenseId": "NPL-1.1", "seeAlso": ["http://www.mozilla.org/MPL/NPL/1.1/"], "isOsiApproved": false, "isFsfLibre": true}, "NPOSL-3.0": {"reference": "https://spdx.org/licenses/NPOSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NPOSL-3.0.json", "referenceNumber": 281, "name": "Non-Profit Open Software License 3.0", "licenseId": "NPOSL-3.0", "seeAlso": ["https://opensource.org/licenses/NOSL3.0"], "isOsiApproved": true}, "NRL": {"reference": "https://spdx.org/licenses/NRL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NRL.json", "referenceNumber": 446, "name": "NRL License", "licenseId": "NRL", "seeAlso": ["http://web.mit.edu/network/isakmp/nrllicense.html"], "isOsiApproved": false}, "NTP": {"reference": "https://spdx.org/licenses/NTP.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP.json", "referenceNumber": 251, "name": "NTP License", "licenseId": "NTP", "seeAlso": ["https://opensource.org/licenses/NTP"], "isOsiApproved": true}, "NTP-0": {"reference": "https://spdx.org/licenses/NTP-0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/NTP-0.json", "referenceNumber": 373, "name": "NTP No Attribution", "licenseId": "NTP-0", "seeAlso": ["https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c"], "isOsiApproved": false}, "Nunit": {"reference": "https://spdx.org/licenses/Nunit.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/Nunit.json", "referenceNumber": 242, "name": "Nunit License", "licenseId": "Nunit", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Nunit"], "isOsiApproved": false, "isFsfLibre": true}, "O-UDA-1.0": {"reference": "https://spdx.org/licenses/O-UDA-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/O-UDA-1.0.json", "referenceNumber": 6, "name": "Open Use of Data Agreement v1.0", "licenseId": "O-UDA-1.0", "seeAlso": ["https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md", "https://cdla.dev/open-use-of-data-agreement-v1-0/"], "isOsiApproved": false}, "OCCT-PL": {"reference": "https://spdx.org/licenses/OCCT-PL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCCT-PL.json", "referenceNumber": 111, "name": "Open CASCADE Technology Public License", "licenseId": "OCCT-PL", "seeAlso": ["http://www.opencascade.com/content/occt-public-license"], "isOsiApproved": false}, "OCLC-2.0": {"reference": "https://spdx.org/licenses/OCLC-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OCLC-2.0.json", "referenceNumber": 220, "name": "OCLC Research Public License 2.0", "licenseId": "OCLC-2.0", "seeAlso": ["http://www.oclc.org/research/activities/software/license/v2final.htm", "https://opensource.org/licenses/OCLC-2.0"], "isOsiApproved": true}, "ODbL-1.0": {"reference": "https://spdx.org/licenses/ODbL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODbL-1.0.json", "referenceNumber": 359, "name": "Open Data Commons Open Database License v1.0", "licenseId": "ODbL-1.0", "seeAlso": ["http://www.opendatacommons.org/licenses/odbl/1.0/", "https://opendatacommons.org/licenses/odbl/1-0/"], "isOsiApproved": false, "isFsfLibre": true}, "ODC-By-1.0": {"reference": "https://spdx.org/licenses/ODC-By-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ODC-By-1.0.json", "referenceNumber": 295, "name": "Open Data Commons Attribution License v1.0", "licenseId": "ODC-By-1.0", "seeAlso": ["https://opendatacommons.org/licenses/by/1.0/"], "isOsiApproved": false}, "OFL-1.0": {"reference": "https://spdx.org/licenses/OFL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0.json", "referenceNumber": 283, "name": "SIL Open Font License 1.0", "licenseId": "OFL-1.0", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"], "isOsiApproved": false, "isFsfLibre": true}, "OFL-1.0-no-RFN": {"reference": "https://spdx.org/licenses/OFL-1.0-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-no-RFN.json", "referenceNumber": 162, "name": "SIL Open Font License 1.0 with no Reserved Font Name", "licenseId": "OFL-1.0-no-RFN", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"], "isOsiApproved": false}, "OFL-1.0-RFN": {"reference": "https://spdx.org/licenses/OFL-1.0-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.0-RFN.json", "referenceNumber": 147, "name": "SIL Open Font License 1.0 with Reserved Font Name", "licenseId": "OFL-1.0-RFN", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"], "isOsiApproved": false}, "OFL-1.1": {"reference": "https://spdx.org/licenses/OFL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1.json", "referenceNumber": 82, "name": "SIL Open Font License 1.1", "licenseId": "OFL-1.1", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", "https://opensource.org/licenses/OFL-1.1"], "isOsiApproved": true, "isFsfLibre": true}, "OFL-1.1-no-RFN": {"reference": "https://spdx.org/licenses/OFL-1.1-no-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-no-RFN.json", "referenceNumber": 469, "name": "SIL Open Font License 1.1 with no Reserved Font Name", "licenseId": "OFL-1.1-no-RFN", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", "https://opensource.org/licenses/OFL-1.1"], "isOsiApproved": true}, "OFL-1.1-RFN": {"reference": "https://spdx.org/licenses/OFL-1.1-RFN.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OFL-1.1-RFN.json", "referenceNumber": 112, "name": "SIL Open Font License 1.1 with Reserved Font Name", "licenseId": "OFL-1.1-RFN", "seeAlso": ["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web", "https://opensource.org/licenses/OFL-1.1"], "isOsiApproved": true}, "OGC-1.0": {"reference": "https://spdx.org/licenses/OGC-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGC-1.0.json", "referenceNumber": 404, "name": "OGC Software License, Version 1.0", "licenseId": "OGC-1.0", "seeAlso": ["https://www.ogc.org/ogc/software/1.0"], "isOsiApproved": false}, "OGDL-Taiwan-1.0": {"reference": "https://spdx.org/licenses/OGDL-Taiwan-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGDL-Taiwan-1.0.json", "referenceNumber": 109, "name": "Taiwan Open Government Data License, version 1.0", "licenseId": "OGDL-Taiwan-1.0", "seeAlso": ["https://data.gov.tw/license"], "isOsiApproved": false}, "OGL-Canada-2.0": {"reference": "https://spdx.org/licenses/OGL-Canada-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-Canada-2.0.json", "referenceNumber": 95, "name": "Open Government Licence - Canada", "licenseId": "OGL-Canada-2.0", "seeAlso": ["https://open.canada.ca/en/open-government-licence-canada"], "isOsiApproved": false}, "OGL-UK-1.0": {"reference": "https://spdx.org/licenses/OGL-UK-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-1.0.json", "referenceNumber": 200, "name": "Open Government Licence v1.0", "licenseId": "OGL-UK-1.0", "seeAlso": ["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/"], "isOsiApproved": false}, "OGL-UK-2.0": {"reference": "https://spdx.org/licenses/OGL-UK-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-2.0.json", "referenceNumber": 375, "name": "Open Government Licence v2.0", "licenseId": "OGL-UK-2.0", "seeAlso": ["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/"], "isOsiApproved": false}, "OGL-UK-3.0": {"reference": "https://spdx.org/licenses/OGL-UK-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGL-UK-3.0.json", "referenceNumber": 185, "name": "Open Government Licence v3.0", "licenseId": "OGL-UK-3.0", "seeAlso": ["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/"], "isOsiApproved": false}, "OGTSL": {"reference": "https://spdx.org/licenses/OGTSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OGTSL.json", "referenceNumber": 88, "name": "Open Group Test Suite License", "licenseId": "OGTSL", "seeAlso": ["http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt", "https://opensource.org/licenses/OGTSL"], "isOsiApproved": true}, "OLDAP-1.1": {"reference": "https://spdx.org/licenses/OLDAP-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.1.json", "referenceNumber": 478, "name": "Open LDAP Public License v1.1", "licenseId": "OLDAP-1.1", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=806557a5ad59804ef3a44d5abfbe91d706b0791f"], "isOsiApproved": false}, "OLDAP-1.2": {"reference": "https://spdx.org/licenses/OLDAP-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.2.json", "referenceNumber": 371, "name": "Open LDAP Public License v1.2", "licenseId": "OLDAP-1.2", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=42b0383c50c299977b5893ee695cf4e486fb0dc7"], "isOsiApproved": false}, "OLDAP-1.3": {"reference": "https://spdx.org/licenses/OLDAP-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.3.json", "referenceNumber": 2, "name": "Open LDAP Public License v1.3", "licenseId": "OLDAP-1.3", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=e5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1"], "isOsiApproved": false}, "OLDAP-1.4": {"reference": "https://spdx.org/licenses/OLDAP-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-1.4.json", "referenceNumber": 438, "name": "Open LDAP Public License v1.4", "licenseId": "OLDAP-1.4", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=c9f95c2f3f2ffb5e0ae55fe7388af75547660941"], "isOsiApproved": false}, "OLDAP-2.0": {"reference": "https://spdx.org/licenses/OLDAP-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.json", "referenceNumber": 154, "name": "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", "licenseId": "OLDAP-2.0", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cbf50f4e1185a21abd4c0a54d3f4341fe28f36ea"], "isOsiApproved": false}, "OLDAP-2.0.1": {"reference": "https://spdx.org/licenses/OLDAP-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.0.1.json", "referenceNumber": 168, "name": "Open LDAP Public License v2.0.1", "licenseId": "OLDAP-2.0.1", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b6d68acd14e51ca3aab4428bf26522aa74873f0e"], "isOsiApproved": false}, "OLDAP-2.1": {"reference": "https://spdx.org/licenses/OLDAP-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.1.json", "referenceNumber": 245, "name": "Open LDAP Public License v2.1", "licenseId": "OLDAP-2.1", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b0d176738e96a0d3b9f85cb51e140a86f21be715"], "isOsiApproved": false}, "OLDAP-2.2": {"reference": "https://spdx.org/licenses/OLDAP-2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.json", "referenceNumber": 491, "name": "Open LDAP Public License v2.2", "licenseId": "OLDAP-2.2", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=470b0c18ec67621c85881b2733057fecf4a1acc3"], "isOsiApproved": false}, "OLDAP-2.2.1": {"reference": "https://spdx.org/licenses/OLDAP-2.2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.1.json", "referenceNumber": 3, "name": "Open LDAP Public License v2.2.1", "licenseId": "OLDAP-2.2.1", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=4bc786f34b50aa301be6f5600f58a980070f481e"], "isOsiApproved": false}, "OLDAP-2.2.2": {"reference": "https://spdx.org/licenses/OLDAP-2.2.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.2.2.json", "referenceNumber": 333, "name": "Open LDAP Public License 2.2.2", "licenseId": "OLDAP-2.2.2", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=df2cc1e21eb7c160695f5b7cffd6296c151ba188"], "isOsiApproved": false}, "OLDAP-2.3": {"reference": "https://spdx.org/licenses/OLDAP-2.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.3.json", "referenceNumber": 102, "name": "Open LDAP Public License v2.3", "licenseId": "OLDAP-2.3", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=d32cf54a32d581ab475d23c810b0a7fbaf8d63c3"], "isOsiApproved": false, "isFsfLibre": true}, "OLDAP-2.4": {"reference": "https://spdx.org/licenses/OLDAP-2.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.4.json", "referenceNumber": 366, "name": "Open LDAP Public License v2.4", "licenseId": "OLDAP-2.4", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cd1284c4a91a8a380d904eee68d1583f989ed386"], "isOsiApproved": false}, "OLDAP-2.5": {"reference": "https://spdx.org/licenses/OLDAP-2.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.5.json", "referenceNumber": 464, "name": "Open LDAP Public License v2.5", "licenseId": "OLDAP-2.5", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=6852b9d90022e8593c98205413380536b1b5a7cf"], "isOsiApproved": false}, "OLDAP-2.6": {"reference": "https://spdx.org/licenses/OLDAP-2.6.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.6.json", "referenceNumber": 377, "name": "Open LDAP Public License v2.6", "licenseId": "OLDAP-2.6", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=1cae062821881f41b73012ba816434897abf4205"], "isOsiApproved": false}, "OLDAP-2.7": {"reference": "https://spdx.org/licenses/OLDAP-2.7.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.7.json", "referenceNumber": 405, "name": "Open LDAP Public License v2.7", "licenseId": "OLDAP-2.7", "seeAlso": ["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=47c2415c1df81556eeb39be6cad458ef87c534a2"], "isOsiApproved": false, "isFsfLibre": true}, "OLDAP-2.8": {"reference": "https://spdx.org/licenses/OLDAP-2.8.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OLDAP-2.8.json", "referenceNumber": 348, "name": "Open LDAP Public License v2.8", "licenseId": "OLDAP-2.8", "seeAlso": ["http://www.openldap.org/software/release/license.html"], "isOsiApproved": true}, "OML": {"reference": "https://spdx.org/licenses/OML.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OML.json", "referenceNumber": 456, "name": "Open Market License", "licenseId": "OML", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Open_Market_License"], "isOsiApproved": false}, "OpenSSL": {"reference": "https://spdx.org/licenses/OpenSSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OpenSSL.json", "referenceNumber": 396, "name": "OpenSSL License", "licenseId": "OpenSSL", "seeAlso": ["http://www.openssl.org/source/license.html"], "isOsiApproved": false, "isFsfLibre": true}, "OPL-1.0": {"reference": "https://spdx.org/licenses/OPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPL-1.0.json", "referenceNumber": 128, "name": "Open Public License v1.0", "licenseId": "OPL-1.0", "seeAlso": ["http://old.koalateam.com/jackaroo/OPL_1_0.TXT", "https://fedoraproject.org/wiki/Licensing/Open_Public_License"], "isOsiApproved": false, "isFsfLibre": false}, "OPUBL-1.0": {"reference": "https://spdx.org/licenses/OPUBL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OPUBL-1.0.json", "referenceNumber": 367, "name": "Open Publication License v1.0", "licenseId": "OPUBL-1.0", "seeAlso": ["http://opencontent.org/openpub/", "https://www.debian.org/opl", "https://www.ctan.org/license/opl"], "isOsiApproved": false}, "OSET-PL-2.1": {"reference": "https://spdx.org/licenses/OSET-PL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSET-PL-2.1.json", "referenceNumber": 48, "name": "OSET Public License version 2.1", "licenseId": "OSET-PL-2.1", "seeAlso": ["http://www.osetfoundation.org/public-license", "https://opensource.org/licenses/OPL-2.1"], "isOsiApproved": true}, "OSL-1.0": {"reference": "https://spdx.org/licenses/OSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.0.json", "referenceNumber": 397, "name": "Open Software License 1.0", "licenseId": "OSL-1.0", "seeAlso": ["https://opensource.org/licenses/OSL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "OSL-1.1": {"reference": "https://spdx.org/licenses/OSL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-1.1.json", "referenceNumber": 394, "name": "Open Software License 1.1", "licenseId": "OSL-1.1", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/OSL1.1"], "isOsiApproved": false, "isFsfLibre": true}, "OSL-2.0": {"reference": "https://spdx.org/licenses/OSL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.0.json", "referenceNumber": 358, "name": "Open Software License 2.0", "licenseId": "OSL-2.0", "seeAlso": ["http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html"], "isOsiApproved": true, "isFsfLibre": true}, "OSL-2.1": {"reference": "https://spdx.org/licenses/OSL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-2.1.json", "referenceNumber": 157, "name": "Open Software License 2.1", "licenseId": "OSL-2.1", "seeAlso": ["http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm", "https://opensource.org/licenses/OSL-2.1"], "isOsiApproved": true, "isFsfLibre": true}, "OSL-3.0": {"reference": "https://spdx.org/licenses/OSL-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/OSL-3.0.json", "referenceNumber": 336, "name": "Open Software License 3.0", "licenseId": "OSL-3.0", "seeAlso": ["https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm", "https://opensource.org/licenses/OSL-3.0"], "isOsiApproved": true, "isFsfLibre": true}, "Parity-6.0.0": {"reference": "https://spdx.org/licenses/Parity-6.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-6.0.0.json", "referenceNumber": 101, "name": "The Parity Public License 6.0.0", "licenseId": "Parity-6.0.0", "seeAlso": ["https://paritylicense.com/versions/6.0.0.html"], "isOsiApproved": false}, "Parity-7.0.0": {"reference": "https://spdx.org/licenses/Parity-7.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Parity-7.0.0.json", "referenceNumber": 51, "name": "The Parity Public License 7.0.0", "licenseId": "Parity-7.0.0", "seeAlso": ["https://paritylicense.com/versions/7.0.0.html"], "isOsiApproved": false}, "PDDL-1.0": {"reference": "https://spdx.org/licenses/PDDL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PDDL-1.0.json", "referenceNumber": 85, "name": "Open Data Commons Public Domain Dedication & License 1.0", "licenseId": "PDDL-1.0", "seeAlso": ["http://opendatacommons.org/licenses/pddl/1.0/", "https://opendatacommons.org/licenses/pddl/"], "isOsiApproved": false}, "PHP-3.0": {"reference": "https://spdx.org/licenses/PHP-3.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.0.json", "referenceNumber": 179, "name": "PHP License v3.0", "licenseId": "PHP-3.0", "seeAlso": ["http://www.php.net/license/3_0.txt", "https://opensource.org/licenses/PHP-3.0"], "isOsiApproved": true}, "PHP-3.01": {"reference": "https://spdx.org/licenses/PHP-3.01.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PHP-3.01.json", "referenceNumber": 458, "name": "PHP License v3.01", "licenseId": "PHP-3.01", "seeAlso": ["http://www.php.net/license/3_01.txt"], "isOsiApproved": true, "isFsfLibre": true}, "Plexus": {"reference": "https://spdx.org/licenses/Plexus.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Plexus.json", "referenceNumber": 465, "name": "Plexus Classworlds License", "licenseId": "Plexus", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License"], "isOsiApproved": false}, "PolyForm-Noncommercial-1.0.0": {"reference": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json", "referenceNumber": 188, "name": "PolyForm Noncommercial License 1.0.0", "licenseId": "PolyForm-Noncommercial-1.0.0", "seeAlso": ["https://polyformproject.org/licenses/noncommercial/1.0.0"], "isOsiApproved": false}, "PolyForm-Small-Business-1.0.0": {"reference": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json", "referenceNumber": 297, "name": "PolyForm Small Business License 1.0.0", "licenseId": "PolyForm-Small-Business-1.0.0", "seeAlso": ["https://polyformproject.org/licenses/small-business/1.0.0"], "isOsiApproved": false}, "PostgreSQL": {"reference": "https://spdx.org/licenses/PostgreSQL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PostgreSQL.json", "referenceNumber": 231, "name": "PostgreSQL License", "licenseId": "PostgreSQL", "seeAlso": ["http://www.postgresql.org/about/licence", "https://opensource.org/licenses/PostgreSQL"], "isOsiApproved": true}, "PSF-2.0": {"reference": "https://spdx.org/licenses/PSF-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/PSF-2.0.json", "referenceNumber": 444, "name": "Python Software Foundation License 2.0", "licenseId": "PSF-2.0", "seeAlso": ["https://opensource.org/licenses/Python-2.0"], "isOsiApproved": false}, "psfrag": {"reference": "https://spdx.org/licenses/psfrag.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psfrag.json", "referenceNumber": 264, "name": "psfrag License", "licenseId": "psfrag", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/psfrag"], "isOsiApproved": false}, "psutils": {"reference": "https://spdx.org/licenses/psutils.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/psutils.json", "referenceNumber": 105, "name": "psutils License", "licenseId": "psutils", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/psutils"], "isOsiApproved": false}, "Python-2.0": {"reference": "https://spdx.org/licenses/Python-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.json", "referenceNumber": 362, "name": "Python License 2.0", "licenseId": "Python-2.0", "seeAlso": ["https://opensource.org/licenses/Python-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "Python-2.0.1": {"reference": "https://spdx.org/licenses/Python-2.0.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Python-2.0.1.json", "referenceNumber": 198, "name": "Python License 2.0.1", "licenseId": "Python-2.0.1", "seeAlso": ["https://www.python.org/download/releases/2.0.1/license/", "https://docs.python.org/3/license.html", "https://github.com/python/cpython/blob/main/LICENSE"], "isOsiApproved": false}, "Qhull": {"reference": "https://spdx.org/licenses/Qhull.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Qhull.json", "referenceNumber": 266, "name": "Qhull License", "licenseId": "Qhull", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Qhull"], "isOsiApproved": false}, "QPL-1.0": {"reference": "https://spdx.org/licenses/QPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/QPL-1.0.json", "referenceNumber": 56, "name": "Q Public License 1.0", "licenseId": "QPL-1.0", "seeAlso": ["http://doc.qt.nokia.com/3.3/license.html", "https://opensource.org/licenses/QPL-1.0", "https://doc.qt.io/archives/3.3/license.html"], "isOsiApproved": true, "isFsfLibre": true}, "Rdisc": {"reference": "https://spdx.org/licenses/Rdisc.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Rdisc.json", "referenceNumber": 32, "name": "Rdisc License", "licenseId": "Rdisc", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Rdisc_License"], "isOsiApproved": false}, "RHeCos-1.1": {"reference": "https://spdx.org/licenses/RHeCos-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RHeCos-1.1.json", "referenceNumber": 222, "name": "Red Hat eCos Public License v1.1", "licenseId": "RHeCos-1.1", "seeAlso": ["http://ecos.sourceware.org/old-license.html"], "isOsiApproved": false, "isFsfLibre": false}, "RPL-1.1": {"reference": "https://spdx.org/licenses/RPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.1.json", "referenceNumber": 53, "name": "Reciprocal Public License 1.1", "licenseId": "RPL-1.1", "seeAlso": ["https://opensource.org/licenses/RPL-1.1"], "isOsiApproved": true}, "RPL-1.5": {"reference": "https://spdx.org/licenses/RPL-1.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPL-1.5.json", "referenceNumber": 36, "name": "Reciprocal Public License 1.5", "licenseId": "RPL-1.5", "seeAlso": ["https://opensource.org/licenses/RPL-1.5"], "isOsiApproved": true}, "RPSL-1.0": {"reference": "https://spdx.org/licenses/RPSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RPSL-1.0.json", "referenceNumber": 312, "name": "RealNetworks Public Source License v1.0", "licenseId": "RPSL-1.0", "seeAlso": ["https://helixcommunity.org/content/rpsl", "https://opensource.org/licenses/RPSL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "RSA-MD": {"reference": "https://spdx.org/licenses/RSA-MD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSA-MD.json", "referenceNumber": 47, "name": "RSA Message-Digest License", "licenseId": "RSA-MD", "seeAlso": ["http://www.faqs.org/rfcs/rfc1321.html"], "isOsiApproved": false}, "RSCPL": {"reference": "https://spdx.org/licenses/RSCPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/RSCPL.json", "referenceNumber": 216, "name": "Ricoh Source Code Public License", "licenseId": "RSCPL", "seeAlso": ["http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml", "https://opensource.org/licenses/RSCPL"], "isOsiApproved": true}, "Ruby": {"reference": "https://spdx.org/licenses/Ruby.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Ruby.json", "referenceNumber": 389, "name": "Ruby License", "licenseId": "Ruby", "seeAlso": ["http://www.ruby-lang.org/en/LICENSE.txt"], "isOsiApproved": false, "isFsfLibre": true}, "SAX-PD": {"reference": "https://spdx.org/licenses/SAX-PD.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SAX-PD.json", "referenceNumber": 66, "name": "Sax Public Domain Notice", "licenseId": "SAX-PD", "seeAlso": ["http://www.saxproject.org/copying.html"], "isOsiApproved": false}, "Saxpath": {"reference": "https://spdx.org/licenses/Saxpath.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Saxpath.json", "referenceNumber": 117, "name": "Saxpath License", "licenseId": "Saxpath", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Saxpath_License"], "isOsiApproved": false}, "SCEA": {"reference": "https://spdx.org/licenses/SCEA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SCEA.json", "referenceNumber": 94, "name": "SCEA Shared Source License", "licenseId": "SCEA", "seeAlso": ["http://research.scea.com/scea_shared_source_license.html"], "isOsiApproved": false}, "SchemeReport": {"reference": "https://spdx.org/licenses/SchemeReport.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SchemeReport.json", "referenceNumber": 177, "name": "Scheme Language Report License", "licenseId": "SchemeReport", "seeAlso": [], "isOsiApproved": false}, "Sendmail": {"reference": "https://spdx.org/licenses/Sendmail.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail.json", "referenceNumber": 415, "name": "Sendmail License", "licenseId": "Sendmail", "seeAlso": ["http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf", "https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf"], "isOsiApproved": false}, "Sendmail-8.23": {"reference": "https://spdx.org/licenses/Sendmail-8.23.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sendmail-8.23.json", "referenceNumber": 492, "name": "Sendmail License 8.23", "licenseId": "Sendmail-8.23", "seeAlso": ["https://www.proofpoint.com/sites/default/files/sendmail-license.pdf", "https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf"], "isOsiApproved": false}, "SGI-B-1.0": {"reference": "https://spdx.org/licenses/SGI-B-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.0.json", "referenceNumber": 92, "name": "SGI Free Software License B v1.0", "licenseId": "SGI-B-1.0", "seeAlso": ["http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html"], "isOsiApproved": false}, "SGI-B-1.1": {"reference": "https://spdx.org/licenses/SGI-B-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-1.1.json", "referenceNumber": 67, "name": "SGI Free Software License B v1.1", "licenseId": "SGI-B-1.1", "seeAlso": ["http://oss.sgi.com/projects/FreeB/"], "isOsiApproved": false}, "SGI-B-2.0": {"reference": "https://spdx.org/licenses/SGI-B-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SGI-B-2.0.json", "referenceNumber": 346, "name": "SGI Free Software License B v2.0", "licenseId": "SGI-B-2.0", "seeAlso": ["http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf"], "isOsiApproved": false, "isFsfLibre": true}, "SHL-0.5": {"reference": "https://spdx.org/licenses/SHL-0.5.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.5.json", "referenceNumber": 87, "name": "Solderpad Hardware License v0.5", "licenseId": "SHL-0.5", "seeAlso": ["https://solderpad.org/licenses/SHL-0.5/"], "isOsiApproved": false}, "SHL-0.51": {"reference": "https://spdx.org/licenses/SHL-0.51.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SHL-0.51.json", "referenceNumber": 339, "name": "Solderpad Hardware License, Version 0.51", "licenseId": "SHL-0.51", "seeAlso": ["https://solderpad.org/licenses/SHL-0.51/"], "isOsiApproved": false}, "SimPL-2.0": {"reference": "https://spdx.org/licenses/SimPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SimPL-2.0.json", "referenceNumber": 46, "name": "Simple Public License 2.0", "licenseId": "SimPL-2.0", "seeAlso": ["https://opensource.org/licenses/SimPL-2.0"], "isOsiApproved": true}, "SISSL": {"reference": "https://spdx.org/licenses/SISSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL.json", "referenceNumber": 84, "name": "Sun Industry Standards Source License v1.1", "licenseId": "SISSL", "seeAlso": ["http://www.openoffice.org/licenses/sissl_license.html", "https://opensource.org/licenses/SISSL"], "isOsiApproved": true, "isFsfLibre": true}, "SISSL-1.2": {"reference": "https://spdx.org/licenses/SISSL-1.2.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SISSL-1.2.json", "referenceNumber": 149, "name": "Sun Industry Standards Source License v1.2", "licenseId": "SISSL-1.2", "seeAlso": ["http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html"], "isOsiApproved": false}, "Sleepycat": {"reference": "https://spdx.org/licenses/Sleepycat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Sleepycat.json", "referenceNumber": 257, "name": "Sleepycat License", "licenseId": "Sleepycat", "seeAlso": ["https://opensource.org/licenses/Sleepycat"], "isOsiApproved": true, "isFsfLibre": true}, "SMLNJ": {"reference": "https://spdx.org/licenses/SMLNJ.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMLNJ.json", "referenceNumber": 182, "name": "Standard ML of New Jersey License", "licenseId": "SMLNJ", "seeAlso": ["https://www.smlnj.org/license.html"], "isOsiApproved": false, "isFsfLibre": true}, "SMPPL": {"reference": "https://spdx.org/licenses/SMPPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SMPPL.json", "referenceNumber": 226, "name": "Secure Messaging Protocol Public License", "licenseId": "SMPPL", "seeAlso": ["https://github.com/dcblake/SMP/blob/master/Documentation/License.txt"], "isOsiApproved": false}, "SNIA": {"reference": "https://spdx.org/licenses/SNIA.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SNIA.json", "referenceNumber": 72, "name": "SNIA Public License 1.1", "licenseId": "SNIA", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/SNIA_Public_License"], "isOsiApproved": false}, "Spencer-86": {"reference": "https://spdx.org/licenses/Spencer-86.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-86.json", "referenceNumber": 345, "name": "Spencer License 86", "licenseId": "Spencer-86", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License"], "isOsiApproved": false}, "Spencer-94": {"reference": "https://spdx.org/licenses/Spencer-94.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-94.json", "referenceNumber": 142, "name": "Spencer License 94", "licenseId": "Spencer-94", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License"], "isOsiApproved": false}, "Spencer-99": {"reference": "https://spdx.org/licenses/Spencer-99.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Spencer-99.json", "referenceNumber": 234, "name": "Spencer License 99", "licenseId": "Spencer-99", "seeAlso": ["http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c"], "isOsiApproved": false}, "SPL-1.0": {"reference": "https://spdx.org/licenses/SPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SPL-1.0.json", "referenceNumber": 123, "name": "Sun Public License v1.0", "licenseId": "SPL-1.0", "seeAlso": ["https://opensource.org/licenses/SPL-1.0"], "isOsiApproved": true, "isFsfLibre": true}, "SSH-OpenSSH": {"reference": "https://spdx.org/licenses/SSH-OpenSSH.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-OpenSSH.json", "referenceNumber": 487, "name": "SSH OpenSSH license", "licenseId": "SSH-OpenSSH", "seeAlso": ["https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10"], "isOsiApproved": false}, "SSH-short": {"reference": "https://spdx.org/licenses/SSH-short.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSH-short.json", "referenceNumber": 148, "name": "SSH short notice", "licenseId": "SSH-short", "seeAlso": ["https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h", "http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1", "https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp"], "isOsiApproved": false}, "SSPL-1.0": {"reference": "https://spdx.org/licenses/SSPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SSPL-1.0.json", "referenceNumber": 76, "name": "Server Side Public License, v 1", "licenseId": "SSPL-1.0", "seeAlso": ["https://www.mongodb.com/licensing/server-side-public-license"], "isOsiApproved": false}, "StandardML-NJ": {"reference": "https://spdx.org/licenses/StandardML-NJ.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/StandardML-NJ.json", "referenceNumber": 494, "name": "Standard ML of New Jersey License", "licenseId": "StandardML-NJ", "seeAlso": ["https://www.smlnj.org/license.html"], "isOsiApproved": false, "isFsfLibre": true}, "SugarCRM-1.1.3": {"reference": "https://spdx.org/licenses/SugarCRM-1.1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SugarCRM-1.1.3.json", "referenceNumber": 90, "name": "SugarCRM Public License v1.1.3", "licenseId": "SugarCRM-1.1.3", "seeAlso": ["http://www.sugarcrm.com/crm/SPL"], "isOsiApproved": false}, "SWL": {"reference": "https://spdx.org/licenses/SWL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/SWL.json", "referenceNumber": 292, "name": "Scheme Widget Library (SWL) Software License Agreement", "licenseId": "SWL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/SWL"], "isOsiApproved": false}, "Symlinks": {"reference": "https://spdx.org/licenses/Symlinks.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Symlinks.json", "referenceNumber": 449, "name": "Symlinks License", "licenseId": "Symlinks", "seeAlso": ["https://www.mail-archive.com/debian-bugs-rc@lists.debian.org/msg11494.html"], "isOsiApproved": false}, "TAPR-OHL-1.0": {"reference": "https://spdx.org/licenses/TAPR-OHL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TAPR-OHL-1.0.json", "referenceNumber": 238, "name": "TAPR Open Hardware License v1.0", "licenseId": "TAPR-OHL-1.0", "seeAlso": ["https://www.tapr.org/OHL"], "isOsiApproved": false}, "TCL": {"reference": "https://spdx.org/licenses/TCL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCL.json", "referenceNumber": 93, "name": "TCL/TK License", "licenseId": "TCL", "seeAlso": ["http://www.tcl.tk/software/tcltk/license.html", "https://fedoraproject.org/wiki/Licensing/TCL"], "isOsiApproved": false}, "TCP-wrappers": {"reference": "https://spdx.org/licenses/TCP-wrappers.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TCP-wrappers.json", "referenceNumber": 409, "name": "TCP Wrappers License", "licenseId": "TCP-wrappers", "seeAlso": ["http://rc.quest.com/topics/openssh/license.php#tcpwrappers"], "isOsiApproved": false}, "TMate": {"reference": "https://spdx.org/licenses/TMate.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TMate.json", "referenceNumber": 290, "name": "TMate Open Source License", "licenseId": "TMate", "seeAlso": ["http://svnkit.com/license.html"], "isOsiApproved": false}, "TORQUE-1.1": {"reference": "https://spdx.org/licenses/TORQUE-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TORQUE-1.1.json", "referenceNumber": 414, "name": "TORQUE v2.5+ Software License v1.1", "licenseId": "TORQUE-1.1", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/TORQUEv1.1"], "isOsiApproved": false}, "TOSL": {"reference": "https://spdx.org/licenses/TOSL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TOSL.json", "referenceNumber": 299, "name": "Trusster Open Source License", "licenseId": "TOSL", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/TOSL"], "isOsiApproved": false}, "TU-Berlin-1.0": {"reference": "https://spdx.org/licenses/TU-Berlin-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-1.0.json", "referenceNumber": 410, "name": "Technische Universitaet Berlin License 1.0", "licenseId": "TU-Berlin-1.0", "seeAlso": ["https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT"], "isOsiApproved": false}, "TU-Berlin-2.0": {"reference": "https://spdx.org/licenses/TU-Berlin-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/TU-Berlin-2.0.json", "referenceNumber": 50, "name": "Technische Universitaet Berlin License 2.0", "licenseId": "TU-Berlin-2.0", "seeAlso": ["https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt"], "isOsiApproved": false}, "UCL-1.0": {"reference": "https://spdx.org/licenses/UCL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UCL-1.0.json", "referenceNumber": 199, "name": "Upstream Compatibility License v1.0", "licenseId": "UCL-1.0", "seeAlso": ["https://opensource.org/licenses/UCL-1.0"], "isOsiApproved": true}, "Unicode-DFS-2015": {"reference": "https://spdx.org/licenses/Unicode-DFS-2015.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2015.json", "referenceNumber": 326, "name": "Unicode License Agreement - Data Files and Software (2015)", "licenseId": "Unicode-DFS-2015", "seeAlso": ["https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html"], "isOsiApproved": false}, "Unicode-DFS-2016": {"reference": "https://spdx.org/licenses/Unicode-DFS-2016.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-DFS-2016.json", "referenceNumber": 134, "name": "Unicode License Agreement - Data Files and Software (2016)", "licenseId": "Unicode-DFS-2016", "seeAlso": ["http://www.unicode.org/copyright.html"], "isOsiApproved": true}, "Unicode-TOU": {"reference": "https://spdx.org/licenses/Unicode-TOU.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unicode-TOU.json", "referenceNumber": 451, "name": "Unicode Terms of Use", "licenseId": "Unicode-TOU", "seeAlso": ["http://www.unicode.org/copyright.html"], "isOsiApproved": false}, "Unlicense": {"reference": "https://spdx.org/licenses/Unlicense.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Unlicense.json", "referenceNumber": 192, "name": "The Unlicense", "licenseId": "Unlicense", "seeAlso": ["https://unlicense.org/"], "isOsiApproved": true, "isFsfLibre": true}, "UPL-1.0": {"reference": "https://spdx.org/licenses/UPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/UPL-1.0.json", "referenceNumber": 436, "name": "Universal Permissive License v1.0", "licenseId": "UPL-1.0", "seeAlso": ["https://opensource.org/licenses/UPL"], "isOsiApproved": true, "isFsfLibre": true}, "Vim": {"reference": "https://spdx.org/licenses/Vim.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Vim.json", "referenceNumber": 132, "name": "Vim License", "licenseId": "Vim", "seeAlso": ["http://vimdoc.sourceforge.net/htmldoc/uganda.html"], "isOsiApproved": false, "isFsfLibre": true}, "VOSTROM": {"reference": "https://spdx.org/licenses/VOSTROM.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VOSTROM.json", "referenceNumber": 13, "name": "VOSTROM Public License for Open Source", "licenseId": "VOSTROM", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/VOSTROM"], "isOsiApproved": false}, "VSL-1.0": {"reference": "https://spdx.org/licenses/VSL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/VSL-1.0.json", "referenceNumber": 160, "name": "Vovida Software License v1.0", "licenseId": "VSL-1.0", "seeAlso": ["https://opensource.org/licenses/VSL-1.0"], "isOsiApproved": true}, "W3C": {"reference": "https://spdx.org/licenses/W3C.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C.json", "referenceNumber": 166, "name": "W3C Software Notice and License (2002-12-31)", "licenseId": "W3C", "seeAlso": ["http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html", "https://opensource.org/licenses/W3C"], "isOsiApproved": true, "isFsfLibre": true}, "W3C-19980720": {"reference": "https://spdx.org/licenses/W3C-19980720.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-19980720.json", "referenceNumber": 315, "name": "W3C Software Notice and License (1998-07-20)", "licenseId": "W3C-19980720", "seeAlso": ["http://www.w3.org/Consortium/Legal/copyright-software-19980720.html"], "isOsiApproved": false}, "W3C-20150513": {"reference": "https://spdx.org/licenses/W3C-20150513.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/W3C-20150513.json", "referenceNumber": 224, "name": "W3C Software Notice and Document License (2015-05-13)", "licenseId": "W3C-20150513", "seeAlso": ["https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document"], "isOsiApproved": false}, "Watcom-1.0": {"reference": "https://spdx.org/licenses/Watcom-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Watcom-1.0.json", "referenceNumber": 225, "name": "Sybase Open Watcom Public License 1.0", "licenseId": "Watcom-1.0", "seeAlso": ["https://opensource.org/licenses/Watcom-1.0"], "isOsiApproved": true, "isFsfLibre": false}, "Wsuipa": {"reference": "https://spdx.org/licenses/Wsuipa.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Wsuipa.json", "referenceNumber": 155, "name": "Wsuipa License", "licenseId": "Wsuipa", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Wsuipa"], "isOsiApproved": false}, "WTFPL": {"reference": "https://spdx.org/licenses/WTFPL.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/WTFPL.json", "referenceNumber": 130, "name": "Do What The F*ck You Want To Public License", "licenseId": "WTFPL", "seeAlso": ["http://www.wtfpl.net/about/", "http://sam.zoy.org/wtfpl/COPYING"], "isOsiApproved": false, "isFsfLibre": true}, "wxWindows": {"reference": "https://spdx.org/licenses/wxWindows.html", "isDeprecatedLicenseId": true, "detailsUrl": "https://spdx.org/licenses/wxWindows.json", "referenceNumber": 376, "name": "wxWindows Library License", "licenseId": "wxWindows", "seeAlso": ["https://opensource.org/licenses/WXwindows"], "isOsiApproved": true}, "X11": {"reference": "https://spdx.org/licenses/X11.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11.json", "referenceNumber": 165, "name": "X11 License", "licenseId": "X11", "seeAlso": ["http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3"], "isOsiApproved": false, "isFsfLibre": true}, "X11-distribute-modifications-variant": {"reference": "https://spdx.org/licenses/X11-distribute-modifications-variant.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/X11-distribute-modifications-variant.json", "referenceNumber": 215, "name": "X11 License Distribution Modification Variant", "licenseId": "X11-distribute-modifications-variant", "seeAlso": ["https://github.com/mirror/ncurses/blob/master/COPYING"], "isOsiApproved": false}, "Xerox": {"reference": "https://spdx.org/licenses/Xerox.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xerox.json", "referenceNumber": 486, "name": "Xerox License", "licenseId": "Xerox", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Xerox"], "isOsiApproved": false}, "XFree86-1.1": {"reference": "https://spdx.org/licenses/XFree86-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XFree86-1.1.json", "referenceNumber": 372, "name": "XFree86 License 1.1", "licenseId": "XFree86-1.1", "seeAlso": ["http://www.xfree86.org/current/LICENSE4.html"], "isOsiApproved": false, "isFsfLibre": true}, "xinetd": {"reference": "https://spdx.org/licenses/xinetd.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xinetd.json", "referenceNumber": 337, "name": "xinetd License", "licenseId": "xinetd", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Xinetd_License"], "isOsiApproved": false, "isFsfLibre": true}, "Xnet": {"reference": "https://spdx.org/licenses/Xnet.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Xnet.json", "referenceNumber": 80, "name": "X.Net License", "licenseId": "Xnet", "seeAlso": ["https://opensource.org/licenses/Xnet"], "isOsiApproved": true}, "xpp": {"reference": "https://spdx.org/licenses/xpp.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/xpp.json", "referenceNumber": 418, "name": "XPP License", "licenseId": "xpp", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/xpp"], "isOsiApproved": false}, "XSkat": {"reference": "https://spdx.org/licenses/XSkat.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/XSkat.json", "referenceNumber": 143, "name": "XSkat License", "licenseId": "XSkat", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/XSkat_License"], "isOsiApproved": false}, "YPL-1.0": {"reference": "https://spdx.org/licenses/YPL-1.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.0.json", "referenceNumber": 319, "name": "Yahoo! Public License v1.0", "licenseId": "YPL-1.0", "seeAlso": ["http://www.zimbra.com/license/yahoo_public_license_1.0.html"], "isOsiApproved": false}, "YPL-1.1": {"reference": "https://spdx.org/licenses/YPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/YPL-1.1.json", "referenceNumber": 370, "name": "Yahoo! Public License v1.1", "licenseId": "YPL-1.1", "seeAlso": ["http://www.zimbra.com/license/yahoo_public_license_1.1.html"], "isOsiApproved": false, "isFsfLibre": true}, "Zed": {"reference": "https://spdx.org/licenses/Zed.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zed.json", "referenceNumber": 151, "name": "Zed License", "licenseId": "Zed", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/Zed"], "isOsiApproved": false}, "Zend-2.0": {"reference": "https://spdx.org/licenses/Zend-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zend-2.0.json", "referenceNumber": 63, "name": "Zend License v2.0", "licenseId": "Zend-2.0", "seeAlso": ["https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt"], "isOsiApproved": false, "isFsfLibre": true}, "Zimbra-1.3": {"reference": "https://spdx.org/licenses/Zimbra-1.3.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.3.json", "referenceNumber": 277, "name": "Zimbra Public License v1.3", "licenseId": "Zimbra-1.3", "seeAlso": ["http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html"], "isOsiApproved": false, "isFsfLibre": true}, "Zimbra-1.4": {"reference": "https://spdx.org/licenses/Zimbra-1.4.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zimbra-1.4.json", "referenceNumber": 417, "name": "Zimbra Public License v1.4", "licenseId": "Zimbra-1.4", "seeAlso": ["http://www.zimbra.com/legal/zimbra-public-license-1-4"], "isOsiApproved": false}, "Zlib": {"reference": "https://spdx.org/licenses/Zlib.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/Zlib.json", "referenceNumber": 203, "name": "zlib License", "licenseId": "Zlib", "seeAlso": ["http://www.zlib.net/zlib_license.html", "https://opensource.org/licenses/Zlib"], "isOsiApproved": true, "isFsfLibre": true}, "zlib-acknowledgement": {"reference": "https://spdx.org/licenses/zlib-acknowledgement.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/zlib-acknowledgement.json", "referenceNumber": 83, "name": "zlib/libpng License with Acknowledgement", "licenseId": "zlib-acknowledgement", "seeAlso": ["https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement"], "isOsiApproved": false}, "ZPL-1.1": {"reference": "https://spdx.org/licenses/ZPL-1.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-1.1.json", "referenceNumber": 52, "name": "Zope Public License 1.1", "licenseId": "ZPL-1.1", "seeAlso": ["http://old.zope.org/Resources/License/ZPL-1.1"], "isOsiApproved": false}, "ZPL-2.0": {"reference": "https://spdx.org/licenses/ZPL-2.0.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.0.json", "referenceNumber": 106, "name": "Zope Public License 2.0", "licenseId": "ZPL-2.0", "seeAlso": ["http://old.zope.org/Resources/License/ZPL-2.0", "https://opensource.org/licenses/ZPL-2.0"], "isOsiApproved": true, "isFsfLibre": true}, "ZPL-2.1": {"reference": "https://spdx.org/licenses/ZPL-2.1.html", "isDeprecatedLicenseId": false, "detailsUrl": "https://spdx.org/licenses/ZPL-2.1.json", "referenceNumber": 392, "name": "Zope Public License 2.1", "licenseId": "ZPL-2.1", "seeAlso": ["http://old.zope.org/Resources/ZPL/"], "isOsiApproved": true, "isFsfLibre": true}} \ No newline at end of file diff --git a/aleksis/core/util/model_helpers.py b/aleksis/core/util/model_helpers.py index 57fab43ab14b787b9300b523e963efbcb0cee121..f1732a72fb3e17ecdcfee18b59cb18d7fd98fd55 100644 --- a/aleksis/core/util/model_helpers.py +++ b/aleksis/core/util/model_helpers.py @@ -1,3 +1,5 @@ +from dj_iconify.util import icon_choices + # Materialize colors (without accent, darken and lighten classes) COLOURS = [ ("red", "red"), @@ -24,938 +26,8 @@ COLOURS = [ ("transparent", "transparent"), ] -# About 1000 icon names from Google's github repository -ICONS = [ - ("3d_rotation", "3d_rotation"), - ("ac_unit", "ac_unit"), - ("access_alarm", "access_alarm"), - ("access_alarms", "access_alarms"), - ("access_time", "access_time"), - ("accessibility", "accessibility"), - ("accessible", "accessible"), - ("account_balance", "account_balance"), - ("account_balance_wallet", "account_balance_wallet"), - ("account_box", "account_box"), - ("account_circle", "account_circle"), - ("adb", "adb"), - ("add", "add"), - ("add_a_photo", "add_a_photo"), - ("add_alarm", "add_alarm"), - ("add_alert", "add_alert"), - ("add_box", "add_box"), - ("add_circle", "add_circle"), - ("add_circle_outline", "add_circle_outline"), - ("add_location", "add_location"), - ("add_shopping_cart", "add_shopping_cart"), - ("add_to_photos", "add_to_photos"), - ("add_to_queue", "add_to_queue"), - ("adjust", "adjust"), - ("airline_seat_flat", "airline_seat_flat"), - ("airline_seat_flat_angled", "airline_seat_flat_angled"), - ("airline_seat_individual_suite", "airline_seat_individual_suite"), - ("airline_seat_legroom_extra", "airline_seat_legroom_extra"), - ("airline_seat_legroom_normal", "airline_seat_legroom_normal"), - ("airline_seat_legroom_reduced", "airline_seat_legroom_reduced"), - ("airline_seat_recline_extra", "airline_seat_recline_extra"), - ("airline_seat_recline_normal", "airline_seat_recline_normal"), - ("airplanemode_active", "airplanemode_active"), - ("airplanemode_inactive", "airplanemode_inactive"), - ("airplay", "airplay"), - ("airport_shuttle", "airport_shuttle"), - ("alarm", "alarm"), - ("alarm_add", "alarm_add"), - ("alarm_off", "alarm_off"), - ("alarm_on", "alarm_on"), - ("album", "album"), - ("all_inclusive", "all_inclusive"), - ("all_out", "all_out"), - ("android", "android"), - ("announcement", "announcement"), - ("apps", "apps"), - ("archive", "archive"), - ("arrow_back", "arrow_back"), - ("arrow_downward", "arrow_downward"), - ("arrow_drop_down", "arrow_drop_down"), - ("arrow_drop_down_circle", "arrow_drop_down_circle"), - ("arrow_drop_up", "arrow_drop_up"), - ("arrow_forward", "arrow_forward"), - ("arrow_upward", "arrow_upward"), - ("art_track", "art_track"), - ("aspect_ratio", "aspect_ratio"), - ("assessment", "assessment"), - ("assignment", "assignment"), - ("assignment_ind", "assignment_ind"), - ("assignment_late", "assignment_late"), - ("assignment_return", "assignment_return"), - ("assignment_returned", "assignment_returned"), - ("assignment_turned_in", "assignment_turned_in"), - ("assistant", "assistant"), - ("assistant_photo", "assistant_photo"), - ("attach_file", "attach_file"), - ("attach_money", "attach_money"), - ("attachment", "attachment"), - ("audiotrack", "audiotrack"), - ("autorenew", "autorenew"), - ("av_timer", "av_timer"), - ("backspace", "backspace"), - ("backup", "backup"), - ("battery_alert", "battery_alert"), - ("battery_charging_full", "battery_charging_full"), - ("battery_full", "battery_full"), - ("battery_std", "battery_std"), - ("battery_unknown", "battery_unknown"), - ("beach_access", "beach_access"), - ("beenhere", "beenhere"), - ("block", "block"), - ("bluetooth", "bluetooth"), - ("bluetooth_audio", "bluetooth_audio"), - ("bluetooth_connected", "bluetooth_connected"), - ("bluetooth_disabled", "bluetooth_disabled"), - ("bluetooth_searching", "bluetooth_searching"), - ("blur_circular", "blur_circular"), - ("blur_linear", "blur_linear"), - ("blur_off", "blur_off"), - ("blur_on", "blur_on"), - ("book", "book"), - ("bookmark", "bookmark"), - ("bookmark_border", "bookmark_border"), - ("border_all", "border_all"), - ("border_bottom", "border_bottom"), - ("border_clear", "border_clear"), - ("border_color", "border_color"), - ("border_horizontal", "border_horizontal"), - ("border_inner", "border_inner"), - ("border_left", "border_left"), - ("border_outer", "border_outer"), - ("border_right", "border_right"), - ("border_style", "border_style"), - ("border_top", "border_top"), - ("border_vertical", "border_vertical"), - ("branding_watermark", "branding_watermark"), - ("brightness_1", "brightness_1"), - ("brightness_2", "brightness_2"), - ("brightness_3", "brightness_3"), - ("brightness_4", "brightness_4"), - ("brightness_5", "brightness_5"), - ("brightness_6", "brightness_6"), - ("brightness_7", "brightness_7"), - ("brightness_auto", "brightness_auto"), - ("brightness_high", "brightness_high"), - ("brightness_low", "brightness_low"), - ("brightness_medium", "brightness_medium"), - ("broken_image", "broken_image"), - ("brush", "brush"), - ("bubble_chart", "bubble_chart"), - ("bug_report", "bug_report"), - ("build", "build"), - ("burst_mode", "burst_mode"), - ("business", "business"), - ("business_center", "business_center"), - ("cached", "cached"), - ("cake", "cake"), - ("call", "call"), - ("call_end", "call_end"), - ("call_made", "call_made"), - ("call_merge", "call_merge"), - ("call_missed", "call_missed"), - ("call_missed_outgoing", "call_missed_outgoing"), - ("call_received", "call_received"), - ("call_split", "call_split"), - ("call_to_action", "call_to_action"), - ("camera", "camera"), - ("camera_alt", "camera_alt"), - ("camera_enhance", "camera_enhance"), - ("camera_front", "camera_front"), - ("camera_rear", "camera_rear"), - ("camera_roll", "camera_roll"), - ("cancel", "cancel"), - ("card_giftcard", "card_giftcard"), - ("card_membership", "card_membership"), - ("card_travel", "card_travel"), - ("casino", "casino"), - ("cast", "cast"), - ("cast_connected", "cast_connected"), - ("center_focus_strong", "center_focus_strong"), - ("center_focus_weak", "center_focus_weak"), - ("change_history", "change_history"), - ("chat", "chat"), - ("chat_bubble", "chat_bubble"), - ("chat_bubble_outline", "chat_bubble_outline"), - ("check", "check"), - ("check_box", "check_box"), - ("check_box_outline_blank", "check_box_outline_blank"), - ("check_circle", "check_circle"), - ("chevron_left", "chevron_left"), - ("chevron_right", "chevron_right"), - ("child_care", "child_care"), - ("child_friendly", "child_friendly"), - ("chrome_reader_mode", "chrome_reader_mode"), - ("class", "class"), - ("clear", "clear"), - ("clear_all", "clear_all"), - ("close", "close"), - ("closed_caption", "closed_caption"), - ("cloud", "cloud"), - ("cloud_circle", "cloud_circle"), - ("cloud_done", "cloud_done"), - ("cloud_download", "cloud_download"), - ("cloud_off", "cloud_off"), - ("cloud_queue", "cloud_queue"), - ("cloud_upload", "cloud_upload"), - ("code", "code"), - ("collections", "collections"), - ("collections_bookmark", "collections_bookmark"), - ("color_lens", "color_lens"), - ("colorize", "colorize"), - ("comment", "comment"), - ("compare", "compare"), - ("compare_arrows", "compare_arrows"), - ("computer", "computer"), - ("confirmation_number", "confirmation_number"), - ("contact_mail", "contact_mail"), - ("contact_phone", "contact_phone"), - ("contacts", "contacts"), - ("content_copy", "content_copy"), - ("content_cut", "content_cut"), - ("content_paste", "content_paste"), - ("control_point", "control_point"), - ("control_point_duplicate", "control_point_duplicate"), - ("copyright", "copyright"), - ("create", "create"), - ("create_new_folder", "create_new_folder"), - ("credit_card", "credit_card"), - ("crop", "crop"), - ("crop_16_9", "crop_16_9"), - ("crop_3_2", "crop_3_2"), - ("crop_5_4", "crop_5_4"), - ("crop_7_5", "crop_7_5"), - ("crop_din", "crop_din"), - ("crop_free", "crop_free"), - ("crop_landscape", "crop_landscape"), - ("crop_original", "crop_original"), - ("crop_portrait", "crop_portrait"), - ("crop_rotate", "crop_rotate"), - ("crop_square", "crop_square"), - ("dashboard", "dashboard"), - ("data_usage", "data_usage"), - ("date_range", "date_range"), - ("dehaze", "dehaze"), - ("delete", "delete"), - ("delete_forever", "delete_forever"), - ("delete_sweep", "delete_sweep"), - ("description", "description"), - ("desktop_mac", "desktop_mac"), - ("desktop_windows", "desktop_windows"), - ("details", "details"), - ("developer_board", "developer_board"), - ("developer_mode", "developer_mode"), - ("device_hub", "device_hub"), - ("devices", "devices"), - ("devices_other", "devices_other"), - ("dialer_sip", "dialer_sip"), - ("dialpad", "dialpad"), - ("directions", "directions"), - ("directions_bike", "directions_bike"), - ("directions_boat", "directions_boat"), - ("directions_bus", "directions_bus"), - ("directions_car", "directions_car"), - ("directions_railway", "directions_railway"), - ("directions_run", "directions_run"), - ("directions_subway", "directions_subway"), - ("directions_transit", "directions_transit"), - ("directions_walk", "directions_walk"), - ("disc_full", "disc_full"), - ("dns", "dns"), - ("do_not_disturb", "do_not_disturb"), - ("do_not_disturb_alt", "do_not_disturb_alt"), - ("do_not_disturb_off", "do_not_disturb_off"), - ("do_not_disturb_on", "do_not_disturb_on"), - ("dock", "dock"), - ("domain", "domain"), - ("done", "done"), - ("done_all", "done_all"), - ("donut_large", "donut_large"), - ("donut_small", "donut_small"), - ("drafts", "drafts"), - ("drag_handle", "drag_handle"), - ("drive_eta", "drive_eta"), - ("dvr", "dvr"), - ("edit", "edit"), - ("edit_location", "edit_location"), - ("eject", "eject"), - ("email", "email"), - ("enhanced_encryption", "enhanced_encryption"), - ("equalizer", "equalizer"), - ("error", "error"), - ("error_outline", "error_outline"), - ("euro_symbol", "euro_symbol"), - ("ev_station", "ev_station"), - ("event", "event"), - ("event_available", "event_available"), - ("event_busy", "event_busy"), - ("event_note", "event_note"), - ("event_seat", "event_seat"), - ("exit_to_app", "exit_to_app"), - ("expand_less", "expand_less"), - ("expand_more", "expand_more"), - ("explicit", "explicit"), - ("explore", "explore"), - ("exposure", "exposure"), - ("exposure_neg_1", "exposure_neg_1"), - ("exposure_neg_2", "exposure_neg_2"), - ("exposure_plus_1", "exposure_plus_1"), - ("exposure_plus_2", "exposure_plus_2"), - ("exposure_zero", "exposure_zero"), - ("extension", "extension"), - ("face", "face"), - ("fast_forward", "fast_forward"), - ("fast_rewind", "fast_rewind"), - ("favorite", "favorite"), - ("favorite_border", "favorite_border"), - ("featured_play_list", "featured_play_list"), - ("featured_video", "featured_video"), - ("feedback", "feedback"), - ("fiber_dvr", "fiber_dvr"), - ("fiber_manual_record", "fiber_manual_record"), - ("fiber_new", "fiber_new"), - ("fiber_pin", "fiber_pin"), - ("fiber_smart_record", "fiber_smart_record"), - ("file_download", "file_download"), - ("file_upload", "file_upload"), - ("filter", "filter"), - ("filter_1", "filter_1"), - ("filter_2", "filter_2"), - ("filter_3", "filter_3"), - ("filter_4", "filter_4"), - ("filter_5", "filter_5"), - ("filter_6", "filter_6"), - ("filter_7", "filter_7"), - ("filter_8", "filter_8"), - ("filter_9", "filter_9"), - ("filter_9_plus", "filter_9_plus"), - ("filter_b_and_w", "filter_b_and_w"), - ("filter_center_focus", "filter_center_focus"), - ("filter_drama", "filter_drama"), - ("filter_frames", "filter_frames"), - ("filter_hdr", "filter_hdr"), - ("filter_list", "filter_list"), - ("filter_none", "filter_none"), - ("filter_tilt_shift", "filter_tilt_shift"), - ("filter_vintage", "filter_vintage"), - ("find_in_page", "find_in_page"), - ("find_replace", "find_replace"), - ("fingerprint", "fingerprint"), - ("first_page", "first_page"), - ("fitness_center", "fitness_center"), - ("flag", "flag"), - ("flare", "flare"), - ("flash_auto", "flash_auto"), - ("flash_off", "flash_off"), - ("flash_on", "flash_on"), - ("flight", "flight"), - ("flight_land", "flight_land"), - ("flight_takeoff", "flight_takeoff"), - ("flip", "flip"), - ("flip_to_back", "flip_to_back"), - ("flip_to_front", "flip_to_front"), - ("folder", "folder"), - ("folder_open", "folder_open"), - ("folder_shared", "folder_shared"), - ("folder_special", "folder_special"), - ("font_download", "font_download"), - ("format_align_center", "format_align_center"), - ("format_align_justify", "format_align_justify"), - ("format_align_left", "format_align_left"), - ("format_align_right", "format_align_right"), - ("format_bold", "format_bold"), - ("format_clear", "format_clear"), - ("format_color_fill", "format_color_fill"), - ("format_color_reset", "format_color_reset"), - ("format_color_text", "format_color_text"), - ("format_indent_decrease", "format_indent_decrease"), - ("format_indent_increase", "format_indent_increase"), - ("format_italic", "format_italic"), - ("format_line_spacing", "format_line_spacing"), - ("format_list_bulleted", "format_list_bulleted"), - ("format_list_numbered", "format_list_numbered"), - ("format_paint", "format_paint"), - ("format_quote", "format_quote"), - ("format_shapes", "format_shapes"), - ("format_size", "format_size"), - ("format_strikethrough", "format_strikethrough"), - ("format_textdirection_l_to_r", "format_textdirection_l_to_r"), - ("format_textdirection_r_to_l", "format_textdirection_r_to_l"), - ("format_underlined", "format_underlined"), - ("forum", "forum"), - ("forward", "forward"), - ("forward_10", "forward_10"), - ("forward_30", "forward_30"), - ("forward_5", "forward_5"), - ("free_breakfast", "free_breakfast"), - ("fullscreen", "fullscreen"), - ("fullscreen_exit", "fullscreen_exit"), - ("functions", "functions"), - ("g_translate", "g_translate"), - ("gamepad", "gamepad"), - ("games", "games"), - ("gavel", "gavel"), - ("gesture", "gesture"), - ("get_app", "get_app"), - ("gif", "gif"), - ("golf_course", "golf_course"), - ("gps_fixed", "gps_fixed"), - ("gps_not_fixed", "gps_not_fixed"), - ("gps_off", "gps_off"), - ("grade", "grade"), - ("gradient", "gradient"), - ("grain", "grain"), - ("graphic_eq", "graphic_eq"), - ("grid_off", "grid_off"), - ("grid_on", "grid_on"), - ("group", "group"), - ("group_add", "group_add"), - ("group_work", "group_work"), - ("hd", "hd"), - ("hdr_off", "hdr_off"), - ("hdr_on", "hdr_on"), - ("hdr_strong", "hdr_strong"), - ("hdr_weak", "hdr_weak"), - ("headset", "headset"), - ("headset_mic", "headset_mic"), - ("healing", "healing"), - ("hearing", "hearing"), - ("help", "help"), - ("help_outline", "help_outline"), - ("high_quality", "high_quality"), - ("highlight", "highlight"), - ("highlight_off", "highlight_off"), - ("history", "history"), - ("home", "home"), - ("hot_tub", "hot_tub"), - ("hotel", "hotel"), - ("hourglass_empty", "hourglass_empty"), - ("hourglass_full", "hourglass_full"), - ("http", "http"), - ("https", "https"), - ("image", "image"), - ("image_aspect_ratio", "image_aspect_ratio"), - ("import_contacts", "import_contacts"), - ("import_export", "import_export"), - ("important_devices", "important_devices"), - ("inbox", "inbox"), - ("indeterminate_check_box", "indeterminate_check_box"), - ("info", "info"), - ("info_outline", "info_outline"), - ("input", "input"), - ("insert_chart", "insert_chart"), - ("insert_comment", "insert_comment"), - ("insert_drive_file", "insert_drive_file"), - ("insert_emoticon", "insert_emoticon"), - ("insert_invitation", "insert_invitation"), - ("insert_link", "insert_link"), - ("insert_photo", "insert_photo"), - ("invert_colors", "invert_colors"), - ("invert_colors_off", "invert_colors_off"), - ("iso", "iso"), - ("keyboard", "keyboard"), - ("keyboard_arrow_down", "keyboard_arrow_down"), - ("keyboard_arrow_left", "keyboard_arrow_left"), - ("keyboard_arrow_right", "keyboard_arrow_right"), - ("keyboard_arrow_up", "keyboard_arrow_up"), - ("keyboard_backspace", "keyboard_backspace"), - ("keyboard_capslock", "keyboard_capslock"), - ("keyboard_hide", "keyboard_hide"), - ("keyboard_return", "keyboard_return"), - ("keyboard_tab", "keyboard_tab"), - ("keyboard_voice", "keyboard_voice"), - ("kitchen", "kitchen"), - ("label", "label"), - ("label_outline", "label_outline"), - ("landscape", "landscape"), - ("language", "language"), - ("laptop", "laptop"), - ("laptop_chromebook", "laptop_chromebook"), - ("laptop_mac", "laptop_mac"), - ("laptop_windows", "laptop_windows"), - ("last_page", "last_page"), - ("launch", "launch"), - ("layers", "layers"), - ("layers_clear", "layers_clear"), - ("leak_add", "leak_add"), - ("leak_remove", "leak_remove"), - ("lens", "lens"), - ("library_add", "library_add"), - ("library_books", "library_books"), - ("library_music", "library_music"), - ("lightbulb_outline", "lightbulb_outline"), - ("line_style", "line_style"), - ("line_weight", "line_weight"), - ("linear_scale", "linear_scale"), - ("link", "link"), - ("linked_camera", "linked_camera"), - ("list", "list"), - ("live_help", "live_help"), - ("live_tv", "live_tv"), - ("local_activity", "local_activity"), - ("local_airport", "local_airport"), - ("local_atm", "local_atm"), - ("local_bar", "local_bar"), - ("local_cafe", "local_cafe"), - ("local_car_wash", "local_car_wash"), - ("local_convenience_store", "local_convenience_store"), - ("local_dining", "local_dining"), - ("local_drink", "local_drink"), - ("local_florist", "local_florist"), - ("local_gas_station", "local_gas_station"), - ("local_grocery_store", "local_grocery_store"), - ("local_hospital", "local_hospital"), - ("local_hotel", "local_hotel"), - ("local_laundry_service", "local_laundry_service"), - ("local_library", "local_library"), - ("local_mall", "local_mall"), - ("local_movies", "local_movies"), - ("local_offer", "local_offer"), - ("local_parking", "local_parking"), - ("local_pharmacy", "local_pharmacy"), - ("local_phone", "local_phone"), - ("local_pizza", "local_pizza"), - ("local_play", "local_play"), - ("local_post_office", "local_post_office"), - ("local_printshop", "local_printshop"), - ("local_see", "local_see"), - ("local_shipping", "local_shipping"), - ("local_taxi", "local_taxi"), - ("location_city", "location_city"), - ("location_disabled", "location_disabled"), - ("location_off", "location_off"), - ("location_on", "location_on"), - ("location_searching", "location_searching"), - ("lock", "lock"), - ("lock_open", "lock_open"), - ("lock_outline", "lock_outline"), - ("looks", "looks"), - ("looks_3", "looks_3"), - ("looks_4", "looks_4"), - ("looks_5", "looks_5"), - ("looks_6", "looks_6"), - ("looks_one", "looks_one"), - ("looks_two", "looks_two"), - ("loop", "loop"), - ("loupe", "loupe"), - ("low_priority", "low_priority"), - ("loyalty", "loyalty"), - ("mail", "mail"), - ("mail_outline", "mail_outline"), - ("map", "map"), - ("markunread", "markunread"), - ("markunread_mailbox", "markunread_mailbox"), - ("memory", "memory"), - ("menu", "menu"), - ("merge_type", "merge_type"), - ("message", "message"), - ("mic", "mic"), - ("mic_none", "mic_none"), - ("mic_off", "mic_off"), - ("mms", "mms"), - ("mode_comment", "mode_comment"), - ("mode_edit", "mode_edit"), - ("monetization_on", "monetization_on"), - ("money_off", "money_off"), - ("monochrome_photos", "monochrome_photos"), - ("mood", "mood"), - ("mood_bad", "mood_bad"), - ("more", "more"), - ("more_horiz", "more_horiz"), - ("more_vert", "more_vert"), - ("motorcycle", "motorcycle"), - ("mouse", "mouse"), - ("move_to_inbox", "move_to_inbox"), - ("movie", "movie"), - ("movie_creation", "movie_creation"), - ("movie_filter", "movie_filter"), - ("multiline_chart", "multiline_chart"), - ("music_note", "music_note"), - ("music_video", "music_video"), - ("my_location", "my_location"), - ("nature", "nature"), - ("nature_people", "nature_people"), - ("navigate_before", "navigate_before"), - ("navigate_next", "navigate_next"), - ("navigation", "navigation"), - ("near_me", "near_me"), - ("network_cell", "network_cell"), - ("network_check", "network_check"), - ("network_locked", "network_locked"), - ("network_wifi", "network_wifi"), - ("new_releases", "new_releases"), - ("next_week", "next_week"), - ("nfc", "nfc"), - ("no_encryption", "no_encryption"), - ("no_sim", "no_sim"), - ("not_interested", "not_interested"), - ("note", "note"), - ("note_add", "note_add"), - ("notifications", "notifications"), - ("notifications_active", "notifications_active"), - ("notifications_none", "notifications_none"), - ("notifications_off", "notifications_off"), - ("notifications_paused", "notifications_paused"), - ("offline_pin", "offline_pin"), - ("ondemand_video", "ondemand_video"), - ("opacity", "opacity"), - ("open_in_browser", "open_in_browser"), - ("open_in_new", "open_in_new"), - ("open_with", "open_with"), - ("pages", "pages"), - ("pageview", "pageview"), - ("palette", "palette"), - ("pan_tool", "pan_tool"), - ("panorama", "panorama"), - ("panorama_fish_eye", "panorama_fish_eye"), - ("panorama_horizontal", "panorama_horizontal"), - ("panorama_vertical", "panorama_vertical"), - ("panorama_wide_angle", "panorama_wide_angle"), - ("party_mode", "party_mode"), - ("pause", "pause"), - ("pause_circle_filled", "pause_circle_filled"), - ("pause_circle_outline", "pause_circle_outline"), - ("payment", "payment"), - ("people", "people"), - ("people_outline", "people_outline"), - ("perm_camera_mic", "perm_camera_mic"), - ("perm_contact_calendar", "perm_contact_calendar"), - ("perm_data_setting", "perm_data_setting"), - ("perm_device_information", "perm_device_information"), - ("perm_identity", "perm_identity"), - ("perm_media", "perm_media"), - ("perm_phone_msg", "perm_phone_msg"), - ("perm_scan_wifi", "perm_scan_wifi"), - ("person", "person"), - ("person_add", "person_add"), - ("person_outline", "person_outline"), - ("person_pin", "person_pin"), - ("person_pin_circle", "person_pin_circle"), - ("personal_video", "personal_video"), - ("pets", "pets"), - ("phone", "phone"), - ("phone_android", "phone_android"), - ("phone_bluetooth_speaker", "phone_bluetooth_speaker"), - ("phone_forwarded", "phone_forwarded"), - ("phone_in_talk", "phone_in_talk"), - ("phone_iphone", "phone_iphone"), - ("phone_locked", "phone_locked"), - ("phone_missed", "phone_missed"), - ("phone_paused", "phone_paused"), - ("phonelink", "phonelink"), - ("phonelink_erase", "phonelink_erase"), - ("phonelink_lock", "phonelink_lock"), - ("phonelink_off", "phonelink_off"), - ("phonelink_ring", "phonelink_ring"), - ("phonelink_setup", "phonelink_setup"), - ("photo", "photo"), - ("photo_album", "photo_album"), - ("photo_camera", "photo_camera"), - ("photo_filter", "photo_filter"), - ("photo_library", "photo_library"), - ("photo_size_select_actual", "photo_size_select_actual"), - ("photo_size_select_large", "photo_size_select_large"), - ("photo_size_select_small", "photo_size_select_small"), - ("picture_as_pdf", "picture_as_pdf"), - ("picture_in_picture", "picture_in_picture"), - ("picture_in_picture_alt", "picture_in_picture_alt"), - ("pie_chart", "pie_chart"), - ("pie_chart_outlined", "pie_chart_outlined"), - ("pin_drop", "pin_drop"), - ("place", "place"), - ("play_arrow", "play_arrow"), - ("play_circle_filled", "play_circle_filled"), - ("play_circle_outline", "play_circle_outline"), - ("play_for_work", "play_for_work"), - ("playlist_add", "playlist_add"), - ("playlist_add_check", "playlist_add_check"), - ("playlist_play", "playlist_play"), - ("plus_one", "plus_one"), - ("poll", "poll"), - ("polymer", "polymer"), - ("pool", "pool"), - ("portable_wifi_off", "portable_wifi_off"), - ("portrait", "portrait"), - ("power", "power"), - ("power_input", "power_input"), - ("power_settings_new", "power_settings_new"), - ("pregnant_woman", "pregnant_woman"), - ("present_to_all", "present_to_all"), - ("print", "print"), - ("priority_high", "priority_high"), - ("public", "public"), - ("publish", "publish"), - ("query_builder", "query_builder"), - ("question_answer", "question_answer"), - ("queue", "queue"), - ("queue_music", "queue_music"), - ("queue_play_next", "queue_play_next"), - ("radio", "radio"), - ("radio_button_checked", "radio_button_checked"), - ("radio_button_unchecked", "radio_button_unchecked"), - ("rate_review", "rate_review"), - ("receipt", "receipt"), - ("recent_actors", "recent_actors"), - ("record_voice_over", "record_voice_over"), - ("redeem", "redeem"), - ("redo", "redo"), - ("refresh", "refresh"), - ("remove", "remove"), - ("remove_circle", "remove_circle"), - ("remove_circle_outline", "remove_circle_outline"), - ("remove_from_queue", "remove_from_queue"), - ("remove_red_eye", "remove_red_eye"), - ("remove_shopping_cart", "remove_shopping_cart"), - ("reorder", "reorder"), - ("repeat", "repeat"), - ("repeat_one", "repeat_one"), - ("replay", "replay"), - ("replay_10", "replay_10"), - ("replay_30", "replay_30"), - ("replay_5", "replay_5"), - ("reply", "reply"), - ("reply_all", "reply_all"), - ("report", "report"), - ("report_problem", "report_problem"), - ("restaurant", "restaurant"), - ("restaurant_menu", "restaurant_menu"), - ("restore", "restore"), - ("restore_page", "restore_page"), - ("ring_volume", "ring_volume"), - ("room", "room"), - ("room_service", "room_service"), - ("rotate_90_degrees_ccw", "rotate_90_degrees_ccw"), - ("rotate_left", "rotate_left"), - ("rotate_right", "rotate_right"), - ("rounded_corner", "rounded_corner"), - ("router", "router"), - ("rowing", "rowing"), - ("rss_feed", "rss_feed"), - ("rv_hookup", "rv_hookup"), - ("satellite", "satellite"), - ("save", "save"), - ("scanner", "scanner"), - ("schedule", "schedule"), - ("school", "school"), - ("screen_lock_landscape", "screen_lock_landscape"), - ("screen_lock_portrait", "screen_lock_portrait"), - ("screen_lock_rotation", "screen_lock_rotation"), - ("screen_rotation", "screen_rotation"), - ("screen_share", "screen_share"), - ("sd_card", "sd_card"), - ("sd_storage", "sd_storage"), - ("search", "search"), - ("security", "security"), - ("select_all", "select_all"), - ("send", "send"), - ("sentiment_dissatisfied", "sentiment_dissatisfied"), - ("sentiment_neutral", "sentiment_neutral"), - ("sentiment_satisfied", "sentiment_satisfied"), - ("sentiment_very_dissatisfied", "sentiment_very_dissatisfied"), - ("sentiment_very_satisfied", "sentiment_very_satisfied"), - ("settings", "settings"), - ("settings_applications", "settings_applications"), - ("settings_backup_restore", "settings_backup_restore"), - ("settings_bluetooth", "settings_bluetooth"), - ("settings_brightness", "settings_brightness"), - ("settings_cell", "settings_cell"), - ("settings_ethernet", "settings_ethernet"), - ("settings_input_antenna", "settings_input_antenna"), - ("settings_input_component", "settings_input_component"), - ("settings_input_composite", "settings_input_composite"), - ("settings_input_hdmi", "settings_input_hdmi"), - ("settings_input_svideo", "settings_input_svideo"), - ("settings_overscan", "settings_overscan"), - ("settings_phone", "settings_phone"), - ("settings_power", "settings_power"), - ("settings_remote", "settings_remote"), - ("settings_system_daydream", "settings_system_daydream"), - ("settings_voice", "settings_voice"), - ("share", "share"), - ("shop", "shop"), - ("shop_two", "shop_two"), - ("shopping_basket", "shopping_basket"), - ("shopping_cart", "shopping_cart"), - ("short_text", "short_text"), - ("show_chart", "show_chart"), - ("shuffle", "shuffle"), - ("signal_cellular_4_bar", "signal_cellular_4_bar"), - ("signal_cellular_connected_no_internet_4_bar", "signal_cellular_connected_no_internet_4_bar"), - ("signal_cellular_no_sim", "signal_cellular_no_sim"), - ("signal_cellular_null", "signal_cellular_null"), - ("signal_cellular_off", "signal_cellular_off"), - ("signal_wifi_4_bar", "signal_wifi_4_bar"), - ("signal_wifi_4_bar_lock", "signal_wifi_4_bar_lock"), - ("signal_wifi_off", "signal_wifi_off"), - ("sim_card", "sim_card"), - ("sim_card_alert", "sim_card_alert"), - ("skip_next", "skip_next"), - ("skip_previous", "skip_previous"), - ("slideshow", "slideshow"), - ("slow_motion_video", "slow_motion_video"), - ("smartphone", "smartphone"), - ("smoke_free", "smoke_free"), - ("smoking_rooms", "smoking_rooms"), - ("sms", "sms"), - ("sms_failed", "sms_failed"), - ("snooze", "snooze"), - ("sort", "sort"), - ("sort_by_alpha", "sort_by_alpha"), - ("spa", "spa"), - ("space_bar", "space_bar"), - ("speaker", "speaker"), - ("speaker_group", "speaker_group"), - ("speaker_notes", "speaker_notes"), - ("speaker_notes_off", "speaker_notes_off"), - ("speaker_phone", "speaker_phone"), - ("spellcheck", "spellcheck"), - ("star", "star"), - ("star_border", "star_border"), - ("star_half", "star_half"), - ("stars", "stars"), - ("stay_current_landscape", "stay_current_landscape"), - ("stay_current_portrait", "stay_current_portrait"), - ("stay_primary_landscape", "stay_primary_landscape"), - ("stay_primary_portrait", "stay_primary_portrait"), - ("stop", "stop"), - ("stop_screen_share", "stop_screen_share"), - ("storage", "storage"), - ("store", "store"), - ("store_mall_directory", "store_mall_directory"), - ("straighten", "straighten"), - ("streetview", "streetview"), - ("strikethrough_s", "strikethrough_s"), - ("style", "style"), - ("subdirectory_arrow_left", "subdirectory_arrow_left"), - ("subdirectory_arrow_right", "subdirectory_arrow_right"), - ("subject", "subject"), - ("subscriptions", "subscriptions"), - ("subtitles", "subtitles"), - ("subway", "subway"), - ("supervisor_account", "supervisor_account"), - ("surround_sound", "surround_sound"), - ("swap_calls", "swap_calls"), - ("swap_horiz", "swap_horiz"), - ("swap_vert", "swap_vert"), - ("swap_vertical_circle", "swap_vertical_circle"), - ("switch_camera", "switch_camera"), - ("switch_video", "switch_video"), - ("sync", "sync"), - ("sync_disabled", "sync_disabled"), - ("sync_problem", "sync_problem"), - ("system_update", "system_update"), - ("system_update_alt", "system_update_alt"), - ("tab", "tab"), - ("tab_unselected", "tab_unselected"), - ("tablet", "tablet"), - ("tablet_android", "tablet_android"), - ("tablet_mac", "tablet_mac"), - ("tag_faces", "tag_faces"), - ("tap_and_play", "tap_and_play"), - ("terrain", "terrain"), - ("text_fields", "text_fields"), - ("text_format", "text_format"), - ("textsms", "textsms"), - ("texture", "texture"), - ("theaters", "theaters"), - ("thumb_down", "thumb_down"), - ("thumb_up", "thumb_up"), - ("thumbs_up_down", "thumbs_up_down"), - ("time_to_leave", "time_to_leave"), - ("timelapse", "timelapse"), - ("timeline", "timeline"), - ("timer", "timer"), - ("timer_10", "timer_10"), - ("timer_3", "timer_3"), - ("timer_off", "timer_off"), - ("title", "title"), - ("toc", "toc"), - ("today", "today"), - ("toll", "toll"), - ("tonality", "tonality"), - ("touch_app", "touch_app"), - ("toys", "toys"), - ("track_changes", "track_changes"), - ("traffic", "traffic"), - ("train", "train"), - ("tram", "tram"), - ("transfer_within_a_station", "transfer_within_a_station"), - ("transform", "transform"), - ("translate", "translate"), - ("trending_down", "trending_down"), - ("trending_flat", "trending_flat"), - ("trending_up", "trending_up"), - ("tune", "tune"), - ("turned_in", "turned_in"), - ("turned_in_not", "turned_in_not"), - ("tv", "tv"), - ("unarchive", "unarchive"), - ("undo", "undo"), - ("unfold_less", "unfold_less"), - ("unfold_more", "unfold_more"), - ("update", "update"), - ("usb", "usb"), - ("verified_user", "verified_user"), - ("vertical_align_bottom", "vertical_align_bottom"), - ("vertical_align_center", "vertical_align_center"), - ("vertical_align_top", "vertical_align_top"), - ("vibration", "vibration"), - ("video_call", "video_call"), - ("video_label", "video_label"), - ("video_library", "video_library"), - ("videocam", "videocam"), - ("videocam_off", "videocam_off"), - ("videogame_asset", "videogame_asset"), - ("view_agenda", "view_agenda"), - ("view_array", "view_array"), - ("view_carousel", "view_carousel"), - ("view_column", "view_column"), - ("view_comfy", "view_comfy"), - ("view_compact", "view_compact"), - ("view_day", "view_day"), - ("view_headline", "view_headline"), - ("view_list", "view_list"), - ("view_module", "view_module"), - ("view_quilt", "view_quilt"), - ("view_stream", "view_stream"), - ("view_week", "view_week"), - ("vignette", "vignette"), - ("visibility", "visibility"), - ("visibility_off", "visibility_off"), - ("voice_chat", "voice_chat"), - ("voicemail", "voicemail"), - ("volume_down", "volume_down"), - ("volume_mute", "volume_mute"), - ("volume_off", "volume_off"), - ("volume_up", "volume_up"), - ("vpn_key", "vpn_key"), - ("vpn_lock", "vpn_lock"), - ("wallpaper", "wallpaper"), - ("warning", "warning"), - ("watch", "watch"), - ("watch_later", "watch_later"), - ("wb_auto", "wb_auto"), - ("wb_cloudy", "wb_cloudy"), - ("wb_incandescent", "wb_incandescent"), - ("wb_iridescent", "wb_iridescent"), - ("wb_sunny", "wb_sunny"), - ("wc", "wc"), - ("web", "web"), - ("web_asset", "web_asset"), - ("weekend", "weekend"), - ("whatshot", "whatshot"), - ("widgets", "widgets"), - ("wifi", "wifi"), - ("wifi_lock", "wifi_lock"), - ("wifi_tethering", "wifi_tethering"), - ("work", "work"), - ("wrap_text", "wrap_text"), - ("youtube_searched_for", "youtube_searched_for"), - ("zoom_in", "zoom_in"), - ("zoom_out", "zoom_out"), - ("zoom_out_map", "zoom_out_map"), -] +try: + ICONS = icon_choices("mdi") +except FileNotFoundError: + # If icons aren't installed yet, set choices to empty list + ICONS = [] diff --git a/aleksis/core/util/notifications.py b/aleksis/core/util/notifications.py index 13887a197defb9e24f5a9b1538561287b80c942f..061b8d3d8fae61f68b1c3f2fa9e9f3f421491292 100644 --- a/aleksis/core/util/notifications.py +++ b/aleksis/core/util/notifications.py @@ -5,6 +5,7 @@ from typing import Sequence, Union from django.apps import apps from django.conf import settings from django.template.loader import get_template +from django.utils import timezone from django.utils.functional import lazy from django.utils.translation import gettext_lazy as _ @@ -82,6 +83,8 @@ def send_notification(notification: Union[int, "Notification"], resend: bool = F name, check, send = _CHANNELS_MAP[channel] if check(): send(notification) + notification.sent = True + notification.save() def get_notification_choices() -> list: @@ -99,3 +102,12 @@ def get_notification_choices() -> list: get_notification_choices_lazy = lazy(get_notification_choices, tuple) + + +def _send_due_notifications(): + """Send all notifications that are due to be sent.""" + Notification = apps.get_model("core", "Notification") + + due_notifications = Notification.objects.filter(sent=False, send_at__lte=timezone.now()) + for notification in due_notifications: + notification.send() diff --git a/aleksis/core/util/pdf.py b/aleksis/core/util/pdf.py index a261017b3b2bb22decea1cc517b414858b14a68c..01bf7601c92cc81425f04268a6276509ea4ab4f5 100644 --- a/aleksis/core/util/pdf.py +++ b/aleksis/core/util/pdf.py @@ -1,8 +1,9 @@ +import base64 import os import subprocess # noqa from datetime import timedelta from tempfile import TemporaryDirectory -from typing import Optional, Tuple, Union +from typing import Callable, Optional, Tuple, Union from urllib.parse import urljoin from django.conf import settings @@ -19,11 +20,35 @@ from django.utils.translation import gettext as _ from celery.result import AsyncResult from celery_progress.backend import ProgressRecorder +from selenium import webdriver from aleksis.core.celery import app from aleksis.core.models import PDFFile from aleksis.core.util.celery_progress import recorded_task, render_progress_page -from aleksis.core.util.core_helpers import process_custom_context_processors +from aleksis.core.util.core_helpers import has_person, process_custom_context_processors + + +def _generate_pdf_with_chromium(temp_dir, pdf_path, html_url, lang): + """Generate a PDF file from a HTML file.""" + chrome_options = webdriver.ChromeOptions() + chrome_options.add_argument("--kiosk-printing") + chrome_options.add_argument("--headless") + chrome_options.add_argument("--no-sandbox") + chrome_options.add_argument("--disable-gpu") + chrome_options.add_argument("--disable-dev-shm-usage") + chrome_options.add_argument("--disable-setuid-sandbox") + chrome_options.add_argument("--dbus-stub") + chrome_options.add_argument("--temp-profile") + chrome_options.add_argument(f"--lang={lang}") + + driver = webdriver.Chrome(options=chrome_options) + driver.get(html_url) + pdf = driver.execute_cdp_cmd( + "Page.printToPDF", {"printBackground": True, "preferCSSPageSize": True} + ) + driver.close() + with open(pdf_path, "wb") as f: + f.write(base64.b64decode(pdf["data"])) @recorded_task @@ -40,26 +65,7 @@ def generate_pdf( pdf_path = os.path.join(temp_dir, "print.pdf") lang = lang or get_language() - # Run PDF generation using a headless Chromium - cmd = [ - "chromium", - "--headless", - "--no-sandbox", - "--run-all-compositor-stages-before-draw", - "--temp-profile", - "--disable-dev-shm-usage", - "--disable-gpu", - "--disable-setuid-sandbox", - "--dbus-stub", - f"--home-dir={temp_dir}", - f"--lang={lang}", - f"--print-to-pdf={pdf_path}", - html_url, - ] - res = subprocess.run(cmd) # noqa - - # Let the task fail on a non-success return code - res.check_returncode() + _generate_pdf_with_chromium(temp_dir, pdf_path, html_url, lang) # Upload PDF file to media storage with open(pdf_path, "rb") as f: @@ -69,10 +75,8 @@ def generate_pdf( recorder.set_progress(1, 1) -def generate_pdf_from_template( - template_name: str, context: Optional[dict] = None, request: Optional[HttpRequest] = None -) -> Tuple[PDFFile, AsyncResult]: - """Start a PDF generation task and return the matching file object and Celery result.""" +def process_context_for_pdf(context: Optional[dict] = None, request: Optional[HttpRequest] = None): + context = context or {} if not request: processed_context = process_custom_context_processors( settings.NON_REQUEST_CONTEXT_PROCESSORS @@ -80,11 +84,22 @@ def generate_pdf_from_template( processed_context.update(context) else: processed_context = context - html_template = render_to_string(template_name, processed_context, request) + return processed_context - file_object = PDFFile.objects.create( - html_file=ContentFile(html_template.encode(), name="source.html") - ) + +def generate_pdf_from_html( + html: str, request: Optional[HttpRequest] = None, file_object: Optional[PDFFile] = None +) -> Tuple[PDFFile, AsyncResult]: + """Start a PDF generation task and return the matching file object and Celery result.""" + html_file = ContentFile(html.encode(), name="source.html") + + # In some cases, the file object is already created (to get a redirect URL for the PDF) + if not file_object: + file_object = PDFFile.objects.create() + if request and has_person(request): + file_object.person = request.user.person + file_object.html_file = html_file + file_object.save() # As this method may be run in background and there is no request available, # we have to use a predefined URL from settings then @@ -98,6 +113,24 @@ def generate_pdf_from_template( return file_object, result +def generate_pdf_from_template( + template_name: str, + context: Optional[dict] = None, + request: Optional[HttpRequest] = None, + render_method: Optional[Callable] = None, + file_object: Optional[PDFFile] = None, +) -> Tuple[PDFFile, AsyncResult]: + """Start a PDF generation task and return the matching file object and Celery result.""" + processed_context = process_context_for_pdf(context, request) + + if render_method: + html_template = render_method(processed_context, request) + else: + html_template = render_to_string(template_name, processed_context, request) + + return generate_pdf_from_html(html_template, request, file_object=file_object) + + def render_pdf( request: Union[HttpRequest, None], template_name: str, context: dict = None ) -> HttpResponse: @@ -110,7 +143,7 @@ def render_pdf( file_object, result = generate_pdf_from_template(template_name, context, request) - redirect_url = reverse("redirect_to_pdf_file", args=[file_object.pk]) + redirect_url = f"/pdfs/{file_object.pk}" return render_progress_page( request, @@ -123,7 +156,7 @@ def render_pdf( back_url=context.get("back_url", reverse("index")), button_title=_("Download PDF"), button_url=redirect_url, - button_icon="picture_as_pdf", + button_icon="mdi-file-pdf-box", ) diff --git a/aleksis/core/util/predicates.py b/aleksis/core/util/predicates.py index bcba7e8637d81aa9c554aef65cdb431b059753a9..2eab2a48ae9d926cf877981f7b22ba9fd2dbe563 100644 --- a/aleksis/core/util/predicates.py +++ b/aleksis/core/util/predicates.py @@ -111,6 +111,12 @@ def has_person(user: User) -> bool: return has_person_helper(user) +@predicate +def is_anonymous(user: User) -> bool: + """Predicate which checks whether a user is anonymous.""" + return user.is_anonymous + + @predicate def is_current_person(user: User, obj: Model) -> bool: """Predicate which checks if the provided object is the person linked to the user object.""" @@ -154,3 +160,15 @@ def contains_site_preference_value(section: str, pref: str, value: str): def has_activated_2fa(user: User) -> bool: """Check if the user has activated two-factor authentication.""" return user_has_device(user) + + +@predicate +def is_assigned_to_current_person(user: User, obj: Model) -> bool: + """Check if the object is assigned to the current person.""" + return getattr(obj, "person", None) == user.person + + +@predicate +def is_own_celery_task(user: User, obj: Model) -> bool: + """Check if the celery task is owned by the current user.""" + return obj.user == user diff --git a/aleksis/core/util/search.py b/aleksis/core/util/search.py index 34c736f9e13b55d6ac277d41b76a374efa2b43d1..39cdf4ef35ce7b75819ae61341c7a643a84b20d5 100644 --- a/aleksis/core/util/search.py +++ b/aleksis/core/util/search.py @@ -8,7 +8,7 @@ Indexable = indexes.Indexable # noqa class SearchIndex(BaseSearchIndex): """Base class for search indexes on AlekSIS models. - It provides a default document field caleld text and exects + It provides a default document field called text and exects the related model in the model attribute. """ diff --git a/aleksis/core/util/spdx.py b/aleksis/core/util/spdx.py new file mode 100644 index 0000000000000000000000000000000000000000..76452ba4a3c5a03b2f065350b13c3adde7a90d57 --- /dev/null +++ b/aleksis/core/util/spdx.py @@ -0,0 +1,5 @@ +import json +import os + +with open(os.path.join(os.path.dirname(__file__), "licenses.json"), "r") as f: + LICENSES = json.load(f) diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 7be99d6a0e67aa552f53822f3b9fcbc4abf9e87b..ed3a355ff657b037dab9c88a32e38ac760c8c7ee 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -4,6 +4,7 @@ from urllib.parse import urlencode, urlparse, urlunparse from django.apps import apps from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.models import Group as DjangoGroup from django.contrib.auth.models import Permission, User from django.contrib.contenttypes.models import ContentType @@ -22,6 +23,7 @@ from django.http import ( ) from django.shortcuts import get_object_or_404, redirect, render from django.template import loader +from django.templatetags.static import static from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.decorators import method_decorator @@ -35,11 +37,10 @@ from django.views.generic.edit import DeleteView, FormView from django.views.generic.list import ListView import reversion -from allauth.account.utils import _has_verified_for_login, send_email_confirmation -from allauth.account.views import PasswordChangeView, SignupView +from allauth.account.utils import has_verified_email, send_email_confirmation +from allauth.account.views import PasswordChangeView, PasswordResetView, SignupView from allauth.socialaccount.adapter import get_adapter from allauth.socialaccount.models import SocialAccount -from celery_progress.views import get_progress from django_celery_results.models import TaskResult from django_filters.views import FilterView from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView @@ -50,7 +51,7 @@ from haystack.inputs import AutoQuery from haystack.query import SearchQuerySet from haystack.utils.loading import UnifiedIndex from health_check.views import MainView -from invitations.views import SendInvite, accept_invitation +from invitations.views import SendInvite from oauth2_provider.exceptions import OAuthToolkitError from oauth2_provider.models import get_application_model from oauth2_provider.views import AuthorizationView @@ -59,9 +60,10 @@ from reversion.views import RevisionMixin from rules.contrib.views import PermissionRequiredMixin, permission_required from two_factor.views.core import LoginView as AllAuthLoginView -from aleksis.core.data_checks import DataCheckRegistry, check_data +from aleksis.core.data_checks import DataCheck, check_data from .celery import app +from .decorators import pwa_cache from .filters import ( GroupFilter, GroupGlobalPermissionFilter, @@ -95,16 +97,12 @@ from .models import ( DashboardWidget, DashboardWidgetOrder, DataCheckResult, - DummyPerson, Group, GroupType, - Notification, OAuthApplication, - PDFFile, Person, PersonInvitation, SchoolTerm, - TaskUserAssignment, ) from .registries import ( group_preferences_registry, @@ -114,6 +112,7 @@ from .registries import ( from .tables import ( AdditionalFieldsTable, DashboardWidgetTable, + FullPersonsTable, GroupGlobalPermissionTable, GroupObjectPermissionTable, GroupsTable, @@ -125,7 +124,6 @@ from .tables import ( UserObjectPermissionTable, ) from .util import messages -from .util.apps import AppConfig from .util.celery_progress import render_progress_page from .util.core_helpers import ( generate_random_code, @@ -139,6 +137,16 @@ from .util.forms import PreferenceLayout from .util.pdf import render_pdf +class LogoView(View): + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + image = request.site.preferences["theme__logo"] + if image: + image = image.url + else: + image = static("img/aleksis-banner.svg") + return redirect(image) + + class RenderPDFView(TemplateView): """View to render a PDF file from a template. @@ -197,12 +205,14 @@ class ManifestView(View): return JsonResponse(manifest) +@method_decorator(pwa_cache, name="dispatch") class OfflineView(TemplateView): """Show an error page if there is no internet connection.""" template_name = "offline.html" +@pwa_cache @permission_required("core.view_dashboard_rule") def index(request: HttpRequest) -> HttpResponse: """View for dashboard.""" @@ -211,20 +221,23 @@ def index(request: HttpRequest) -> HttpResponse: if has_person(request.user): person = request.user.person widgets = person.dashboard_widgets + activities = person.activities.all().order_by("-created")[:5] + notifications = person.notifications.filter(send_at__lte=timezone.now()).order_by( + "-created" + )[:5] + unread_notifications = person.notifications.filter( + send_at__lte=timezone.now(), read=False + ).order_by("-created") + announcements = Announcement.objects.at_time().for_person(person) + activities = person.activities.all().order_by("-created")[:5] + else: - person = DummyPerson() + person = None + activities = [] + notifications = [] + unread_notifications = [] widgets = [] - - activities = person.activities.all().order_by("-created")[:5] - notifications = person.notifications.all().order_by("-created")[:5] - unread_notifications = person.notifications.all().filter(read=False).order_by("-created") - - context["activities"] = activities - context["notifications"] = notifications - context["unread_notifications"] = unread_notifications - - announcements = Announcement.objects.at_time().for_person(person) - context["announcements"] = announcements + announcements = [] if len(widgets) == 0: # Use default dashboard if there are no widgets @@ -237,33 +250,13 @@ def index(request: HttpRequest) -> HttpResponse: context["widgets"] = widgets context["media"] = media context["show_edit_dashboard_button"] = show_edit_dashboard_button + context["activities"] = activities + context["announcements"] = announcements return render(request, "core/index.html", context) -class NotificationsListView(PermissionRequiredMixin, ListView): - permission_required = "core.view_notifications_rule" - template_name = "core/notifications.html" - - def get_queryset(self) -> QuerySet: - return self.request.user.person.notifications.order_by("-created") - - def get_context_data(self, **kwargs: Any) -> dict[str, Any]: - self.get_queryset().filter(read=False).update(read=True) - return super().get_context_data(**kwargs) - - -def about(request: HttpRequest) -> HttpResponse: - """About page listing all apps.""" - context = {} - - context["app_configs"] = list( - filter(lambda a: isinstance(a, AppConfig), apps.get_app_configs()) - ) - - return render(request, "core/pages/about.html", context) - - +@method_decorator(pwa_cache, name="dispatch") class SchoolTermListView(PermissionRequiredMixin, SingleTableView): """Table of all school terms.""" @@ -297,6 +290,7 @@ class SchoolTermEditView(PermissionRequiredMixin, AdvancedEditView): success_message = _("The school term has been saved.") +@pwa_cache @permission_required("core.view_persons_rule") def persons(request: HttpRequest) -> HttpResponse: """List view listing all persons.""" @@ -317,25 +311,7 @@ def persons(request: HttpRequest) -> HttpResponse: return render(request, "core/person/list.html", context) -@permission_required( - "core.view_person_rule", fn=objectgetter_optional(Person, "request.user.person", True) -) -def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: - """Detail view for one person; defaulting to logged-in person.""" - context = {} - - person = objectgetter_optional(Person, "request.user.person", True)(request, id_) - context["person"] = person - - # Get groups where person is member of - context["groups"] = person.member_of.all() - - # Get whether the invitation feature is enabled in the preferences - context["invite_enabled"] = get_site_preferences()["auth__invite_enabled"] - - return render(request, "core/person/full.html", context) - - +@pwa_cache @permission_required("core.view_group_rule", fn=objectgetter_optional(Group, None, False)) def group(request: HttpRequest, id_: int) -> HttpResponse: """Detail view for one group.""" @@ -351,7 +327,7 @@ def group(request: HttpRequest, id_: int) -> HttpResponse: members = group.members.all() # Build table - members_table = PersonsTable(members) + members_table = FullPersonsTable(members) RequestConfig(request).configure(members_table) context["members_table"] = members_table @@ -359,7 +335,7 @@ def group(request: HttpRequest, id_: int) -> HttpResponse: owners = group.owners.all() # Build table - owners_table = PersonsTable(owners) + owners_table = FullPersonsTable(owners) RequestConfig(request).configure(owners_table) context["owners_table"] = owners_table @@ -369,6 +345,7 @@ def group(request: HttpRequest, id_: int) -> HttpResponse: return render(request, "core/group/full.html", context) +@pwa_cache @permission_required("core.view_groups_rule") def groups(request: HttpRequest) -> HttpResponse: """List view for listing all groups.""" @@ -502,13 +479,7 @@ def edit_group(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: return render(request, "core/group/edit.html", context) -@permission_required("core.manage_data_rule") -def data_management(request: HttpRequest) -> HttpResponse: - """View with special menu for data management.""" - context = {} - return render(request, "core/management/data_management.html", context) - - +@method_decorator(pwa_cache, name="dispatch") class SystemStatus(PermissionRequiredMixin, MainView): """View giving information about the system status.""" @@ -541,20 +512,12 @@ class TestPDFGenerationView(PermissionRequiredMixin, RenderPDFView): permission_required = "core.test_pdf_rule" -@permission_required( - "core.mark_notification_as_read_rule", fn=objectgetter_optional(Notification, None, False) -) -def notification_mark_read(request: HttpRequest, id_: int) -> HttpResponse: - """Mark a notification read.""" - notification = objectgetter_optional(Notification, None, False)(request, id_) - - notification.read = True - notification.save() - - # Redirect to dashboard as this is only used from there if JavaScript is unavailable - return redirect("index") +def vue_dummy(request: HttpRequest) -> HttpResponse: + # FIXME remove together with URL route and template + return render(request, "core/vue_dummy.html", {}) +@pwa_cache @permission_required("core.view_announcements_rule") def announcements(request: HttpRequest) -> HttpResponse: """List view of announcements.""" @@ -626,6 +589,7 @@ def searchbar_snippets(request: HttpRequest) -> HttpResponse: return render(request, "search/searchbar_snippets.html", context) +@method_decorator(pwa_cache, name="dispatch") class PermissionSearchView(PermissionRequiredMixin, SearchView): """Wrapper to apply permission to haystack's search view.""" @@ -763,7 +727,7 @@ def edit_additional_field(request: HttpRequest, id_: Optional[int] = None) -> Ht if edit_additional_field_form.is_valid(): edit_additional_field_form.save(commit=True) - messages.success(request, _("The additional_field has been saved.")) + messages.success(request, _("The additional field has been saved.")) return redirect("additional_fields") @@ -772,6 +736,7 @@ def edit_additional_field(request: HttpRequest, id_: Optional[int] = None) -> Ht return render(request, "core/additional_field/edit.html", context) +@pwa_cache @permission_required("core.view_additionalfields_rule") def additional_fields(request: HttpRequest) -> HttpResponse: """List view for listing all additional fields.""" @@ -831,6 +796,7 @@ def edit_group_type(request: HttpRequest, id_: Optional[int] = None) -> HttpResp return render(request, "core/group_type/edit.html", context) +@pwa_cache @permission_required("core.view_grouptypes_rule") def group_types(request: HttpRequest) -> HttpResponse: """List view for listing all group types.""" @@ -857,6 +823,7 @@ def delete_group_type(request: HttpRequest, id_: int) -> HttpResponse: return redirect("group_types") +@method_decorator(pwa_cache, name="dispatch") class DataCheckView(PermissionRequiredMixin, ListView): permission_required = "core.view_datacheckresults_rule" model = DataCheckResult @@ -867,15 +834,16 @@ class DataCheckView(PermissionRequiredMixin, ListView): return ( DataCheckResult.objects.filter(content_type__app_label__in=apps.app_configs.keys()) .filter(solved=False) - .order_by("check") + .order_by("data_check") ) def get_context_data(self, **kwargs: Any) -> dict[str, Any]: context = super().get_context_data(**kwargs) - context["registered_checks"] = DataCheckRegistry.data_checks + context["registered_checks"] = DataCheck.registered_objects_list return context +@method_decorator(pwa_cache, name="dispatch") class RunDataChecks(PermissionRequiredMixin, View): permission_required = "core.run_data_checks_rule" @@ -889,10 +857,11 @@ class RunDataChecks(PermissionRequiredMixin, View): progress_title=_("Run data checks …"), success_message=_("The data checks were run successfully."), error_message=_("There was a problem while running data checks."), - back_url=reverse("check_data"), + back_url="/data_checks/", ) +@method_decorator(pwa_cache, name="dispatch") class SolveDataCheckView(PermissionRequiredMixin, RevisionMixin, DetailView): queryset = DataCheckResult.objects.all() permission_required = "core.solve_data_problem_rule" @@ -917,6 +886,7 @@ class SolveDataCheckView(PermissionRequiredMixin, RevisionMixin, DetailView): raise Http404(_("The requested solve option does not exist")) +@method_decorator(pwa_cache, name="dispatch") class DashboardWidgetListView(PermissionRequiredMixin, SingleTableView): """Table of all dashboard widgets.""" @@ -929,7 +899,7 @@ class DashboardWidgetListView(PermissionRequiredMixin, SingleTableView): context = super().get_context_data(**kwargs) context["widget_types"] = [ (ContentType.objects.get_for_model(m, False), m) - for m in DashboardWidget.__subclasses__() + for m in DashboardWidget.registered_objects_list ] return context @@ -1001,7 +971,7 @@ class EditDashboardView(PermissionRequiredMixin, View): if ( self.default_dashboard and not request.user.has_perm("core.edit_default_dashboard_rule") - or getattr(person, "is_dummy", False) + or getattr(request.user.person, "is_dummy", False) ): raise PermissionDenied() @@ -1073,7 +1043,7 @@ class InvitePerson(PermissionRequiredMixin, SingleTableView, SendInvite): """View to invite a person to register an account.""" template_name = "invitations/forms/_invite.html" - permission_required = "core.can_invite" + permission_required = "core.invite_rule" model = PersonInvitation table_class = InvitationsTable context = {} @@ -1105,12 +1075,7 @@ class EnterInvitationCode(FormView): and not PersonInvitation.objects.get(key=code).accepted and not PersonInvitation.objects.get(key=code).key_expired() ): - invitation = PersonInvitation.objects.get(key=code) - # Mark invitation as accepted and redirect to signup - accept_invitation( - invitation=invitation, request=self.request, signal_sender=self.request.user - ) - self.request.session["invitation_code_entered"] = True + self.request.session["invitation_code"] = code return redirect("account_signup") return redirect("invitations:accept-invite", code) @@ -1141,11 +1106,12 @@ class GenerateInvitationCode(View): return redirect("invite_person") +@method_decorator(pwa_cache, name="dispatch") class PermissionsListBaseView(PermissionRequiredMixin, SingleTableMixin, FilterView): """Base view for list of all permissions.""" template_name = "core/perms/list.html" - permission_required = "core.manage_permissions" + permission_required = "core.manage_permissions_rule" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -1155,6 +1121,7 @@ class PermissionsListBaseView(PermissionRequiredMixin, SingleTableMixin, FilterV return context +@method_decorator(pwa_cache, name="dispatch") class UserGlobalPermissionsListBaseView(PermissionsListBaseView): """List all global user permissions.""" @@ -1163,6 +1130,7 @@ class UserGlobalPermissionsListBaseView(PermissionsListBaseView): tab = "user_global" +@method_decorator(pwa_cache, name="dispatch") class GroupGlobalPermissionsListBaseView(PermissionsListBaseView): """List all global group permissions.""" @@ -1171,6 +1139,7 @@ class GroupGlobalPermissionsListBaseView(PermissionsListBaseView): tab = "group_global" +@method_decorator(pwa_cache, name="dispatch") class UserObjectPermissionsListBaseView(PermissionsListBaseView): """List all object user permissions.""" @@ -1179,6 +1148,7 @@ class UserObjectPermissionsListBaseView(PermissionsListBaseView): tab = "user_object" +@method_decorator(pwa_cache, name="dispatch") class GroupObjectPermissionsListBaseView(PermissionsListBaseView): """List all object group permissions.""" @@ -1187,10 +1157,11 @@ class GroupObjectPermissionsListBaseView(PermissionsListBaseView): tab = "group_object" +@method_decorator(pwa_cache, name="dispatch") class SelectPermissionForAssignView(PermissionRequiredMixin, FormView): """View for selecting a permission to assign.""" - permission_required = "core.manage_permissions" + permission_required = "core.manage_permissions_rule" form_class = SelectPermissionForm def form_valid(self, form: SelectPermissionForm) -> HttpResponse: @@ -1271,6 +1242,7 @@ class GroupObjectPermissionDeleteView(PermissionRequiredMixin, AdvancedDeleteVie template_name = "core/pages/delete.html" +@method_decorator(pwa_cache, name="dispatch") class OAuth2ListView(PermissionRequiredMixin, ListView): """List view for all the applications.""" @@ -1282,6 +1254,7 @@ class OAuth2ListView(PermissionRequiredMixin, ListView): return OAuthApplication.objects.all() +@method_decorator(pwa_cache, name="dispatch") class OAuth2DetailView(PermissionRequiredMixin, DetailView): """Detail view for an application instance.""" @@ -1326,39 +1299,28 @@ class OAuth2RegisterView(PermissionRequiredMixin, AdvancedCreateView): form_class = OAuthApplicationForm -class RedirectToPDFFile(SingleObjectMixin, View): - """Redirect to a generated PDF file.""" - - model = PDFFile - - def get(self, *args, **kwargs): - file_object = self.get_object() - if not file_object.file: - raise Http404(_("The requested PDF file does not exist")) - return redirect(file_object.file.url) +class CustomPasswordChangeView(LoginRequiredMixin, PermissionRequiredMixin, PasswordChangeView): + """Custom password change view to allow to disable changing of password.""" + permission_required = "core.change_password_rule" -class CeleryProgressView(View): - """Wrap celery-progress view to check permissions before.""" + def __init__(self, *args, **kwargs): + if get_site_preferences()["auth__allow_password_change"]: + self.template_name = "account/password_change.html" + else: + self.template_name = "account/password_change_disabled.html" - def get(self, request: HttpRequest, task_id: str, *args, **kwargs) -> HttpResponse: - if request.user.is_anonymous: - raise Http404(_("The requested task does not exist or is not accessible")) - if not TaskUserAssignment.objects.filter( - task_result__task_id=task_id, user=request.user - ).exists(): - raise Http404(_("The requested task does not exist or is not accessible")) - return get_progress(request, task_id, *args, **kwargs) + super().__init__(*args, **kwargs) -class CustomPasswordChangeView(PermissionRequiredMixin, PasswordChangeView): - """Custom password change view to allow to disable changing of password.""" +class CustomPasswordResetView(PermissionRequiredMixin, PasswordResetView): + """Custom password reset view to allow to disable resetting of password.""" - permission_required = "core.can_change_password" + permission_required = "core.reset_password_rule" def __init__(self, *args, **kwargs): - if get_site_preferences()["auth__allow_password_change"]: - self.template_name = "account/password_change.html" + if get_site_preferences()["auth__allow_password_reset"]: + self.template_name = "account/password_reset.html" else: self.template_name = "account/password_change_disabled.html" @@ -1374,9 +1336,8 @@ class SocialAccountDeleteView(DeleteView): def get_queryset(self): return SocialAccount.objects.filter(user=self.request.user) - def delete(self, request, *args, **kwargs): + def form_valid(self, form): self.object = self.get_object() - success_url = self.get_success_url() try: get_adapter(self.request).validate_disconnect( self.object, SocialAccount.objects.filter(user=self.request.user) @@ -1394,7 +1355,7 @@ class SocialAccountDeleteView(DeleteView): messages.success( self.request, _("The third-party account has been successfully disconnected.") ) - return HttpResponseRedirect(success_url) + return super().form_valid() def server_error( @@ -1419,9 +1380,9 @@ class AccountRegisterView(SignupView): def dispatch(self, request, *args, **kwargs): if ( - not request.user.has_perm("core.can_register") + not request.user.has_perm("core.signup_rule") and not request.session.get("account_verified_email") - and not request.session.get("invitation_code_entered") + and not request.session.get("invitation_code") ): raise PermissionDenied() return super(AccountRegisterView, self).dispatch(request, *args, **kwargs) @@ -1431,13 +1392,18 @@ class AccountRegisterView(SignupView): kwargs["request"] = self.request return kwargs + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["login_url"] = reverse(settings.LOGIN_URL) + return context + class InvitePersonByID(PermissionRequiredMixin, SingleObjectMixin, View): """Custom view to invite person by their ID.""" model = Person success_url = reverse_lazy("persons") - permission_required = "core.can_invite" + permission_required = "core.invite_rule" def dispatch(self, request, *args, **kwargs): if not get_site_preferences()["auth__invite_enabled"]: @@ -1502,7 +1468,7 @@ class LoginView(AllAuthLoginView): def done(self, form_list, **kwargs): if settings.ACCOUNT_EMAIL_VERIFICATION == "mandatory": user = self.get_user() - if not _has_verified_for_login(user, user.email): + if not has_verified_email(user, user.email): send_email_confirmation(self.request, user, signup=False, email=user.email) return render(self.request, "account/verification_sent.html") diff --git a/aleksis/core/vite.config.js b/aleksis/core/vite.config.js new file mode 100644 index 0000000000000000000000000000000000000000..bf029ce617723720448c6376688bcf392a4eebab --- /dev/null +++ b/aleksis/core/vite.config.js @@ -0,0 +1,307 @@ +// Configuration for Vite bundling +// +// This config is somewhat elaborate, because it needs to dynamically address +// the several environments where it is used. The AlekSIS frontend bundle is +// always created as a custom asset for a given Django deployment, in order +// to allow for dynamic addition of frontend code from AlekSIS apps. +// +// It is therefore also placed inside the Python package structure, so it +// will be installed into the target system/image by poetry. +// +// Hence, the main scenarios are: +// +// * called directly from the source tree of AlekSIS-Core, with +// cache dir (and thus node_module) in ./cache +// * called from basically anywhere, with the cace dir also anywhere +// +// Vite must always be called through the `aleksis-admin vite` wrapper, which +// generates a JSON file with some hints in the cache directory, so we can +// make Vite find all the puzzle pieces. + +const fs = require("fs"); +const path = require("path"); +const crypto = require("crypto"); +const process = require("process"); + +import { defineConfig, searchForWorkspaceRoot } from "vite"; +import vue from "@vitejs/plugin-vue2"; +import { nodeResolve } from "@rollup/plugin-node-resolve"; +import graphql from "@rollup/plugin-graphql"; +import virtual from "@rollup/plugin-virtual"; +import { VitePWA } from "vite-plugin-pwa"; +import topLevelAwait from "vite-plugin-top-level-await"; +import browserslistToEsbuild from "browserslist-to-esbuild"; +const license = require("rollup-plugin-license"); + +// Read the hints writen by `aleksis-admin vite` +const django_values = JSON.parse(fs.readFileSync("./django-vite-values.json")); + +// Browsers supported by us +const browsersList = [ + "defaults and supports es6-module", + ">0.2% in de and supports es6-module", +]; + +/** + * Generate code to import messages from a single AlekSIS app. + */ +function generateMessageImportCode(assetDir, name, importAppName) { + let code = ""; + let messagesPath = assetDir + "/messages/"; + code += `appMessages["${name}"] = {};`; + const files = fs.readdirSync(messagesPath); + for (file of files) { + let lang = file.split(".")[0]; + code += `import ${importAppName}Messages_${lang} from '${ + messagesPath + file + }';\n`; + code += `appMessages["${name}"]["${lang}"] = ${importAppName}Messages_${lang};\n`; + } + return code; +} + +/** + * Generate a virtual module that helps the AlekSIS-Core frontend code import other apps. + * + * App code locations are discovered by the `aleksis-admin` vite wrapper and passed + * in the django_values hints. + */ +function generateAppImporter(appDetails) { + let code = "let appObjects = {};\n"; + code += "let appMessages = {};\n"; + + for (const [appPackage, appMeta] of Object.entries(appDetails)) { + let indexPath = appMeta.assetDir + "/index.js"; + let importAppName = + appMeta.name.charAt(0).toUpperCase() + appMeta.name.substring(1); + + code += `console.debug("Importing AlekSIS app entrypoint for ${appPackage}");\n`; + code += `import ${importAppName} from '${indexPath}';\n`; + code += `appObjects["${appMeta.name}"] = ${importAppName};\n`; + + if (appMeta.hasMessages) { + code += generateMessageImportCode( + appMeta.assetDir, + appMeta.name, + importAppName + ); + } + } + + // Include core messages + code += generateMessageImportCode(django_values.coreAssetDir, "core", "Core"); + + code += "export default appObjects;\n"; + code += "export { appObjects, appMessages };\n"; + + return code; +} + +export default defineConfig({ + // root must always be the base directory of the AlekSIS-Core source tree + // Changing this will mangle the manifest key of the entrypoint! + root: django_values.baseDir, + // Base URL needs to mimic the /static/ URL in Django + base: django_values.static_url, + build: { + outDir: path.resolve("./vite_bundles/"), + manifest: true, + target: browserslistToEsbuild(browsersList), + rollupOptions: { + input: django_values.coreAssetDir + "/index.js", + output: { + manualChunks(id) { + // Split big libraries into own chunks + if (id.includes("node_modules/vue")) { + return "vue"; + } else if (id.includes("node_modules/apollo")) { + return "apollo"; + } else if (id.includes("node_modules/graphql")) { + return "graphql"; + } else if (id.includes("node_modules/@sentry")) { + return "sentry"; + } else if (id.includes("node_modules")) { + // Fallback for all other libraries + return "vendor"; + } + + // Split each AlekSIS app in its own chunk + for (const [appPackage, ad] of Object.entries( + django_values.appDetails + )) { + if (id.includes(ad.assetDir + "/index.js")) { + return appPackage; + } + } + }, + }, + }, + }, + server: { + strictPort: true, + port: django_values.serverPort, + origin: `http://localhost:${django_values.serverPort}`, + watch: { + ignored: [ + "**/*.py", + "**/__pycache__/**", + "**/*.mo", + "**/.venv/**", + "**/.tox/**", + "**/static/**", + "**/assets/**", + ], + }, + fs: { + allow: [ + searchForWorkspaceRoot(path.resolve(django_values.baseDir)), + ...Object.values(django_values.appDetails).map( + (details) => details.assetDir + ), + ], + }, + }, + plugins: [ + virtual({ + // Will be used in AlekSIS-Core frontend code to import aps + aleksisAppImporter: generateAppImporter(django_values.appDetails), + }), + vue(), + nodeResolve({ modulePaths: [path.resolve(django_values.node_modules)] }), + graphql(), + topLevelAwait(), + license({ + // A package.json will be written here by `aleksis-admin vite` + cwd: path.resolve(django_values.cacheDir), + banner: { + commentStyle: "ignored", + content: `Frontend bundle for AlekSIS\nSee ./vendor.LICENSE.txt for copyright information.`, + }, + thirdParty: { + allow: { + test: "MIT OR Apache-2.0 OR 0BSD OR BSD-3-Clause", + failOnUnlicensed: true, + failOnViolation: true, + }, + output: { + file: path.resolve( + django_values.cacheDir + "/vite_bundles/assets/vendor.LICENSE.txt" + ), + }, + }, + }), + VitePWA({ + injectRegister: "null", + devOptions: { + enabled: true, + }, + scope: "/", + base: "/", + workbox: { + navigateFallback: "/", + directoryIndex: null, + navigateFallbackAllowlist: [ + new RegExp("^/(?!(django|admin|graphql|__icons__))[^.]*$"), + ], + additionalManifestEntries: [ + { url: "/", revision: crypto.randomUUID() }, + { url: "/django/offline/", revision: crypto.randomUUID() }, + ], + inlineWorkboxRuntime: true, + modifyURLPrefix: { + "": "/static/", + }, + globPatterns: ["**/*.{js,css,eot,woff,woff2,ttf}"], + runtimeCaching: [ + { + urlPattern: new RegExp( + "^/(?!(django|admin|graphql|__icons__))[^.]*$" + ), + handler: "CacheFirst", + }, + { + urlPattern: new RegExp("/django/.*"), + handler: "NetworkFirst", + options: { + cacheName: "aleksis-legacy-cache", + networkTimeoutSeconds: 5, + expiration: { + maxAgeSeconds: 60 * 60 * 24, + }, + precacheFallback: { + fallbackURL: "/django/offline/", + }, + cacheableResponse: { + headers: { + "PWA-Is-Cacheable": "true", + }, + }, + }, + }, + { + urlPattern: ({ request, sameOrigin }) => { + return sameOrigin && request.destination === "image"; + }, + handler: "StaleWhileRevalidate", + options: { + cacheName: "aleksis-image-cache", + expiration: { + maxAgeSeconds: 60 * 60 * 24, + }, + }, + }, + { + urlPattern: ({ request, sameOrigin }) => { + return sameOrigin && request.destination === "style"; + }, + handler: "StaleWhileRevalidate", + options: { + cacheName: "aleksis-style-cache", + expiration: { + maxAgeSeconds: 60 * 60 * 24 * 30, + }, + }, + }, + { + urlPattern: ({ request, sameOrigin }) => { + return sameOrigin && request.destination === "script"; + }, + handler: "StaleWhileRevalidate", + options: { + cacheName: "aleksis-script-cache", + expiration: { + maxAgeSeconds: 60 * 60 * 24 * 30, + }, + }, + }, + { + urlPattern: ({ request, sameOrigin }) => { + return sameOrigin && request.destination === "font"; + }, + handler: "CacheFirst", + options: { + cacheName: "aleksis-font-cache", + expiration: { + maxAgeSeconds: 60 * 60 * 24 * 90, + }, + }, + }, + ], + }, + }), + ], + resolve: { + alias: { + "@": path.resolve(django_values.node_modules), + vue: path.resolve(django_values.node_modules + "/vue/dist/vue.esm.js"), + "aleksis.core": django_values.coreAssetDir, + // Add aliases for every app using their package name + ...Object.fromEntries( + Object.entries(django_values.appDetails).map(([name, appMeta]) => [ + name, + appMeta.assetDir, + ]) + ), + }, + }, +}); diff --git a/docs/_static/pwa_desktop_chromium.png b/docs/_static/pwa_desktop_chromium.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f2bb10a380a6147f1a1f516dc6aaf07cb7b545 Binary files /dev/null and b/docs/_static/pwa_desktop_chromium.png differ diff --git a/docs/_static/pwa_mobile_chromium.png b/docs/_static/pwa_mobile_chromium.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea9f86d0f13f1e88f030453a16141bb2aba7f60 Binary files /dev/null and b/docs/_static/pwa_mobile_chromium.png differ diff --git a/docs/_static/pwa_mobile_firefox.png b/docs/_static/pwa_mobile_firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..482614a3698797115693bf0d9736113bbad9929b Binary files /dev/null and b/docs/_static/pwa_mobile_firefox.png differ diff --git a/docs/_static/pwa_mobile_safari.png b/docs/_static/pwa_mobile_safari.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc4f21e04cecb69d70f56903275c18891aaca63 Binary files /dev/null and b/docs/_static/pwa_mobile_safari.png differ diff --git a/docs/admin/01_core_concepts.rst b/docs/admin/01_core_concepts.rst index cdd49c7183217897b09cf1fda5575307e0a5f08c..2d626927ae2845594a0a67525d213064f2581e97 100644 --- a/docs/admin/01_core_concepts.rst +++ b/docs/admin/01_core_concepts.rst @@ -1,3 +1,5 @@ +.. _core-concept: + Concepts of the AlekSIS core ============================ @@ -93,7 +95,7 @@ In contrast to persons, groups are supposed to be **linked to school terms** (but they don’t have to be). For example, the composition of a class or a course varies from school term to school term. In order to archive historical data according to local laws, these groups have to be -separeted which is solved by linking them to a school term. +separated which is solved by linking them to a school term. Manage groups ~~~~~~~~~~~~~ diff --git a/docs/admin/10_install.rst b/docs/admin/10_install.rst index c234fa5d7dfcd472c1e786a9909dca503a40e362..322d39023183a171b29f2fffc4a55988441a89c7 100644 --- a/docs/admin/10_install.rst +++ b/docs/admin/10_install.rst @@ -16,7 +16,7 @@ AlekSIS will need and use the following paths: * `/var/lib/aleksis/media` for file storage (Django media) * `/var/backups/aleksis` for backups of database and media files * `/usr/local/share/aleksis/static` for static files - * `/usr/local/share/aleksis/node_modules` for frontend dependencies + * `//var/cache/aleksis` for building frontend assets etc. You can change any of the paths as you like. @@ -34,6 +34,7 @@ For an installation on a dedicated server, the following prerequisites are neede * nginx * Python 3.9 * Some system dependencies to build Python modules and manage frontend files + * System locales for all supported languages * The aforementioned paths Install system packages @@ -52,8 +53,11 @@ Install some packages from the Debian package system. yarnpkg \ python3-virtualenv \ chromium \ + chromium-driver \ redis-server \ - postgresql + postgresql \ + locales-all \ + celery Create PostgreSQL user and database ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -73,10 +77,10 @@ Create the directories for storage .. code-block:: shell mkdir -p /etc/aleksis \ - /usr/share/aleksis/{static,node_modules} \ + /usr/share/aleksis/static \ + /var/cache/aleksis \ /var/lib/aleksis/media \ /var/backups/aleksis - chown -R www-data:www-data /var/lib/aleksis Create AlekSIS configuration file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,7 +93,7 @@ favourite text editor and adding the following configuration. static = { root = "/usr/local/share/aleksis/static", url = "/static/" } media = { root = "/var/lib/aleksis/media", url = "/media/" } - node_modules = { root = "/usr/local/share/aleksis/node_modules" } + caching = { dir = "/var/cache/aleksis" } secret_key = "SomeRandomValue" [http] @@ -109,6 +113,18 @@ favourite text editor and adding the following configuration. password = "admin" email = "root@localhost" +Make sure you specify the correct `allowed_hosts`. It is used for things like the OpenID Connect issuer and the standard mail domain. + +Generate OpenID Connect certificate +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +OpenID Connect needs a certificate, which you need to generate and assign required permissions. + +.. code-block:: shell + + openssl genrsa -out /etc/aleksis/oidc.pem + chown www-data:www-data /etc/aleksis/oidc.pem + Install AlekSIS itself ~~~~~~~~~~~~~~~~~~~~~~ @@ -117,14 +133,30 @@ They will pull the AlekSIS standard distribution from `PyPI`_ and install it to system-wide `dist-packages` of Python. Afterwards, it will download frontend dependencies from `yarnpkg`, collect static files, and migrate the database to the final schema. +`aleksis` is a meta-package which will install the :ref:`core-concept` and all official apps. If you want to install only the AlekSIS Core and your own set of apps, you can install `aleksis-core` instead of `aleksis`. + +You only need to install these additional dependencies if installing the meta-package: + .. code-block:: shell + apt install libmariadb-dev libldap2-dev libsasl2-dev + +After that, you can install the aleksis meta-package, or only `aleksis-core`: +.. code-block:: shell pip3 install aleksis - aleksis-admin yarn install + aleksis-admin vite build aleksis-admin collectstatic aleksis-admin migrate aleksis-admin createinitialrevisions +Make dynamic content writable for webserver +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To make AlekSIS® able to write dynamic content, you need to assign permissions to the webserver user. + +.. code-block:: shell + chown -R www-data:www-data /var/lib/aleksis + .. _core-configure-uwsgi: Configure uWSGI @@ -252,6 +284,5 @@ Finally, bring the stack up using: AlekSIS will be reachable on port 80 if you forgot to configure the environment. You are responsible for adding a reverse proxy like nginx providing TLS, etc. -.. _Dynaconf: https://dynaconf.readthedocs.io/en/latest/ .. _Let's Encrypt: https://certbot.eff.org/instructions .. _PyPI: https://pypi.org diff --git a/docs/admin/15_config_files.rst b/docs/admin/15_config_files.rst index adb94a8cac6375ec1b06dbb1de4b60fb0c761165..556713437cc467c38a4b3f2acf05c070b46554c6 100644 --- a/docs/admin/15_config_files.rst +++ b/docs/admin/15_config_files.rst @@ -40,7 +40,7 @@ A configuration file might look like this:: password = "SuperSecretPassword" [caching] - redis = { enabled = true, address = "127.0.0.1" } + redis = { enabled = true, address = "redis://127.0.0.1" } The `secret_key` setting above defines a single value. The following `http` section defines a table (cf. a dictionary) in one way, and you can see the diff --git a/docs/admin/21_ldap.rst b/docs/admin/21_ldap.rst index 7b123a594154950482a6cdf7ac095a3030ee5359..389b3fca9c9c0f0af8f2f54fe448d87daf7bf776 100644 --- a/docs/admin/21_ldap.rst +++ b/docs/admin/21_ldap.rst @@ -13,7 +13,7 @@ the AlekSIS system (see below). Installing packages for LDAP support ------------------------------------ -Installing the necessary librairies for LDAP support unfortunately is not +Installing the necessary libraries for LDAP support unfortunately is not very straightforward under all circumstances. On Debian, install these packages:: sudo apt install python3-ldap libldap2-dev libssl-dev libsasl2-dev python3-dev diff --git a/docs/admin/22_registration.rst b/docs/admin/22_registration.rst index 2442b5ce6c59314928fb3f6504b2db51eaa02010..84ae59f0c881772b72ca023bdb68c53c62717fca 100644 --- a/docs/admin/22_registration.rst +++ b/docs/admin/22_registration.rst @@ -4,7 +4,7 @@ Registration and user invitations In addition to central management of user accounts, AlekSIS allows self-registration by users. Registration can be either fully open, or based on personal invitations. -In a system handling ciritcal data, access control should be as tight as possible. +In a system handling critical data, access control should be as tight as possible. However, there are scenarios where central account creation is not feasible, e.g. for optional guardian accounts. In such a scenario, the invitation system allows for processes like handing out invitation codes as a letter or through e-mail @@ -26,6 +26,16 @@ signup for everyone. A menu item will be added for public registration. .. warning:: Do not enable this feature unless you intend to run a public AlekSIS instance. +Before enabling registration, you should consider restricting allowed usernames. +By default, all ASCII characters are allowed in usernames. Often, it is advisable +to not allow special characters. This often depends on the systems that will be +linked to AlekSIS. + +To restrict usernames to a certain format, a regular expression can be defined +in the ``Regular expression for allowed usernames`` preference. For example, to +restrict the username to lower case letters and numbers, and beginning with a number, +the regex can be set to ``^[a-z][a-z0-9]+$`. + User invitations ~~~~~~~~~~~~~~~~ diff --git a/docs/admin/31_monitoring.rst b/docs/admin/31_monitoring.rst index 1847297352a135aafdff954d98eb2a2cc1a69573..0d079bf4b615e2c4bebb0af1dca6f736d4fce49f 100644 --- a/docs/admin/31_monitoring.rst +++ b/docs/admin/31_monitoring.rst @@ -58,7 +58,7 @@ Monitoring with Icinga2 As already mentioned, there is a JSON endpoint at https://aleksis.example.com/health/. You can use an json check plugin to -check seperate health checks or just use a HTTP check to check if the +check separate health checks or just use a HTTP check to check if the site returns HTTP 200. Performance monitoring with Prometheus diff --git a/docs/admin/32_tasks.rst b/docs/admin/32_tasks.rst index f8e2dcaf2597487a853568fb6517d35d5d0093ae..4b7fd22353deebdf51b9ebec74fda531bc465633 100644 --- a/docs/admin/32_tasks.rst +++ b/docs/admin/32_tasks.rst @@ -24,3 +24,5 @@ is currently only possible through the Django Admin backend, under Under the *Periodic Tasks* app, you can define schedules and tasks. The names of tasks you can add manually are documented in the respective sections of the manual. + +.. _Celery: https://celeryproject.org/ diff --git a/docs/admin/50_dashboard.rst b/docs/admin/50_dashboard.rst index 0c7f6a3b5a5ebda81f417b1a86a1135540a580ba..bf2c72d8d4ed0d76832635bc727612ac982e182f 100644 --- a/docs/admin/50_dashboard.rst +++ b/docs/admin/50_dashboard.rst @@ -18,6 +18,14 @@ optionally with an icon or picture next to it. It therefore provides the followi As link title, the widget title will be used. +Static content widget +^^^^^^^^^^^^^^^^^^^^ + +The static content widget allows to display custom static information on the dashboard, +It therefore provides the following additional attribute: + +* **Content**: The content of the widget. HTML can be used for formatting. + More dashboard widgets from apps -------------------------------- diff --git a/docs/conf.py b/docs/conf.py index 2acaa4acf472ffb6ea2a1124d9371644186cc5c6..dab0f125dc0ba33126d36fc975a5c5bd4f0b91f8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,9 +29,9 @@ copyright = "2019-2022 The AlekSIS team" author = "The AlekSIS Team" # The short X.Y version -version = "2.7" +version = "3.0" # The full version, including alpha/beta/rc tags -release = "2.7.5.dev0" +release = "3.0.dev3" # -- General configuration --------------------------------------------------- diff --git a/docs/dev/01_setup.rst b/docs/dev/01_setup.rst index e52941af0c77b266ffd74bf410cccb0ef04b2678..1b82cf5e35c78585ee01b101120ceaff8fa19305 100644 --- a/docs/dev/01_setup.rst +++ b/docs/dev/01_setup.rst @@ -2,7 +2,7 @@ Setting up the development environment ====================================== AlekSIS and all official apps use `Poetry`_ to manage virtualenvs and -dependencies. You should make yourself a bit confortable with poetry +dependencies. You should make yourself a bit comfortable with poetry by reading its documentation. Poetry makes a lot of stuff very easy, especially managing a virtual @@ -47,7 +47,7 @@ Install native dependencies Some system libraries are required to install AlekSIS. On Debian, for example, this would be done with:: - sudo apt install build-essential libpq-dev libpq5 libssl-dev python3-dev python3-pip python3-venv yarnpkg gettext chromium + sudo apt install build-essential libpq-dev libpq5 libssl-dev python3-dev python3-pip python3-venv yarnpkg gettext chromium chromium-driver Get Poetry ---------- diff --git a/docs/dev/02_install_apps.rst b/docs/dev/02_install_apps.rst index 335f92f56735e0f1eb02eecdde626d5a074674ff..a376dd4f413380750c8b466c73fdd07973ac36f6 100644 --- a/docs/dev/02_install_apps.rst +++ b/docs/dev/02_install_apps.rst @@ -13,7 +13,7 @@ Installing a development environment for own apps ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you are developing your own app, you probably do not want to -ru na development environment from the `AlekSIS-Core` repository. +run a development environment from the `AlekSIS-Core` repository. Instead, simply install the environment using ``poetry install`` from your app repository – it will pull in `AlekSIS-Core` as a dependency diff --git a/docs/dev/03_run_tests.rst b/docs/dev/03_run_tests.rst index c50eda52d1c04d183c518a938a6f6a7a1c579ab3..9d38bdf6382d250ce6d1d05dfae37e699c268afa 100644 --- a/docs/dev/03_run_tests.rst +++ b/docs/dev/03_run_tests.rst @@ -29,7 +29,7 @@ setting certain environment variables: Selenium tests are enabled if `TEST_SELENIUM_BROWSERS` is non-empty. -To set variables, use env to wrap the tox ommand:: +To set variables, use env to wrap the tox command:: TEST_SELENIUM_BROWSERS=chrome,firefox tox @@ -69,5 +69,5 @@ look like they should or for documentation purposes. To enable screenshots, add the `TEST_SCREENSHOT_PATH` environment variable when running the tests. -If runnin multiple browsers, screenshots are placed in separate directories +If running multiple browsers, screenshots are placed in separate directories per browser. diff --git a/docs/dev/04_materialize_templates.rst b/docs/dev/04_materialize_templates.rst index b997c32f293e6268a2deae5b69001abaf9a84e10..b49677252af51905bf46084f42eb6a5811f173d7 100644 --- a/docs/dev/04_materialize_templates.rst +++ b/docs/dev/04_materialize_templates.rst @@ -56,13 +56,13 @@ Furthermore, you can use tabs with integrated icons that are higher, but more co <ul class="tabs tabs-transparent tabs-icons tabs-fixed-width"> <li class="tab"> <a href="#test1"> - <i class="material-icons">speaker_notes</i> + <i class="material-icons iconify" data-icon="mdi:speaker_notes"></i> Test 1 </a> </li> <li class="tab"> <a href="#test2"> - <i class="material-icons">people</i> + <i class="material-icons iconify" data-icon="mdi:people"></i> Test 2 </a> </li> diff --git a/docs/dev/06_merging_app_settings.rst b/docs/dev/06_merging_app_settings.rst index ad30c595f3dc8ef7bc39ab1b3a06b4785cc7276a..3c0c1affd210c706ac2959d02324f6ad9e009a2b 100644 --- a/docs/dev/06_merging_app_settings.rst +++ b/docs/dev/06_merging_app_settings.rst @@ -3,9 +3,15 @@ Merging of app settings AlekSIS provides features to merge app settings into main ``settings.py``. +Third-party apps can only add values to some select existing settings. +Official apps (those under the ``aleksis.apps.`` namespace) can mark any +setting for overriding. + Currently mergable settings --------------------------- +The following settings can be amended by any app: + * INSTALLED_APPS * DATABASES * YARN_INSTALLED_APPS @@ -23,3 +29,14 @@ the following into your ``settings.py``:: "HOST": "127.0.0.1", "PORT": 5432, } + } + +Overriding any setting +---------------------- + +Official apps only (currently) can override any setting, but need to explicitly +mark it by listing it in a list called ``overrides`` in their ``settings.py``:: + + PAYMENT_MODEL = "tezor.Invoice" + + overrides = ["PAYMENT_MODEL"] diff --git a/docs/user/01_registration.rst b/docs/user/01_registration.rst index 3beb4fb51621af47b97a51a1cb6719773249ecf7..19d0b7a893c00f12b0c92fc5f71b0209edbaab8d 100644 --- a/docs/user/01_registration.rst +++ b/docs/user/01_registration.rst @@ -15,7 +15,7 @@ AlekSIS account. :alt: Signup formular If enabled, you have to verify your email address after signup. To do so, click -on the link you recieved on the email address you entered in the signup form. +on the link you received on the email address you entered in the signup form. .. note:: Normally, AlekSIS does not allow public registratio, and all accounts are @@ -32,5 +32,5 @@ enter it. You will be redirected to the signup form. :width: 100% :alt: Accept invitation -If you've recieved an invitation link (e.g. via email), clicking the link +If you've received an invitation link (e.g. via email), clicking the link will redirect you to the signup form automatically. diff --git a/docs/user/02_personal_account.rst b/docs/user/02_personal_account.rst index a506b9e759ddf0b9f0e8235db784c51c150317c8..b1b0a596890a75ba4cdce866d9be5d2d4829d518 100644 --- a/docs/user/02_personal_account.rst +++ b/docs/user/02_personal_account.rst @@ -84,12 +84,12 @@ Microsoft account), you can manage the connections to these accounts on the page ``Account → Third-party accounts``. The feature to use third-party accounts needs to be enabled by -an administrator, as described in :doc:`../admin/04_socialaccounts`. +an administrator, as described in :doc:`../admin/23_socialaccounts`. Authorized applications ----------------------- On the page ``Account → Authorized applications`` you can see all -external applications you authorized to retreive data about you from +external applications you authorized to retrieve data about you from AlekSIS. That can be services provided by your local institution like a chat platform, for example. diff --git a/docs/user/20_pwa.rst b/docs/user/20_pwa.rst index 461bd113c14747843ac22f66a77bb22bde96d6d3..321ec4b7acd457ae015955cef7473bb37d18b0a0 100644 --- a/docs/user/20_pwa.rst +++ b/docs/user/20_pwa.rst @@ -6,7 +6,7 @@ What is a progressive web application? A PWA is an application developed with common web technologies and delivered in form of a website, but which offers some features a -traditional website does not and ,overall, creates an impression that +traditional website does not and overall creates an impression that resembles that of a native application. AlekSIS PWA features @@ -30,19 +30,39 @@ platform to platform. On some, you are prompted to add AlekSIS to your home screen of desktop using a popup; on others, you have to take action yourself and find the corresponding menu entry. As of the time of writing, “installable†PWAs are supported by all major platforms except -Firefox Desktop which nevertheless supports the other features. - -- Chromium-based browsers (e.g. Chromium, Google Chrome, Microsoft - Edge) will usually prompt you to install the PWA by a popup on both - mobile and desktop devices; for the former using a banner and for the - latter using an appearing button in the adress bar. In both cases, a - click on the notification is enough to start the installation - process. -- Firefox Mobile will also probably prompt you using a dot near the - menu button; then “install†has to been clicked. -- On Safari you need to open the share popup and click on the “Add to - Home Screen†button. - -Independent of the used platform, AlekSIS can be accessed as an +Firefox Desktop and Safari Desktop which nevertheless support the other features. + +Chromium-based browsers (e.g. Chromium, Google Chrome, Microsoft +Edge) will usually prompt you to install the PWA by a popup on both +mobile and desktop devices; for the former using a banner + +.. image:: ../_static/pwa_mobile_chromium.png + :width: 40% + :alt: PWA installation prompt on the mobile version of the Chromium browser + +and for the latter using an appearing button in the address bar. + +.. image:: ../_static/pwa_desktop_chromium.png + :width: 100% + :alt: PWA installation prompt on the desktop version of the Chromium browser + +In both cases, a click on the notification is enough to start +the installation process. + +Firefox Mobile will also prompt you using a dot near the +menu button; then ``Install`` has to be clicked. + +.. image:: ../_static/pwa_mobile_firefox.png + :width: 40% + :alt: PWA installation prompt on the mobile version of the Firefox browser + +On Safari Mobile, you need to open the share popup and click on the +``Add to Home Screen`` button. + +.. image:: ../_static/pwa_mobile_safari.png + :width: 40% + :alt: PWA installation prompt on the mobile version of the Safari browser + +No matter what platform is used, AlekSIS can be accessed as an independent application entry, just like any other installed native application, after installation. diff --git a/pyproject.toml b/pyproject.toml index 12199f73cd28724dffa7087dcb6628ea68943fe1..eef210ff2c03c5d4d4d2467359885861ac2a6309 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-Core" -version = "2.7.5.dev0" +version = "3.0.dev3" packages = [ { include = "aleksis" } ] @@ -25,7 +25,8 @@ authors = [ "Hangzhi Yu <yuha@katharineum.de>", "Lloyd Meins <meinsll@katharineum.de>", "magicfelix <felix@felix-zauberer.de>", - "Benedict Suska <benedict.suska@teckids.de>" + "Benedict Suska <benedict.suska@teckids.de>", + "Lukas Weichelt <lukas.weichelt@teckids.de>" ] maintainers = [ "Jonathan Weth <dev@jonathanweth.de>", @@ -39,7 +40,7 @@ keywords = ["SIS", "education", "school", "digitisation", "school apps"] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", - "Framework :: Django :: 3.0", + "Framework :: Django :: 4.0", "Intended Audience :: Developers", "Intended Audience :: Education", "Topic :: Education", @@ -55,23 +56,21 @@ secondary = true [tool.poetry.dependencies] python = "^3.9" -Django = "^3.2.5" +Django = "^4.1" django-any-js = "^1.1" -django-debug-toolbar = "^3.2" -django-menu-generator-ng = "^1.2.3" django-tables2 = "^2.1" -django-phonenumber-field = {version = "^5.2", extras = ["phonenumbers"]} -django-sass-processor = "1.0" -libsass = "^0.21.0" +django-phonenumber-field = {version = "^6.1", extras = ["phonenumbers"]} +django-sass-processor = "1.2.2" +libsass = "^0.22.0" colour = "^0.1.5" dynaconf = {version = "^3.1", extras = ["yaml", "toml", "ini"]} django-auth-ldap = { version = "^4.0", optional = true } -django-maintenance-mode = "^0.16.0" +django-maintenance-mode = "^0.18.0" django-ipware = "^4.0" django-impersonate = "^1.4" psycopg2 = "^2.8" -django_select2 = "^7.1" -django-two-factor-auth = { version = "^1.12.1", extras = [ "yubikey", "phonenumbers", "call", "sms" ] } +django_select2 = "^8.0" +django-two-factor-auth = { version = "^1.14.0", extras = [ "yubikey", "phonenumbers", "call", "sms" ] } django-yarnpkg = "^6.0" django-material = "^1.6.0" django-dynamic-preferences = "^1.11" @@ -80,7 +79,6 @@ django-filter = "^2.2.0" django-templated-email = "^3.0.0" html2text = "^2020.0.0" django-ckeditor = "^6.0.0" -django-js-reverse = "^0.9.1" calendarweek = "^0.5.0" Celery = {version="^5.2", extras=["django", "redis"]} django-celery-results = "^2.0.1" @@ -88,17 +86,16 @@ django-celery-beat = "^2.2.0" django-celery-email = "^3.0.0" django-jsonstore = "^0.5.0" django-polymorphic = "^3.0.0" -django-colorfield = "^0.6.0" -django-bleach = "^1.0.0" +django-colorfield = "^0.8.0" +django-bleach = "^3.0.0" django-guardian = "^2.2.0" rules = "^3.0" django-cache-memoize = "^0.1.6" django-haystack = "^3.1" celery-haystack-ng = "^2.0" -django-dbbackup = "^3.3.0" -spdx-license-list = "^0.5.0" -license-expression = "^21.6" -django-reversion = "^4.0.0" +django-dbbackup = "^4.0.0" +license-expression = "^30.0" +django-reversion = "^5.0.0" django-favicon-plus-reloaded = "^1.1.5" django-health-check = "^3.12.1" psutil = "^5.7.0" @@ -107,14 +104,13 @@ django-cachalot = "^2.3.2" django-prometheus = "^2.1.0" django-model-utils = "^4.0.0" bs4 = "^0.0.1" -django-invitations = "^1.9.3" +django-invitations = "^2.0.0" django-cleavejs = "^0.1.0" -django-allauth = "^0.47.0" -django-uwsgi-ng = "^1.1.0" +django-allauth = "^0.52.0" +django-uwsgi-ng = "^2.0" django-extensions = "^3.1.1" ipython = "^8.0.0" -django-oauth-toolkit = "^1.7.0" -django-redis = "^5.0.0" +django-oauth-toolkit = "^2.0.0" django-storages = {version = "^1.11.1", optional = true} boto3 = {version = "^1.17.33", optional = true} django-cleanup = "^6.0.0" @@ -122,10 +118,15 @@ djangorestframework = "^3.12.4" Whoosh = "^2.7.4" django-titofisto = "^0.2.0" haystack-redis = "^0.0.1" -python-gnupg = "^0.4.7" +python-gnupg = "^0.5.0" sentry-sdk = {version = "^1.4.3", optional = true} django-cte = "^1.1.5" pycountry = "^22.0.0" +django-iconify = "^0.3" +customidenticon = "^0.1.5" +graphene-django = "^3.0.0" +selenium = "^4.4.3" +django-vite = "^2.0.2" [tool.poetry.extras] ldap = ["django-auth-ldap"] @@ -133,7 +134,7 @@ s3 = ["boto3", "django-storages"] sentry = ["sentry-sdk"] [tool.poetry.dev-dependencies] -aleksis-builddeps = "^6" +aleksis-builddeps = "*" uwsgi = "^2.0" [tool.poetry.scripts] diff --git a/tox.ini b/tox.ini index 4819e5b95946e3f021429e75c36fe13e7dd61d25..a3ceaee7109ce6df70715bb4c9abc43a1b4c876d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,19 +1,22 @@ [tox] skipsdist = True skip_missing_interpreters = true -envlist = py37,py38,py39 +envlist = py39,py310,py311 [testenv] whitelist_externals = poetry sudo + node skip_install = true envdir = {toxworkdir}/globalenv commands_pre = poetry install -E ldap - poetry run aleksis-admin yarn install + poetry run aleksis-admin vite build poetry run aleksis-admin collectstatic --no-input commands = poetry run pytest --cov=. {posargs} aleksis/ +setenv= + NODE_PATH=cache/node_modules/ [testenv:selenium] setenv = @@ -27,6 +30,8 @@ commands = poetry run black --check --diff aleksis/ poetry run isort -c --diff --stdout aleksis/ poetry run flake8 {posargs} aleksis/ + node cache/node_modules/.bin/prettier --check . + node cache/node_modules/.bin/eslint aleksis/**/*/frontend/**/*.{js,vue} [testenv:security] commands = @@ -46,11 +51,12 @@ commands = poetry run make -C docs/ html {posargs} commands = poetry run isort aleksis/ poetry run black aleksis/ + node cache/node_modules/.bin/prettier --write . [testenv:makemessages] commands = - poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la - poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la + poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru + poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru [flake8] max_line_length = 100